rsc | a84cbb2 | 2004-04-19 19:29:25 +0000 | [diff] [blame] | 1 | stabs |
| 2 | |
| 3 | N_MAIN with name "main" to identify entry function |
| 4 | N_SO source file. might be preceded by dir ending in / |
| 5 | value is code ptr |
| 6 | empty string means source done |
| 7 | N_SOL source include file, value = text addr of where this starts |
| 8 | N_SLINE start of source line |
| 9 | no name |
| 10 | desc = line number |
| 11 | value = code addr for that line |
| 12 | |
| 13 | N_FUN (36) function def |
| 14 | 'F' global 'f' local |
| 15 | value = addr |
| 16 | desc = line number of def |
| 17 | return type is number after : |
| 18 | |
| 19 | nil name marks end of function |
| 20 | |
| 21 | constants |
| 22 | |
| 23 | c= XXX p. 15 |
| 24 | |
| 25 | N_LSYM (128) local variable |
| 26 | :type-number |
| 27 | value = offset from fp |
| 28 | :ptype means parameter passed in reg but stored as variable |
| 29 | |
| 30 | N_GSYM (32) global variable |
| 31 | addr not given (use external symbol) |
| 32 | :type |
| 33 | |
| 34 | N_RSYM register value |
| 35 | |
| 36 | N_STSYM(38)/N_FUN/N_LCSYM(40) data/text/bss |
| 37 | static varibale 'S' file static 'V' procedure static |
| 38 | :Stype :Vtype |
| 39 | |
| 40 | N_PSYM (160) parameter |
| 41 | :ptype |
| 42 | value=offset from fp |
| 43 | desc = line number of decl |
| 44 | |
| 45 | register params followed by an N_RSYM with same name and :rtype. |
| 46 | |
| 47 | skip types |
| 48 | |
| 49 | type (a,b) means a=file number b=type number |
| 50 | |
| 51 | N_BINCL/N_EINCL begin/end include |
| 52 | N_EXCL - same effect as earlier guy |
| 53 | |
| 54 | |
| 55 | |
| 56 | ============= |
| 57 | |
| 58 | type crap |
| 59 | |
| 60 | |
| 61 | |
| 62 | name:symbol_opt typeinfo |
| 63 | |
| 64 | typeinfo ::= typenum | typenum = attr* typedef |
| 65 | |
| 66 | typenum ::= integer | '(' integer ',' integer ')' |
| 67 | |
| 68 | attr ::= @ attrtext ; |
| 69 | |
| 70 | attrtext ::= 'a' integer (alignment) |
| 71 | | 'p' integer (pointer class) |
| 72 | | 'P' (packed type) |
| 73 | | 's' integer (size of type in bits) |
| 74 | | 'S' (string instead of array of chars) |
| 75 | |
| 76 | typedef ::= typeinfo |
| 77 | | 'b' ('u' | 's') 'c'? width; offset; nbits; (builtin, signed/unsigned, char/not, width in bytes, offset & nbits of type) |
| 78 | | 'w' (aix wide char type, not used) |
| 79 | | 'R' fptype; bytes; (fptype 1=32-bit, 2=64-bit, 3=complex, 4=complex16, 5=complex32, 6=long double) |
| 80 | | 'g' typeinfo ';' nbits (aix floating, not used) |
| 81 | | 'c' typeinfo ';' nbits (aix complex, not used) |
| 82 | | -1 int32 |
| 83 | | -2 char8 |
| 84 | | -3 int16 |
| 85 | | -4 int32 (long) |
| 86 | | -5 uchar8 |
| 87 | | -6 schar8 |
| 88 | | -7 uint16 |
| 89 | | -8 uint32 |
| 90 | | -9 uint32 |
| 91 | | -10 ulong32 |
| 92 | | -11 void |
| 93 | | -12 float |
| 94 | | -13 double |
| 95 | | -14 long double |
| 96 | | -15 int32 |
| 97 | | -16 bool32 |
| 98 | | -17 short real |
| 99 | | -18 real |
| 100 | | -19 stringptr |
| 101 | | -20 character8 |
| 102 | | -21 logical*1 8 |
| 103 | | -22 logical*2 16 |
| 104 | | -23 logical*4 32 |
| 105 | | -24 logical 32 |
| 106 | | -25 complex (two single) |
| 107 | | -26 complex (two double) |
| 108 | | -27 integer*1 8 signed |
| 109 | | -28 integer*2 16 signed |
| 110 | | -29 integer*4 32 signed |
| 111 | | -30 wchar 16 wide char |
| 112 | | -31 int64 |
| 113 | | -32 uint64 |
| 114 | | -33 logical*8 64 |
| 115 | | -34 integer*8 64 signed |
| 116 | | 'b' typeinfo ';' bytes (ibm, no idea) |
| 117 | | 'B' typeinfo (volatile typref) |
| 118 | | 'd' typeinfo (file of typeref) |
| 119 | | 'k' typeinfo (const typeref) |
| 120 | | 'M' typeinfo ';' length (multiple instance type, fortran) |
| 121 | | 'S' typeinfo (set, typeref must have small number of values) |
| 122 | | '*' typeinfo (pointer to typeref) |
| 123 | | 'x' ('s'|'u'|'e') name ':' (struct, union, enum reference. name can have '::' in it) |
| 124 | | 'r' typeinfo ';' low ';' high ';' (subrange. typeref can be type being defined for base types!) |
| 125 | low and high are bounds |
| 126 | if bound is octal power of two, it's a big negative number |
| 127 | | ('a'|'P') indextypedef arraytypeinfo (array, index should be range type) |
| 128 | indextype is type definition not typeinfo (need not say typenum=) |
| 129 | P means packed array |
| 130 | | 'A' arraytypeinfo (open array (no index bounds)) |
| 131 | | 'D' dims ';' typeinfo (dims-dimensional dynamic array) |
| 132 | | 'E' dims ';' typeinfo (subarray of N-dimensional array) |
| 133 | | 'n' typeinfo ';' bytes (max length string) |
| 134 | | 'z' typeinfo ';' bytes (no idea what difference is from 'n') |
| 135 | | 'N' (pascal stringptr) |
| 136 | | 'e' (name ':' bigint ',')* ';' (enum listing) |
| 137 | | ('s'|'u') bytes (name ':' type ',' bitoffset ',' bitsize ';')* ';' (struct/union defn) |
| 138 | tag is given as name in stabs entry, with 'T' symbol |
| 139 | | 'f' typeinfo ';' (function returning type) |
| 140 | | 'f' rettypeinfo ',' paramcount ';' (typeinfo ',' (0|1) ';')* ';' |
| 141 | | 'p' paramcount ';' (typeinfo ',' (0|1) ';')* ';' |
| 142 | | 'F' rettypeinfo ',' paramcount ';' (name ':' typeinfo ',' (0|1) ';')* ';' |
| 143 | | 'R' paramcount ';' (name ':' typeinfo ',' (0|1) ';')* ';' |
| 144 | (the 0 or 1 is pass-by-reference vs pass-by-value) |
| 145 | (the 0 or 1 is pass-by-reference vs pass-by-value) |
| 146 | |
| 147 | bound ::= |
| 148 | 'A' offset (bound is on stack by ref at offset offset from arg list) |
| 149 | | 'T' offset (bound is on stack by val at offset offset from arg list) |
| 150 | | 'a' regnum (bound passed by reference in register) |
| 151 | | 't' regnum (bound passed by value in register) |
| 152 | | 'J' (no bound) |
| 153 | | bigint |
| 154 | |
| 155 | bigint ::= '-'? decimal |
| 156 | | 0 octal |
| 157 | | -1 |
| 158 | |
| 159 | C++ |
| 160 | |
| 161 | symbol 'Tt' means typename + tag in one stab |
| 162 | |
| 163 | names can have ::, as in foo::bar::baz::t1 |
| 164 | |
| 165 | t16 unknown type just like void |
| 166 | t17 vtable record type |