<<>> <> <> <> <> <> <> <> <> <<>> DIRECTORY CCTypes USING[CCError, CCErrorCase], CirioNubAccess USING [Handle, --HandleBody,-- RemoteAddress], CirioTypes USING[CompilerContext], IO USING [PutFR], LoadStateAccess USING [BasicPCInfo, GetLoadedModuleInfoFromStemName, LoadedModuleInfo, LoadStateHandle], NewRMTW USING[CedarModuleSet], ObjectFiles USING [FileSegmentPC, GetLineNumForPC, GetPCForLineNum], PFS USING [nullUniqueID, PATH, PathFromRope, RopeFromPath, UniqueID], RCTW USING [CBreakAddress, RopeList], RMTWPrivate USING [GetNamePartsFromFullPathName, NameParts, SeekCSource], Rope USING[ROPE], SourceFileOpsExtras, SystemInterface; RCTWSchemas: CEDAR PROGRAM IMPORTS CCTypes, IO, LoadStateAccess, ObjectFiles, PFS, RMTWPrivate, SystemInterface EXPORTS RCTW = BEGIN OPEN LSA:LoadStateAccess, ObjF:ObjectFiles; CCError: ERROR[case: CCTypes.CCErrorCase, msg: Rope.ROPE _ NIL] _ CCTypes.CCError; CCE: ERROR[case: CCTypes.CCErrorCase, msg: Rope.ROPE _ NIL] _ CCTypes.CCError; CC: TYPE = CirioTypes.CompilerContext; RemoteAddress: TYPE = CirioNubAccess.RemoteAddress; InvalidRemoteAddress: CirioNubAccess.RemoteAddress _ [NIL, 0, 0, FALSE, FALSE]; <> <<>> GetSourcePosition: PUBLIC PROC [absPC: CARD, cms: NewRMTW.CedarModuleSet, basicInfo: REF LSA.BasicPCInfo, ledo: REF LoadStateAccess.LoadedModuleInfo] RETURNS [SourceFileOpsExtras.Position] ~ { containingDotORelativePC: CARD ~ absPC - ledo.lsi[text].base; cln: CARD ~ ObjF.GetLineNumForPC[ledo.module, [[0, ""], containingDotORelativePC]]; file: SystemInterface.CirioFile ~ RMTWPrivate.SeekCSource[cms, basicInfo, ledo]; RETURN [[ fileName: IF file#NIL THEN file.GetNameOfFile[] ELSE PFS.PathFromRope["I-dont-know-the-filename.c"], uniqueID: IF file#NIL THEN file.GetFileInfo.uniqueID ELSE PFS.nullUniqueID, index: [line: [cln]]]]}; DescribeCBreakAddress: PUBLIC PROC [addr: REF RCTW.CBreakAddress] RETURNS [RCTW.RopeList] ~ { IF addr=NIL THEN RETURN[LIST["failed to set break"]]; {srcName: PFS.PATH ~ SystemInterface.GetNameOfFile[addr.source]; RETURN[LIST[ IO.PutFR["setting break at line %g of %g", [cardinal[addr.givenLineNumber]], [rope[PFS.RopeFromPath[srcName]]] ], IO.PutFR[" module relative pos = %g", [cardinal[addr.moduleRelativePC.relPC]] ], IO.PutFR[" statement begins at line %g", [cardinal[addr.stmtLineNumber]] ], IO.PutFR[" absolute PC = %g", [cardinal[addr.absPC]] ] ]]}}; GetAbsAddressForBreak: PUBLIC PROC [fileSet: SystemInterface.FileSet, src: SystemInterface.CirioFile, loadState: LoadStateAccess.LoadStateHandle, sourceLine: CARD] RETURNS [REF RCTW.CBreakAddress] ~ { lmi: REF LoadStateAccess.LoadedModuleInfo ~ GetLoadedModuleForC[fileSet, src, loadState]; parsedRelativePC: ObjF.FileSegmentPC; IF lmi=NIL THEN RETURN [NIL]; parsedRelativePC _ ObjF.GetPCForLineNum[lmi.module, sourceLine]; RETURN [NEW[RCTW.CBreakAddress _ [ source: src, givenLineNumber: sourceLine, moduleRelativePC: [[0, ""], parsedRelativePC.relPC - lmi.moduleRelativeBaseAddr], <> absPC: lmi.lsi[text].base+parsedRelativePC.relPC, stmtLineNumber: ObjF.GetLineNumForPC[lmi.module, parsedRelativePC], loadedModule: lmi]] ]}; GetLoadedModuleForC: PROC [fileSet: SystemInterface.FileSet, src: SystemInterface.CirioFile, loadState: LoadStateAccess.LoadStateHandle] RETURNS [lmi: REF LoadStateAccess.LoadedModuleInfo _ NIL] ~ { srcName: PFS.PATH _ SystemInterface.GetNameOfFile[src]; parts: RMTWPrivate.NameParts _ RMTWPrivate.GetNamePartsFromFullPathName[srcName]; stemRope: Rope.ROPE _ parts.nameStem; lmi _ LoadStateAccess.GetLoadedModuleInfoFromStemName[loadState, parts.nameStem, 1]; }; END..