<<>> <> <> <> <> <<>> DIRECTORY IO USING[STREAM], ObjectFiles USING [Module, Parsed], ObjectFilesPrivate USING [PCtoLineNumMap, LineNumToPCMap]; SGI: CEDAR DEFINITIONS = BEGIN WireHeader: TYPE = REF WireHeaderBody; WireHeaderBody: TYPE = MACHINE DEPENDENT RECORD [ magic: CARD16, numSections: CARD16, timeDate: INT32, symPtr: INT32, sizeSymHeader: INT32, sizeOptHdr: CARD16, flags: CARD16 ]; WireAuxHeader: TYPE = REF WireAuxHeaderBody; WireAuxHeaderBody: TYPE = MACHINE DEPENDENT RECORD [ magic: INT16, vStamp: INT16, textSize: INT32, dataSize: INT32, bssSize: INT32, entryPtr: INT32, textBase: INT32, dataBase: INT32, bssBase: INT32, -- SGI specific cpuRegMask: INT32, -- SGI specific fpuRegMask0: INT32, -- SGI specific fpuRegMask1: INT32, -- SGI specific fpuRegMask2: INT32, -- SGI specific fpuRegMask3: INT32, -- SGI specific globalPtr: INT32 -- SGI specific ]; WireSectionHeader: TYPE = REF WireSectionHeaderBody; WireSectionHeaderBody: TYPE = MACHINE DEPENDENT RECORD [ name: PACKED ARRAY [0..7] OF BYTE, pAddr: INT32, -- also num shared libs vAddr: INT32, size: INT32, dataPtr: INT32, relocPtr: INT32, <> <> lnnoPtr: INT32, numRelocEntries: CARD16, <> <> numLnnoEntries: CARD16, flags: INT32 ]; WireSymHeader: TYPE = REF WireSymHeaderBody; WireSymHeaderBody: TYPE = MACHINE DEPENDENT RECORD [ magic: INT16, verstamp: INT16, lineNumIndexLimit: INT32, numBytesPackedLineNums: INT32, packedLineNumPtr: INT32, denseNumIndexLimit: INT32, denseNumPtr: INT32, procDescrIndexLimit: INT32, procDescrPtr: INT32, symIndexLimit: INT32, symPtr: INT32, optSymIndexLimit: INT32, optSymPtr: INT32, auxSymIndexLimit: INT32, auxSymPtr: INT32, symStringIndexLimit: INT32, symStringPtr: INT32, extSymStringIndexLimit: INT32, extSymStringPtr: INT32, fileDescrIndexLimit: INT32, fileDescrPtr: INT32, numRelFileDescr: INT32, relFileDescrPtr: INT32, extSymIndexLimit: INT32, extSymPtr: INT32 ]; WirePackedLineNum: TYPE = REF WirePackedLineNumBody; WirePackedLineNumBody: TYPE = RECORD [PACKED SEQUENCE maxIndex: CARD OF BYTE]; WireProcDescriptor: TYPE = REF WireProcDescriptorBody; WireProcDescriptorBody: TYPE = MACHINE DEPENDENT RECORD [ startAddress: CARD32, isym: INT32, iline: INT32, regmask: INT32, regoffset: INT32, iopt: INT32, fregmask: INT32, fregoffset: INT32, frameoffset: INT32, framereg: INT16, pcreg: INT16, lnLow: INT32, lnHigh: INT32, cbLineOffset: INT32 ]; WireRelFileTable: TYPE = REF WireRelFileTableBody; WireRelFileTableBody: TYPE = MACHINE DEPENDENT RECORD [ index: INT32 ]; WireFileDescriptor: TYPE = REF WireFileDescriptorBody; WireFileDescriptorBody: TYPE = MACHINE DEPENDENT RECORD [ startAddress: CARD32, rss: INT32, issBase: INT32, cbSs: INT32, isymBase: INT32, csym: INT32, ilineBase: INT32, cline: INT32, ioptBase: INT32, copt: INT32, -- unsigned short -- ipdFirst: CARD16, cpd: INT16, iauxBase: INT32, caux: INT32, rfdBase: INT32, crfd: INT32, -- unsigned -- language: [0..31], fMerge: [0..1], fReadin: [0..1], fBigendian: [0..1], glevel: [0..3], reserved: [0..3FFFFFH], cbLineOffset: INT32, cbLine: INT32 ]; WireSTEntry: TYPE = REF WireSTEntryBody; WireSTEntryBody: TYPE = MACHINE DEPENDENT RECORD [ symStringIndex: INT32, value: CARD, symbolType: [0..63], storageClass: [0..31], reserved: [0..1], index: [0..0FFFFFH] ]; WireExtSTEntry: TYPE = REF WireExtSTEntryBody; WireExtSTEntryBody: TYPE = MACHINE DEPENDENT RECORD [ reserved: INT16, fileDescrIndex: INT16, sym: WireSTEntryBody ]; WireTypeInfo: TYPE = REF WireTypeInfoBody; WireTypeInfoBody: TYPE = MACHINE DEPENDENT RECORD [ fBitField(0:0..0):[0..1], continued(0:1..1):[0..1], basicType(0:2..7):[0..63], typeQual4(0:8..11):[0..15], typeQual5(0:12..15):[0..15], typeQual0(0:16..19):[0..15], typeQual1(0:20..23):[0..15], typeQual2(0:24..27):[0..15], typeQual3(0:28..31):[0..15] ]; WireRelIndex: TYPE = REF WireRelIndexBody; WireRelIndexBody: TYPE = MACHINE DEPENDENT RECORD [ relFileDescrIndex(0:0..11):[0..0FFFH], index(0:12..31):[0..0FFFFFH] ]; WireAuxSTEntry: TYPE = REF WireAuxSTEntryBody; WireAuxSTEntryBody: TYPE = MACHINE DEPENDENT RECORD [ SELECT OVERLAID * FROM a => [typeInfo: WireTypeInfoBody], b => [relIndex: WireRelIndexBody], c => [lowIndex: INT32], d => [highIndex: INT32], e => [symIndex: INT32], f => [symStringIndex: INT32], g => [bitWidth: INT32], h => [count: INT32], i => [relFileIndex: INT32], ENDCASE ]; SectionTable: TYPE = REF SectionTableBody; SectionTableBody: TYPE = RECORD [SEQUENCE maxIndex: CARD OF WireSectionHeaderBody]; FileDescrTable: TYPE = REF FileDescrTableBody; FileDescrTableBody: TYPE = RECORD [SEQUENCE maxIndex: CARD OF WireFileDescriptorBody]; RelFileTable: TYPE = REF RelFileTableBody; RelFileTableBody: TYPE = RECORD [SEQUENCE maxIndex: CARD OF WireRelFileTableBody]; ProcDescrTable: TYPE = REF ProcDescrTableBody; ProcDescrTableBody: TYPE = RECORD [SEQUENCE maxIndex: CARD OF WireProcDescriptorBody]; LocalSymTable: TYPE = REF LocalSymTableBody; LocalSymTableBody: TYPE = RECORD [SEQUENCE maxIndex: CARD OF WireSTEntryBody]; IndexedLocalSymTable: TYPE = REF IndexedLocalSymTableBody; IndexedLocalSymTableBody: TYPE = RECORD [SEQUENCE COMPUTED CARD OF WireSTEntryBody]; ExtSymTable: TYPE = REF ExtSymTableBody; ExtSymTableBody: TYPE = RECORD [SEQUENCE maxIndex: CARD OF WireExtSTEntryBody]; AuxSymTable: TYPE = REF AuxSymTableBody; AuxSymTableBody: TYPE = RECORD [SEQUENCE maxIndex: CARD OF WireAuxSTEntryBody]; IndexedAuxSymTable: TYPE = REF IndexedAuxSymTableBody; IndexedAuxSymTableBody: TYPE = RECORD [SEQUENCE COMPUTED CARD OF WireAuxSTEntryBody]; StringTable: TYPE = REF StringTableBody; StringTableBody: TYPE = RECORD [PACKED SEQUENCE maxIndex: CARD OF BYTE]; WireTables: TYPE = REF WireTablesBody; WireTablesBody: TYPE = MACHINE DEPENDENT RECORD [ wHeader: WireHeader, wAuxHeader: WireAuxHeader, wSymHeader: WireSymHeader, fileDescr: FileDescrTable, relFiles: RelFileTable, procDescr: ProcDescrTable, localSyms: LocalSymTable, extSyms: ExtSymTable, auxSyms: AuxSymTable, fdIndex: INT32, localStrings: StringTable, extStrings: StringTable, pcToLineNum: ObjectFilesPrivate.PCtoLineNumMap, lineNumToPC: ObjectFilesPrivate.LineNumToPCMap ]; STNil: BYTE = 0; -- dummy entry STGlobal: BYTE = 1; -- Global (i.e. external) symbol STStatic: BYTE = 2; -- static STParam: BYTE = 3; -- procedure argument STLocal: BYTE = 4; -- local variable STLabel: BYTE = 5; -- label STProc: BYTE = 6; -- begining of procedure STBlock: BYTE = 7; -- beginning of block STEnd: BYTE = 8; -- end (of anything) STMember: BYTE = 9; -- member (of anything - struct/union/enum) STTypeDef: BYTE = 10; -- type definition STFile: BYTE = 11; -- file name STRegReloc: BYTE = 12; -- register relocation STForward: BYTE = 13; -- forwarding address STStaticProc: BYTE = 14; -- load time only static procs STConstant: BYTE = 15; -- const STStaParam: BYTE = 16; -- Fortran static parameters STStruct: BYTE = 26; -- sgi only: begin Struct kind of stBlock STUnion: BYTE = 27; -- sgi only: begin Union kind of stBlock STEnum: BYTE = 28; -- sgi only: begin Enum kind of stBlock STMax: BYTE = 64; TQNil: BYTE = 0; -- bt is what you see ... i.e. no qualifier TQPtr: BYTE = 1; -- pointer TQProc: BYTE = 2; -- procedure TQArray: BYTE = 3; -- duh TQFar: BYTE = 4; -- longer addressing - 8086/8 land TQVol: BYTE = 5; -- volatile TQMax: BYTE = 8; BTNil: BYTE = 0; -- undefined BTAdr: BYTE = 1; -- address - integer same size as pointer BTChar: BYTE = 2; -- character BTUchar: BYTE = 3; -- unsigned character BTShort: BYTE = 4; -- short BTUshort: BYTE = 5; -- unsigned short BTInt: BYTE = 6; -- int BTUint: BYTE = 7; -- unsigned int BTLong: BYTE = 8; -- long BTUlong: BYTE = 9; -- unsigned long BTFloat: BYTE = 10; -- float (real) BTDouble: BYTE = 11; -- Double (real) BTStruct: BYTE = 12; -- Structure (Record) BTUnion: BYTE = 13; -- Union (variant) BTEnum: BYTE = 14; -- Enumerated BTTypedef: BYTE = 15; -- defined via a typedef, isymRef points BTRange: BYTE = 16; -- subrange of int BTSet: BYTE = 17; -- pascal sets BTComplex: BYTE = 18; -- fortran complex BTDcomplex: BYTE = 19; -- fortran double complex BTIndirect: BYTE = 20; -- forward or unnamed typedef BTFixeddec: BYTE = 21; -- Fixed Decimal BTFloatdec: BYTE = 22; -- Float Decimal BTString: BYTE = 23; -- Varying Length Character String BTBit: BYTE = 24; -- Aligned Bit String BTPicture: BYTE = 25; -- Picture BTVoid: BYTE = 26; -- void BTMax: BYTE = 64; SCNIL: BYTE = 0; -- dummy entry SCTEXT: BYTE = 1; -- text symbol SCDATA: BYTE = 2; -- initialized data symbol SCBSS: BYTE = 3; -- un-initialized data symbol SCREGISTER: BYTE = 4; -- value of symbol is register number SCABS: BYTE = 5; -- symbol vlaue is absolute; not to be relocated SCUNDEFINED: BYTE = 6; -- used but not defined in the current module SCBITS: BYTE = 8; -- this is a bit field SCDBX: BYTE = 9; -- dbx internal use SCREGIMAGE: BYTE = 10; -- register value saved on stack SCINFO: BYTE = 11; -- symbol contains debug information SCUSERSTRUCT: BYTE = 12; -- address in struct for current process SCSDATA: BYTE = 13; -- small data SCSBSS: BYTE = 14; -- small common SCRDATA: BYTE = 15; -- read only data SCVAR: BYTE = 16; -- var parameter SCCOMMON: BYTE = 17; -- common variable SCSCOMMON: BYTE = 18; -- small common variable SCVARREGISTER: BYTE = 19; -- var parameter in register SCVARIANT: BYTE = 20; -- variant record SCUNDEFINE: BYTE = 21; -- small undefined IsSameEndianSGI: PROC[stream:IO.STREAM] RETURNS[BOOLEAN]; CalcSymbolSize: PROC [symTabIndex: CARD, fdIndex: INT32, wireTables: WireTables, isExternal: BOOLEAN] RETURNS [CARD]; UnPackLineNumbers: PROC[stream: IO.STREAM, module: ObjectFiles.Module, wireTables: WireTables]; FindMatchingProcDescr: PROC [CARD, ObjectFiles.Parsed] RETURNS [WireProcDescriptorBody, BOOLEAN]; END..