-- file codedefs.mesa -- last modified by Sweet, November 15, 1979 12:48 PM DIRECTORY AltoDefs: FROM "altodefs" USING [BYTE, wordlength], ControlDefs: FROM "controldefs" USING [ControlLink, MaxFrameSize], Literals: FROM "literals" USING [LTIndex, STIndex], Symbols: FROM "symbols" USING [BTIndex, ContextLevel, HTIndex, ISEIndex, ISENull, lZ, RecordSEIndex], SymbolSegment: FROM "symbolsegment" USING [ByteIndex], Table: FROM "table" USING [Base, Limit, Notifier]; CodeDefs: DEFINITIONS = BEGIN OPEN Literals, Symbols; Lexeme: TYPE = RECORD [ lexvalue: SELECT lextag: * FROM literal => [ SELECT littag: * FROM word => [lexlti: LTIndex], string => [lexsti: STIndex], ENDCASE], se => [lexsei: ISEIndex], bdo => [lexbdoi: VarIndex], stack => [lexsti: StackIndex], ENDCASE]; NullLex: se Lexeme = Lexeme[se[Symbols.ISENull]]; MoveDirection: TYPE = {load, store}; VarSpace: TYPE = {faddr, frame, frameup, caddr, code, link, linkup, stack, const, pdesc}; VarTag: TYPE = {o, bo, bdo, ind}; VarComponent: TYPE = RECORD [ wSize: CARDINAL ← 0 | NULL, bSize: [0..AltoDefs.wordlength) ← 0 | NULL, space: SELECT tag: VarSpace FROM frame => [ immutable: BOOLEAN ← FALSE, level: ContextLevel ← lZ, wd: CARDINAL ← 0, bd: [0..AltoDefs.wordlength) ← 0], code => [wd: CARDINAL ← 0, bd: [0..AltoDefs.wordlength) ← 0], faddr => [wd: CARDINAL, level: ContextLevel], frameup => [ level: ContextLevel ← lZ, pwSize: [1..2] ← 1, immutable: BOOLEAN ← FALSE, wd: CARDINAL ← 0, delta: [0..ControlDefs.MaxFrameSize) ← 0], caddr, link => [wd: CARDINAL], linkup => [ wd: CARDINAL, delta: [0..ControlDefs.MaxFrameSize) ← 0], stack => [ bd: [0..AltoDefs.wordlength) ← 0, wd: CARDINAL ← 0, sti: StackIndex], const => [bd: [0..AltoDefs.wordlength) ← 0, d1, d2: UNSPECIFIED ← NULL], pdesc => [desc: ControlDefs.ControlLink], -- unrelocated control link ENDCASE]; VarItem: TYPE = RECORD [ -- not many of these around at any given time free: BOOLEAN ← FALSE, -- required by allocator body: SELECT tag: VarTag FROM o => [var: VarComponent], bo => [offset, base: VarComponent], bdo => [offset, base, disp: VarComponent], ind => [ offset, base, index: VarComponent, simple: BOOLEAN, packinfo: SELECT packtag: * FROM packed => [grain: [1..AltoDefs.wordlength)], notPacked => [eWords: [0..ControlDefs.MaxFrameSize)], ENDCASE], ENDCASE]; VarIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO VarItem; OVarIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO o VarItem; BoVarIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO bo VarItem; BdoVarIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO bdo VarItem; IndVarIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO ind VarItem; VarNull: VarIndex = LOOPHOLE[Table.Limit-1]; RelativePC: TYPE = [0..77777B]; CCInfoType: TYPE = {generating, binding, coding}; CodeChunkType: TYPE = {code, label, jump, other}; CCItem: TYPE = RECORD [ free: BOOLEAN, pad: [0..1], -- this is NOT a fill field flink, blink: CCIndex, ccvalue: SELECT cctag: CodeChunkType FROM code => [ realinst, minimalStack: BOOLEAN, inst: AltoDefs.BYTE, aligned: BOOLEAN, isize: [0..3], fill: [0..7B], sourcefileindex: SymbolSegment.ByteIndex, parameters: ARRAY [1..1) OF WORD], label => [ labelseen: BOOLEAN, labelinfo: SELECT OVERLAID CCInfoType FROM generating => [filltoword, jumplist: JumpCCIndex], binding => [minPC, maxPC: RelativePC], coding => [filltoword, pc: RelativePC], ENDCASE], jump => [ jsize: [0..7], jtype: JumpType, jparam: AltoDefs.BYTE, fixedup, completed: BOOLEAN, destlabel: LabelCCIndex, forward: BOOLEAN, jumpinfo: SELECT OVERLAID CCInfoType FROM generating => [filltoword, thread: JumpCCIndex], binding => [minPC, maxPC: RelativePC], coding => [filltoword, pc: RelativePC], ENDCASE], other => [obody: SELECT otag: * FROM table => [ btab: BOOLEAN, tablecodebytes: [0..7], taboffset: INTEGER], startbody, endbody => [ index: BTIndex], source => [index: SymbolSegment.ByteIndex], ENDCASE], ENDCASE]; NULLfileindex: SymbolSegment.ByteIndex = 177777B; CCIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO CCItem; CCNull: CCIndex = LOOPHOLE[Table.Limit-1]; JumpCCIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO jump CCItem; JumpCCNull: JumpCCIndex = LOOPHOLE[Table.Limit-1]; LabelCCIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO label CCItem; LabelCCNull: LabelCCIndex = LOOPHOLE[Table.Limit-1]; CodeCCIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO code CCItem; CodeCCNull: CodeCCIndex = LOOPHOLE[Table.Limit-1]; OtherCCIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO other CCItem; TableCCIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO table other CCItem; TableCCNull: TableCCIndex = LOOPHOLE[Table.Limit-1]; CompareClass: TYPE = {word, byte}; JumpType: TYPE = {JumpE, JumpN, JumpL, JumpGE, JumpG, JumpLE, UJumpL, UJumpGE, UJumpG, UJumpLE, ZJumpE, ZJumpN, Jump, JumpA, JumpC, JumpCA, JumpRet, NILJumpE, NILJumpN, PAIRJumpL, PAIRJumpG, BYTEJumpE, BYTEJumpN, BITJumpE, BITJumpN}; EXLabelRecord: TYPE = RECORD [ free: BOOLEAN, thread: EXLRIndex, labelcc: CARDINAL, labelhti: HTIndex, labelcci: LabelCCIndex]; EXLRIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO EXLabelRecord; EXLRNull: EXLRIndex = LOOPHOLE[Table.Limit-1]; StackIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO StackItem; StackNull: StackIndex = LAST[StackIndex]; StackItem: TYPE = RECORD [ free: BOOLEAN ← FALSE, uplink, downlink: StackIndex ← StackNull, data: SELECT tag:* FROM mark => [label: LabelCCIndex], onStack => [ alsoLink: BOOLEAN ← FALSE, tLevel: Symbols.ContextLevel ← lZ, tOffset: TempAddr ← NULL], inTemp => [ tLevel: Symbols.ContextLevel, tOffset: TempAddr], inLink => [link: AltoDefs.BYTE], ENDCASE]; -- if alsoTemp for onStack element, it has been previously dumped -- by the stack machinery into the given temp. StackPos: TYPE = [0..EvalStackSize); StackLocRec: TYPE = RECORD [SELECT tag:* FROM onStack => [depth: CARDINAL], inTemp => [ tSize: TempSize, tLevel: Symbols.ContextLevel, tOffset: TempAddr], inLink => [link: [0..256)], mixed => NULL, ENDCASE]; -- StackLocRec semantics: -- obtained by lr: StackLocRec ← Stack.Loc[s, count]; -- -- Tag Meaning -- -- onStack The "count" words are all on the stack. -- There are "depth" words above them in the model -- inTemp The "count" words are in contiguous temporaries -- inLink "count" = 1 and value is in link "link" -- mixed None of the above EvalStackSize: INTEGER = 8; MaxParmsInStack: INTEGER = EvalStackSize-3; TempAddr: TYPE = [0..ControlDefs.MaxFrameSize); TempSize: TYPE = [0..ControlDefs.MaxFrameSize); TempStateRecord: TYPE = RECORD[ pendtemplist, templist, heaplist: ISEIndex, tempctxlvl: ContextLevel, tempstart, framesz: INTEGER]; CaseCVState: TYPE = {single, singleLoaded, multi, none}; ConsDestination: TYPE = RECORD [ bd: [0..AltoDefs.wordlength) ← NULL, bSize: [0..AltoDefs.wordlength) ← NULL, inFrame: BOOLEAN ← FALSE, -- can store directly into frame fLevel: Symbols.ContextLevel ← NULL, pLength: [1..2] ← 1, ignoreSafen: BOOLEAN ← FALSE, fOffset: CARDINAL ← NULL, -- offset of first word of record pLoaded: BOOLEAN ← FALSE, -- pointer already on virtual stack pSti: StackIndex ← NULL, -- the sti of the pointer if pLoaded pDelta: INTEGER ← 0, -- word offset into record of pointer pLink: BOOLEAN ← FALSE, -- pointer also in a link pLevel: Symbols.ContextLevel ← lZ, -- if not lZ, then ptr is in temp pOffset: TempAddr ← NULL, -- frame offset of temp or link remaining: CARDINAL ← 0, wSize: CARDINAL ← NULL ]; StatementStateRecord: TYPE = RECORD [ retLabel, comRetLabel: LabelCCIndex, outRecord: RecordSEIndex, pendtemplist: ISEIndex, stkPtr: UNSPECIFIED, inlineFileIndex: SymbolSegment.ByteIndex]; ChunkIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit); AddressNotify, AJumpsNotify, CallsNotify, CgenUtilNotify, ConstructorNotify, CrossJumpNotify, DJumpsNotify, DriverNotify, ExpressionNotify, FinalNotify, FlowNotify, FlowExpressionNotify, OutCodeNotify, PeepholeNotify, StackImplNotify, StatementNotify, StoreNotify, TempNotify, VarBasicsNotify, VarMoveNotify, VarUtilsNotify: Table.Notifier; Address, AJumps, Calls, CgenUtil, Constructor, CrossJump, DJumps, Driver, Expression, Final, Flow, FlowExpression, OpTable, OutCode, PeepholeQ, PeepholeU, PeepholeZ, StackImpl, Statement, Store, Temp, VarBasics, VarMove, VarUtils: PROGRAM; END..