<<>> <> <> <> <> <> <> <> <> DIRECTORY CirioTypes USING [BitAddr], IO USING [STREAM], PFSNames USING [PATH], Rope USING[ROPE], SystemInterface USING[CirioFile]; ObjectFiles: CEDAR DEFINITIONS = BEGIN <> ROPE: TYPE ~ Rope.ROPE; PATH: TYPE ~ PFSNames.PATH; BitAddr: TYPE ~ CirioTypes.BitAddr; <> <<>> UnreadableObjectFile: ERROR[msg: ROPE]; <> <<>> <> <<>> Parsed: TYPE = REF ParsedBody; ParsedBody: TYPE; CreateParsed: PROC[f: SystemInterface.CirioFile, fs: ROPE _ NIL, targetData: REF ANY _ NIL] RETURNS[Parsed]; <> <> <<>> GetObjectFile: PROC[whole: Parsed] RETURNS[SystemInterface.CirioFile]; <> <<>> GetFormatString: PROC[whole: Parsed] RETURNS[Rope.ROPE]; <> <<>> <> Module: TYPE = REF ModuleBody; ModuleBody: TYPE; <> ModuleInfo: TYPE = RECORD[ whole: Parsed, fileName: PATH, instance: INT]; <> <> GetModule: PROC[info: ModuleInfo] RETURNS[Module]; GetModuleInfo: PROC[Module] RETURNS[REF ModuleInfo]; <> ModuleFromParsedAndPC: PROC [whole: Parsed, spc: FileSegmentPC, moduleRope: ROPE _ NIL] RETURNS [Module]; <> DescribeModule: PROC [Module] RETURNS [ROPE]; <> <> <<>> MemorySegmentId: TYPE ~ RECORD [segName: ROPE, segNum: INT]; <> FileSegmentId: TYPE ~ RECORD [fSegNum: INT, fSegName: ROPE]; <> noMSeg: MemorySegmentId = [NIL, 0]; noFSeg: FileSegmentId = [0, NIL]; SimpleSeg: TYPE ~ {text, data, bss}; simpleMSeg: READONLY ARRAY SimpleSeg OF MemorySegmentId; simpleFSeg: READONLY ARRAY SimpleSeg OF FileSegmentId; VarLoc: TYPE = REF VarLocBody; GlobalVarLoc: TYPE ~ REF fSegment VarLocBody; IndirectVarLoc: TYPE ~ REF indirect VarLocBody; VarLocCase: TYPE ~ {register, frame, frameExtension, fSegment, mSegment, namedCommon, indirect, unknown}; VarLocBody: TYPE = RECORD[ bitSize: CARD, <> where: SELECT case: VarLocCase FROM register => [regNum: CARD], frame => [bitOffset: INT], frameExtension => [bitOffset: INT], <> fSegment => [fSeg: FileSegmentId, bitOffset, fileByteOffset: CARD], <> mSegment => [mSeg: MemorySegmentId, bitOffset, fileByteOffset: CARD], <> namedCommon => [name: ROPE, bitOffset, absBase: CARD, absFound, absValid: BOOL], indirect => [base: VarLoc, offset: BitAddr], unknown => [why: ROPE], ENDCASE]; unspecdBitSize: CARD ~ CARD.LAST; LoadedVarLoc: TYPE ~ RECORD [VarLoc]; <> CGrammar: TYPE ~ {UNKNOWN, SunADotOut, XCOFF, SGIOBJ}; UnreadableDotO: ERROR[msg: Rope.ROPE]; RopeForStabType: PROC [type: StabType] RETURNS[Rope.ROPE]; CNameOfStab: PROC[stab: Stab] RETURNS[rope: Rope.ROPE]; CGrammarOfStab: PROC[stab: Stab] RETURNS[CGrammar]; VarLocFromStab: PUBLIC PROC [stab: Stab] RETURNS [VarLoc _ NIL]; MakeUnknownVarLoc: PROC [why: ROPE] RETURNS [VarLoc]; VersionStampInfo: TYPE = RECORD[ varLoc: GlobalVarLoc, contents: ROPE]; FindVersionStamp: PROC[whole: Module] RETURNS[REF VersionStampInfo]; <> <<>> FindGlobalFrameVar: PROC[whole: Module] RETURNS[GlobalVarLoc]; <> <> <<(At the time of this writing it is not recorded in a recognizable way in the mob, but rather is found by its name in the whole file.)>> <<>> <> ReadInstruction: PROC[module: Module, spc: FileSegmentPC] RETURNS[inst: CARD]; <> <<>> GetSPOffset: PROC[module: Module, spc: FileSegmentPC] RETURNS[INT]; <> <<>> <> <<>> FunHandle: TYPE = REF FunHandleBody; FunHandleBody: TYPE; FunInfo: TYPE = RECORD[stab: Stab, cName: ROPE, pcs: PCRange]; <> GenFuns: PROC[module: Module, for: PROC[FunHandle] RETURNS[--stop-- BOOLEAN]]; GetFunInfo: PROC[fun: FunHandle] RETURNS[FunInfo]; GetFunBrackets: PROC[fun: FunHandle] RETURNS[BracketPair]; <> <> <<>> BracketPair: TYPE = REF BracketPairBody; BracketPairBody: TYPE; <> <> BracketNest: TYPE = LIST OF BracketPair; <> BracketPairKind: TYPE = {syntheticOuter, syntheticFun, actual, nil}; SymbolProc: TYPE = PROC[Stab] RETURNS[--stop-- BOOLEAN]; BracketProc: TYPE = PROC[BracketPair] RETURNS[--stop-- BOOLEAN]; PCRange: TYPE = RECORD[first, limit: CARD]; <= first and < limit.>> GenOtherSymbolStabs: PROC[module: Module, for: SymbolProc]; <> <<>> GenFunBracketPairs: PROC[module: Module, for: BracketProc]; <> <<>> GetOuterBracketPair: PROC[module: Module] RETURNS[BracketPair]; GetFunStab: PROC[bp: BracketPair] RETURNS[Stab]; <> <> <<>> GetFunHandle: PROC[bp: BracketPair] RETURNS[FunHandle]; <> GetFunHandleFromNest: PROC[nest: BracketNest] RETURNS[FunHandle]; GetBracketPairKind: PROC[bp: BracketPair] RETURNS[BracketPairKind]; GetPCRange: PROC[bp: BracketPair] RETURNS[PCRange]; GenSubBracketPairs: PROC[bp: BracketPair, for: BracketProc]; <> <<>> GenSymbolStabs: PROC[bp: BracketPair, for: SymbolProc]; <> GetBracketNestForPC: PROC[module: Module, spc: FileSegmentPC] RETURNS[BracketNest]; <> <> <> <> <<>> GetTypeRef: PROC[module: Module, sourceStream: IO.STREAM] RETURNS [Rope.ROPE]; <<>> <> FileSegmentPC: TYPE ~ RECORD [fSeg: FileSegmentId, relPC: CARD]; <> <<>> NoFileSegmentPC: FileSegmentPC = [fSeg: noFSeg, relPC: 0]; <> GetPCForLineNum: PROC[module: Module, cLineNum: CARD] RETURNS[FileSegmentPC]; <> <<>> GetLineNumForPC: PROC[module: Module, spc: FileSegmentPC] RETURNS[CARD]; <> <<>> <> <<>> Stab: TYPE = REF StabBody; StabBody: TYPE = RECORD[ module: Module, stabX: CARD, stabType: StabType _ Invalid, stabStorClass: StorageClass _ SCInvalid, size: CARD _ 0, --LAST[CARD], value: CARD32, rope: ROPE, index: CARD _ 0, extRef: BOOLEAN _ FALSE, fdIndex: INT32 _ 0 ]; <> <> StabType: TYPE ~ { Invalid, Unspecified, LBrac, RBrac, SLine, Fun, PSym, LSym, RSym, STSym, LCSym, GSym, Main, SO, BIncl, EIncl, Excl, SOL }; StorageClass: TYPE ~ { SCInvalid, SCNil, SCText, SCData, SCBss, SCRegister, SCAbs, SCUnspecified, SCBits, SCInfo, SCRegImage, SCUserStruct, SCSData, SCSBss, SCRData, SCCommon, SCSCommon, SCVerRegister, SCVariant, SCSUndefined }; <> <<>> NameAndNumber: TYPE = RECORD[name: ROPE, char: CHAR, number: INT, trailer: ROPE, valid: BOOLEAN]; <C2CNamingDoc.tioga. The format is . In addition, within a whole file this name is followed by a . The parsing routines return a NameAndNumber to represent all this information.>> <> <> <> <> <> <<>> ParseNameRope: PROC[stab: Stab] RETURNS[NameAndNumber]; <> <<>> <> <<>> RopeForBracketPair: PROC[bp: BracketPair] RETURNS[ROPE]; <> <<>> END..