-- CTLoad.Mesa, last edit March 10, 1983 11:25 am -- the compile tool loader interface DIRECTORY BcdDefs: TYPE USING [Link, NameRecord, NullLink], BcdOps: TYPE USING [BcdBase, EXPHandle, MTHandle], File: TYPE USING [Capability], IO: TYPE USING[Handle], MiscAlpha: TYPE USING[alpha], Mopcodes: TYPE USING [zMISC], PilotLoaderOps: TYPE USING[FrameList], PilotLoadStateOps: TYPE USING[ConfigIndex, Map], PrincOps: TYPE USING [ControlLink, ControlModule, GFTIndex, GlobalFrameHandle, MaxNGfi, NullControl, NullLink], Rope: TYPE USING[Text], TimeStamp: TYPE USING [Null, Stamp]; CTLoad: DEFINITIONS = { -- this is an Interface Record in the usual parlance -- for procedures, this ControlLink is [procedure[gfi: gfi, ep: ep, tag: TRUE] -- for exported variables this is the absolute address of the variable -- for PROGRAM modules this is a GlobalFramePointer InterfaceSeq: TYPE = REF InterfaceSeqRecord; InterfaceSeqRecord: TYPE = RECORD[ name: Rope.Text ← NIL, -- the interface (module) name bcdVers: TimeStamp.Stamp ← TimeStamp.Null, -- func time stamp resolved: BOOL ← FALSE, -- all clinks have been filled in size: CARDINAL ← 0, body: SEQUENCE maxsize: CARDINAL OF RECORD[ clink: PrincOps.ControlLink ← PrincOps.NullLink, -- the actual link blink: BcdDefs.Link ← BcdDefs.NullLink -- dummy link for exports ] ]; LoadInfoSeq: TYPE = REF LoadInfoSeqRecord; LoadInfoSeqRecord: TYPE = RECORD[ -- if true then this module must be replaced in the load state mustreplace: BOOL ← FALSE, -- if true then all links for these frames are resolved linksresolved: BOOL ← FALSE, -- the control module to start cm: PrincOps.ControlModule ← PrincOps.NullControl, -- the in core bcd bcdbase: BcdOps.BcdBase ← NIL, dummymapseq: DummyMapSeq ← NIL, -- [0 to bcdbase.firstdummy+bcdbase.nDummies) impexpseq: ImpExpSeq ← NIL, -- [0 to bcdbase.nImports) configGfi: PrincOps.GFTIndex ← 0,-- dummy gfi in resulting loaded config map: PilotLoadStateOps.Map ← NIL, -- map for this bcd, not fake config frameList: PilotLoaderOps.FrameList ← NIL, -- ptrs to frames -- this size is the # of modules in this bcd (= bcdbase.nModules) size: CARDINAL ← 0, body: SEQUENCE maxsize: CARDINAL OF LoadRecord ]; LoadRecord: TYPE = RECORD[ frame: PrincOps.GlobalFrameHandle ← NIL, -- the gfh for module framesize: CARDINAL ← 0, -- shadows the mth.framesize ngfi: CARDINAL ← 0 -- shadows the mth.ngfi ]; -- for dummymapseq[0 .. bcdbase.firstdummy) this is -- the real gfi for the module (in a config) -- for dummymapseq[bcdbase.firstdummy .. bcdbase.ndummies + bcdbase.firstdummy) -- this is the index into the ImportTable for the dummy gfi's DummyMapSeq: TYPE = REF DummyMapSeqRecord; DummyMapSeqRecord: TYPE = RECORD[ size: CARDINAL ← 0, body: SEQUENCE maxsize: CARDINAL OF RECORD[ ind: PrincOps.GFTIndex, whichone: [0..PrincOps.MaxNGfi) -- this ranges between 0 and 3 ] ]; -- the ith element of this is the interface record -- associated with the ith import -- import #3 has been matched up with InterfaceRecord impexpseq[3], etc. ImpExpSeq: TYPE = REF ImpExpSeqRecord; ImpExpSeqRecord: TYPE = RECORD[ size: CARDINAL ← 0, body: SEQUENCE maxsize: CARDINAL OF InterfaceSeq ]; ReplaceResult: TYPE = {ok, configNotReplaceable, frameTooBig, ngfiTooBig, cantCopyOldBcd, checkForMRFailed, compilerSaysNo}; InvalidFile: ERROR [File.Capability]; -- raised by LoadGlobalFrames and LoadIncremental LoadGlobalFrames: PROC[cap: File.Capability, config: PilotLoadStateOps.ConfigIndex, oldConfigGfi: PrincOps.GFTIndex, out: IO.Handle] RETURNS[loadinfoseq: CTLoad.LoadInfoSeq, newConfigGfi: PrincOps.GFTIndex]; -- will read in bcd header and map code segments LoadIncremental: PROC[bcdcap: File.Capability, loadinfoseq: LoadInfoSeq, window: IO.Handle] RETURNS[replaceResult: ReplaceResult]; BuildInterface: PROC[loadinfoseq: LoadInfoSeq, eth: BcdOps.EXPHandle] RETURNS[interfaceseq: InterfaceSeq]; BuildFramePtrInterface: PROC[bcdbase: BcdOps.BcdBase, frame: PrincOps.GlobalFrameHandle] RETURNS[interfaceseq: InterfaceSeq]; NSToRope: PROC[bcdbase: BcdOps.BcdBase, name: BcdDefs.NameRecord] RETURNS[resultstr: Rope.Text]; ConvertLink: PROC [bl: BcdDefs.Link] RETURNS [cl: PrincOps.ControlLink]; aLongBlkZ: MiscAlpha.alpha = 102B; Zero: PROC[lp: LONG POINTER, nwords: CARDINAL] RETURNS[LONG POINTER] = MACHINE CODE { Mopcodes.zMISC, aLongBlkZ }; FindVariableLink: PROC[blink: BcdDefs.Link, loadinfoseq: LoadInfoSeq, frame: PrincOps.GlobalFrameHandle, bcdbase: BcdOps.BcdBase] RETURNS[clink: PrincOps.ControlLink]; -- frame link space operations OpenLinkSpace: PROC [frame: PrincOps.GlobalFrameHandle, mth: BcdOps.MTHandle, bcd: BcdOps.BcdBase ← NIL] RETURNS[LONG POINTER]; ReadLink: PROC [offset: CARDINAL] RETURNS [link: PrincOps.ControlLink]; WriteLink: PROC [offset: CARDINAL, link: PrincOps.ControlLink]; CloseLinkSpace: PROC [frame: PrincOps.GlobalFrameHandle]; -- to alloc/ deallocate the structures that some from above -- call these procedures AllocateLoadInfoSeq: PROC[bcdbase: BcdOps.BcdBase] RETURNS[loadinfoseq: LoadInfoSeq]; -- always returns NIL FreeInterfaceSeq: PROC[interfaceseq: InterfaceSeq] RETURNS[InterfaceSeq]; AllocateInterfaceSeq: PROC[name: Rope.Text, size: CARDINAL] RETURNS[interfaceseq: InterfaceSeq]; -- always returns NIL FreeLoadInfoSeq: PROC[loadinfoseq: LoadInfoSeq] RETURNS[LoadInfoSeq]; }.