-- file P4.Mesa
-- last modified by Satterthwaite, 29-Jan-82 11:31:15

DIRECTORY
  Alloc: TYPE USING [Notifier],
  BcdDefs: TYPE USING [GFTIndex, Link],
  Inline: TYPE USING [BITAND],
  LiteralOps: TYPE USING [ValueDescriptor],
  Literals: TYPE USING [LitDescriptor],
  Symbols: TYPE,
  Tree: TYPE USING [Index, Link, Map, NodeName, Scan];

P4: DEFINITIONS IMPORTS Inline = {
  OPEN Symbols;

  Mark: BOOLEAN = FALSE;

  OwnGfi: BcdDefs.GFTIndex = 1;

 -- representations (interim)

  Repr: TYPE = [none..all];
    signed: CARDINAL = 1;
    unsigned: CARDINAL = 2;
    long: CARDINAL = 4;
    other: CARDINAL = 8;

    none: CARDINAL = 0;
    both: CARDINAL = signed+unsigned;
    all: CARDINAL = other+long+both;

  CommonRep: PROC [Repr, Repr] RETURNS [Repr] = LOOPHOLE[Inline.BITAND];

 -- register counts

  RegCount: TYPE = [0..256);
  MaxRegs: RegCount = LAST[RegCount];

 -- notifiers

  BCDNotify, DeclNotify, LayoutNotify, StmtNotify: Alloc.Notifier;
  OpsNotify, ExpANotify, ExpBNotify, ExpCNotify: Alloc.Notifier;

 -- exported by Pass4B

  AssignImports: Tree.Scan;
  InitBCD: PROC [Tree.Link, UNCOUNTED ZONE];
  FinishBCD: Tree.Scan;
  MakeEPLink: PROC [ep: CARDINAL, gfi: BcdDefs.GFTIndex] RETURNS [BcdDefs.Link];
  MatchBCD: PROC RETURNS [BOOLEAN];
  ProcessDirectory: Tree.Scan;
  ProcessExports: Tree.Map;
  ProcessImports: Tree.Scan;
  ProcessSymLiterals: PROC;

 -- exported by Pass4D

  BiasForType: PROC [CSEIndex] RETURNS [INTEGER];
  CanonicalType: PROC [CSEIndex] RETURNS [CSEIndex];
  ComparableType: PROC [CSEIndex] RETURNS [BOOLEAN];
  DeclItem: Tree.Scan;
  DeclUpdate: Tree.Map;
  DefaultBasicOps: PROC [SEIndex, CARDINAL] RETURNS [BOOLEAN];
  RepForType: PROC [CSEIndex] RETURNS [Repr];
  SparseRep: PROC [CSEIndex] RETURNS [BOOLEAN];
  TypeExp: PROC [typeExp: Tree.Link, body, indirect: BOOLEAN ← FALSE];
  TypeForTree: PROC [Tree.Link] RETURNS [SEIndex];
  WordsForType: PROC [CSEIndex] RETURNS [CARDINAL];

  VarInit: SIGNAL RETURNS [BOOLEAN];

 -- exported by Pass4L

  AssignEntries: PROC [BTIndex];
  BitsForType: PROC [SEIndex] RETURNS [CARDINAL];
  CheckBlock: PROC [BTIndex];
  CheckFields: PROC [RecordSEIndex, CARDINAL];
  LayoutArgs: PROC [RecordSEIndex, CARDINAL, BOOLEAN] RETURNS [CARDINAL];
  LayoutBlock: PROC [BTIndex, CARDINAL] RETURNS [CARDINAL];
  LayoutFields: PROC [RecordSEIndex, CARDINAL];
  LayoutGlobals: PROC [bti: CBTIndex, stopping, fragments: BOOLEAN] RETURNS [CARDINAL];
  LayoutInterface: PROC [CBTIndex] RETURNS [CARDINAL];
  LayoutLocals: PROC [CBTIndex] RETURNS [CARDINAL];

 -- exported by Pass4S

  currentLevel: ContextLevel;
  checked: BOOLEAN;

  BindCase: PROC [
      Tree.Index, Tree.NodeName, PROC [Tree.Link, INTEGER] RETURNS [Tree.Link]]
    RETURNS [Tree.Link];
  BindType: PROC [Tree.Index, Tree.Map] RETURNS [Tree.Link];
  Body: PROC [CBTIndex];
  CaseDriver: PROC [Tree.Index, Tree.Map, INTEGER] RETURNS [Tree.Link];
  CatchNest: PROC [Tree.Link];
  MarkString: PROC [local: BOOLEAN ← TRUE];
  Subst: PROC [Tree.Index] RETURNS [Tree.Link];

 -- exported by Pass4Ops

  RelOp: TYPE = Tree.NodeName [relE .. relLE];

  FoldExpr: PROC [Tree.Index, Repr] RETURNS [Tree.Link];
  IntervalTest: PROC [l,r: Tree.Link, rep: Repr] RETURNS [BOOLEAN];
  IntToReal: PROC [Tree.Index] RETURNS [Tree.Link];
  LiteralRep: PROC [Tree.Link, Repr] RETURNS [Repr];
  LongToShort: PROC [Tree.Index, Repr] RETURNS [Tree.Link];
  MakeTreeLiteral: PROC [WORD] RETURNS [Tree.Link];
  RelTest: PROC [l,r: Tree.Link, op: RelOp, rep: Repr] RETURNS [BOOLEAN];
  ShortToLong: PROC [Tree.Index, Repr] RETURNS [Tree.Link];
  TreeLiteralDesc: PROC [Tree.Link] RETURNS [Literals.LitDescriptor];
  TreeLiteralValue: PROC [Tree.Link] RETURNS [WORD];
  ZeroP: PROC [Tree.Link] RETURNS [BOOLEAN];

 -- exported by Pass4Xa

  Covering: TYPE = {none, partial, full};

  All: PROC [Tree.Index] RETURNS [Tree.Link];
  Assignment: PROC [Tree.Index] RETURNS [Tree.Link];
  Call: PROC [Tree.Index] RETURNS [Tree.Link];
  CheckRange: PROC [Tree.Link, CARDINAL, CSEIndex] RETURNS [Tree.Link];
  Construct: PROC [node: Tree.Index, nested: BOOLEAN ← FALSE] RETURNS [Tree.Link];
  Cover: PROC [lType: CSEIndex, lRep: Repr, rType: CSEIndex, rRep: Repr]
    RETURNS [Covering];
  Dollar: PROC [Tree.Index] RETURNS [Tree.Link];
  Extract: PROC [Tree.Index] RETURNS [Tree.Link];
  Index: PROC [Tree.Index] RETURNS [Tree.Link];
  MakeArgRecord: PROC [RecordSEIndex, Tree.Link] RETURNS [Tree.Link];
  Narrow: PROC [Tree.Index] RETURNS [Tree.Link];
  New: PROC [Tree.Index] RETURNS [Tree.Link];
  PadRecord: PROC [t: Tree.Link, lType: CSEIndex] RETURNS [Tree.Link];
  RewriteAssign: PROC [Tree.Index, CSEIndex] RETURNS [Tree.Link];
  Reloc: PROC [Tree.Index] RETURNS [Tree.Link];
  Rhs: PROC [exp: Tree.Link, lType: CSEIndex, voidOK: BOOLEAN ← FALSE]
    RETURNS [Tree.Link];
  RowConstruct: PROC [Tree.Index] RETURNS [Tree.Link];
  SeqIndex: PROC [Tree.Index] RETURNS [Tree.Link];
  Union: PROC [node: Tree.Index, nested: BOOLEAN ← FALSE] RETURNS [Tree.Link];

 -- exported by Pass4Xb

  ExpInit: PROC [UNCOUNTED ZONE];
  ExpReset: PROC;

  AdjustBias: PROC [Tree.Link, INTEGER] RETURNS [Tree.Link];
  BoolValue: PROC [t: Tree.Link] RETURNS [Tree.Link] = INLINE {
    RETURN [RValue[t, 0, unsigned]]};
  ComputeIndexRegs: PROC [Tree.Index] RETURNS [RegCount];
  Exp: PROC [Tree.Link, Repr] RETURNS [Tree.Link];
  FillMultiWord: PROC [
    words: LiteralOps.ValueDescriptor, origin: CARDINAL, t: Tree.Link];
  ForceType: PROC [Tree.Link, CSEIndex] RETURNS [Tree.Link];
  MakeStructuredLiteral: PROC [val: WORD, type: CSEIndex] RETURNS [Tree.Link];
  NeutralExp: Tree.Map;
  OperandType: PROC [Tree.Link] RETURNS [CSEIndex];
  RegsForType: PROC [CSEIndex] RETURNS [RegCount];
  RValue: PROC [exp: Tree.Link, bias: INTEGER, target: Repr] RETURNS [Tree.Link];
  StructuredLiteral: PROC [Tree.Link] RETURNS [BOOLEAN];
  TreeLiteral: PROC [Tree.Link] RETURNS [BOOLEAN];
  VBias: PROC RETURNS [INTEGER];
  VPop: PROC;
  VPush: PROC [bias: INTEGER, rep: Repr, nRegs: RegCount];
  VRegs: PROC RETURNS [RegCount];
  VRep: PROC RETURNS [Repr];

 -- exported by Pass4Xc

  AddrOp: PROC [Tree.Index] RETURNS [Tree.Link];
  ConstantInterval: PROC [Tree.Index] RETURNS [origin, range: INTEGER];
  Interval: PROC [Tree.Index, INTEGER, Repr] RETURNS [const: BOOLEAN];
  NormalizeRange: PROC [Tree.Link] RETURNS [Tree.Link];
  MiscXfer: PROC [Tree.Index] RETURNS [Tree.Link];
  TypeOp: PROC [Tree.Index] RETURNS [Tree.Link];

  EmptyInterval: SIGNAL;

  }.