Copyright (C) 1994, Digital Equipment Corp.RT0 is
the bottom of the world
. It contains
types and constants that are shared by multiple modules of
the runtime and/or the compiler and linker.
If you're using this interface, you're a wizard!
This interface and its implemenation MUST NOT import any other interface.
INTERFACEThese types CANNOT be changed without a synchronized change to the output of the compiler and prelinkerRT0 ;
------------------------------------ compiler generated data structures ---
TYPE Typecode = [0 .. 16_FFFFF]; (* can fit in 20 bits *) Fingerprint = ARRAY [0..1] OF [-16_7fffffff-1 .. 16_7fffffff]; (* 64 bits *) String = UNTRACED REF CHAR; (* a '\000' terminated string *) ModulePtr = UNTRACED REF ModuleInfo; ProcPtr = UNTRACED REF ProcInfo; TYPE (* allocated at offset 0 of each compilation unit's global data *) ModuleInfo = RECORD file : String; type_cells : ADDRESS; (* initially a ref to a Typecell *) type_cell_ptrs : ADDRESS; (* initially a ref to a TypeLink *) full_rev : ADDRESS; (* initially a ref to a Revelation *) partial_rev : ADDRESS; (* initially a ref to a Revelation *) proc_info : ProcPtr; try_scopes : ADDRESS; (* RTExRep.Scope *) var_map : ADDRESS; (* RTTypeMap.T *) gc_map : ADDRESS; (* reduced RTTypeMap.T *) link : PROCEDURE (); main : PROCEDURE (); END; TYPE (* one of these is generated for each top-level procedure *) ProcInfo = RECORD proc : ADDRESS; name : String; export : ADDRESS; END; TYPE TypeLink = RECORD next : ADDRESS; (* init code patches this to be a TypeDefn *) type : INTEGER; (* init code patches this to be a Typecode *) END; TYPE RevPtr = UNTRACED REF Revelation; Revelation = RECORD lhs_id, rhs_id: INTEGER; END;------------------------------------------- linker generated type cells ---
TYPE MethodSuite = UNTRACED REF RECORD typecode : INTEGER; (* Typecode *) methods : (* ARRAY [0..n] OF *) ADDRESS; END; TYPE TypeDefn = UNTRACED REF Typecell; Typecell = RECORD typecode : INTEGER; (*Typecode*) lastSubTypeTC : INTEGER; (*Typecode*) selfID : INTEGER; fp : Fingerprint; traced : INTEGER; (* 0=>untraced, 1=>traced *) dataOffset : INTEGER; dataSize : INTEGER; dataAlignment : INTEGER; methodOffset : INTEGER; methodSize : INTEGER; nDimensions : INTEGER; (* > 0 iff open array *) elementSize : INTEGER; defaultMethods : ADDRESS; (* # NIL iff object type *) type_map : ADDRESS; (* RTTypeMap.T *) gc_map : ADDRESS; (* reduced RTTypeMap.T for collector *) type_desc : ADDRESS; initProc : TypeInitProc; (* called by NEW *) linkProc : TypeSetupProc; (* called during initialization *) parentID : INTEGER; parent : TypeDefn; children : TypeDefn; sibling : TypeDefn; brand : String; name : String; next : TypeDefn; END;
dataOffset: for object types, the quantity to add to the address of the object to get to the fields that belong to this object type; for refs, unused; for open arrays, the quantity to add to the address of the array to get to the elements dataSize: for object types, the size of the fields that belong to this type; for refs, the size of the referent; for open array types, the size of the
open overhead
, including padding to align the elements; i.e. ADR (a[0]) - ADR (a) dataAlignment: for object types, the alignment of the referent; for refs, the alignment of the referent; for open arrays, the alignment of the full array, including the header
TYPE TypeInitProc = PROCEDURE (ref: ADDRESS); TypeSetupProc = PROCEDURE (def: TypeDefn);----------------------------------------- compiler generated references ---
CONST NilTypecode : Typecode = 0; TextTypecode : Typecode = 1; CONST SB = BITSIZE (ADDRESS) - 24; (* # spare bits in a ref header *) TYPE RefHeader = RECORD forwarded : BITS 1 FOR BOOLEAN := FALSE; (* used during collection *) typecode : BITS 20 FOR Typecode := 0; (* the typecode *) weak : BITS 1 FOR BOOLEAN := FALSE; (* any weakrefs? *) marka : BITS 1 FOR BOOLEAN := FALSE; (* used during collection *) markb : BITS 1 FOR BOOLEAN := FALSE; (* used during collection *) spare : BITS SB FOR [0 .. 255] := 0; (* for future expansion *) END; TYPE (* header for compiler generated TEXT literals (1-D open array of char)*) TextHeader = RECORD chars : String; length : INTEGER; END;--------------------------------- compiler generated procedure closures ---
CONST ClosureMarker = -1; TYPE ProcedureClosure = RECORD marker : INTEGER; (* == -1 *) proc : ADDRESS; (* address of a nested procedure's body *) frame : ADDRESS; (* its parent's frame pointer *) END; END RT0.