stabs

N_MAIN with name "main" to identify entry function
N_SO source file.  might be preceded by dir ending in /
	value is code ptr
	empty string means source done
N_SOL source include file, value = text addr of where this starts
N_SLINE start of source line
	no name
	desc = line number
	value = code addr for that line

N_FUN (36) function def
	'F' global 'f' local
	value = addr
	desc = line number of def
	return type is number after :

	nil name marks end of function

constants

	c= XXX p. 15

N_LSYM (128) local variable
	:type-number
	value = offset from fp
	:ptype means parameter passed in reg but stored as variable

N_GSYM (32) global variable
	addr not given (use external symbol)
	:type

N_RSYM register value

N_STSYM(38)/N_FUN/N_LCSYM(40) data/text/bss
	static varibale 'S' file static 'V' procedure static
	:Stype :Vtype

N_PSYM (160) parameter 
	:ptype
	value=offset from fp
	desc = line number of decl

	register params followed by an N_RSYM with same name and :rtype.

skip types

type (a,b) means a=file number b=type number

N_BINCL/N_EINCL begin/end include
N_EXCL - same effect as earlier guy



=============

type crap



	name:symbol_opt typeinfo

typeinfo ::= typenum | typenum = attr* typedef

typenum ::= integer | '(' integer ',' integer ')'

attr ::= @ attrtext ;

attrtext ::= 'a' integer 	(alignment)
	| 'p' integer	(pointer class)
	| 'P'	(packed type)
	| 's' integer	(size of type in bits)
	| 'S' 	(string instead of array of chars)

typedef ::= typeinfo
	| 'b' ('u' | 's') 'c'? width; offset; nbits; 		(builtin, signed/unsigned, char/not, width in bytes, offset & nbits of type)
	| 'w'		(aix wide char type, not used)
	| 'R' fptype; bytes;			(fptype 1=32-bit, 2=64-bit, 3=complex, 4=complex16, 5=complex32, 6=long double)
	| 'g' typeinfo ';' nbits 		(aix floating, not used)
	| 'c' typeinfo ';' nbits		(aix complex, not used)
	| -1		int32
	| -2		char8
	| -3		int16
	| -4		int32 (long)
	| -5		uchar8
	| -6		schar8
	| -7		uint16
	| -8		uint32
	| -9		uint32
	| -10		ulong32
	| -11		void
	| -12		float
	| -13		double
	| -14		long double
	| -15		int32
	| -16		bool32
	| -17		short real
	| -18		real
	| -19		stringptr
	| -20		character8
	| -21		logical*1 8
	| -22		logical*2 16
	| -23		logical*4 32
	| -24		logical 32
	| -25		complex (two single)
	| -26		complex (two double)
	| -27		integer*1 8 signed
	| -28		integer*2 16 signed
	| -29		integer*4 32 signed
	| -30		wchar 16 wide char
	| -31		int64
	| -32		uint64
	| -33		logical*8 64
	| -34		integer*8 64 signed
	| 'b' typeinfo ';' bytes		(ibm, no idea)
	| 'B' typeinfo		(volatile typref)
	| 'd' typeinfo		(file of typeref)
	| 'k' typeinfo		(const typeref)
	| 'M' typeinfo ';' length		(multiple instance type, fortran)
	| 'S' typeinfo		(set, typeref must have small number of values)
	| '*' typeinfo		(pointer to typeref)
	| 'x' ('s'|'u'|'e') name ':'	(struct, union, enum reference.  name can have '::' in it)
	| 'r' typeinfo ';' low ';' high ';'		(subrange.  typeref can be type being defined for base types!)
			low and high are bounds
			if bound is octal power of two, it's a big negative number
	| ('a'|'P') indextypedef arraytypeinfo 	(array, index should be range type)
				indextype is type definition not typeinfo (need not say typenum=)
				P means packed array
	| 'A' arraytypeinfo		(open array (no index bounds))
	| 'D' dims ';' typeinfo		(dims-dimensional dynamic array)
	| 'E' dims ';' typeinfo		(subarray of N-dimensional array)
	| 'n' typeinfo ';' bytes		(max length string)
	| 'z' typeinfo ';' bytes		(no idea what difference is from 'n')
	| 'N'					(pascal stringptr)
	| 'e' (name ':' bigint ',')* ';'	(enum listing)
	| ('s'|'u') bytes (name ':' type ',' bitoffset ',' bitsize ';')* ';'		(struct/union defn)
						tag is given as name in stabs entry, with 'T' symbol
	| 'f' typeinfo ';' 			(function returning type)
	| 'f' rettypeinfo ',' paramcount ';' (typeinfo ',' (0|1) ';')* ';'
	| 'p' paramcount ';' (typeinfo ',' (0|1) ';')* ';'
	| 'F' rettypeinfo ',' paramcount ';' (name ':' typeinfo ',' (0|1) ';')* ';'
	| 'R' paramcount ';' (name ':' typeinfo ',' (0|1) ';')* ';'
						(the 0 or 1 is pass-by-reference vs pass-by-value)
						(the 0 or 1 is pass-by-reference vs pass-by-value)

bound ::= 
	'A' offset			(bound is on stack by ref at offset offset from arg list)
	| 'T' offset			(bound is on stack by val at offset offset from arg list)
	| 'a' regnum		(bound passed by reference in register)
	| 't' regnum		(bound passed by value in register)
	| 'J'				(no bound)
	| bigint

bigint ::= '-'? decimal
	| 0 octal
	| -1

C++

symbol 'Tt' means typename + tag in one stab

names can have ::, as in foo::bar::baz::t1

t16 unknown type just like void
t17 vtable record type
