SGI.mesa
Copyright Ó 1990, 1991 by Xerox Corporation. All rights reserved.
Adapted from SunADotOut
Jas, January 5, 1993 2:30 pm PST
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,
With Mips lnnoptr actually points to the
global pointer table for this section
lnnoPtr: INT32,
numRelocEntries: CARD16,
With Mips numLnnoEntries actually contains
number of global pointer tables
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..