Last modified on Thu May 4 10:54:10 PDT 1995 by kalsow modified on Fri May 28 14:34:04 PDT 1993 by muller modified on Tue Sep 8 11:51:46 PDT 1992 by jdd
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 Byte = [0 .. 255]; (* fits in 8 bits *) Typecode = [0 .. 16_FFFFF]; (* can fit in 20 bits *) Fingerprint = ARRAY [0..7] OF BITS 8 FOR [0..255]; (* 64 bits *) String = UNTRACED REF CHAR; (* a '\000' terminated string *) ModulePtr = UNTRACED REF ModuleInfo; ImportPtr = UNTRACED REF ImportInfo; ProcPtr = UNTRACED REF ProcInfo; Binder = PROCEDURE (mode: INTEGER): ModulePtr; TYPE (* allocated at offset 0 of each compilation unit's global data *) ModuleInfo = RECORD file : String; type_cells : TypeDefn; type_cell_ptrs : TypeLinkPtr; full_rev : RevPtr; partial_rev : RevPtr; proc_info : ProcPtr; try_scopes : ADDRESS; (* RTExStack.Scope *) var_map : ADDRESS; (* RTTypeMap.T *) gc_map : ADDRESS; (* reduced RTTypeMap.T *) imports : ImportPtr; link_state : INTEGER; (* 0=unlinked, 1=linking, 2=linked *) binder : Binder; gc_flags : INTEGER; (* 0=none, 1=gen, 2=inc, 3=both *) END; CONST GC_none = 0; GC_gen = 1; GC_inc = 2; GC_both = 3; TYPE (* one of these is generated for each imported interface reference *) ImportInfo = RECORD import : ModulePtr; binder : Binder; (* returns "import" pointer *) next : ImportPtr; END; TYPE (* one of these is generated for each top-level procedure *) ProcInfo = RECORD proc : ADDRESS; name : String; END; TYPE TypeLinkPtr = UNTRACED REF TypeLink; TypeLink = RECORD defn : TypeDefn; (* initially a pointer to the next TypeLink *) typecode : INTEGER; (* initially the compile-time UID of the type *) END; TYPE RevPtr = UNTRACED REF Revelation; Revelation = RECORD lhs_id, rhs_id: INTEGER; END;------------------------------------------- linker generated type cells ---
TYPE TypeKind = { Unknown, Ref, Obj, Array }; TYPE TypeDefn = UNTRACED REF Typecell; Typecell = RECORD typecode : INTEGER; (*Typecode*) selfID : INTEGER; fp : Fingerprint; traced : Byte; (* == ORD (BOOLEAN) *) kind : Byte; (* == ORD (TypeKind) *) link_state : Byte; dataAlignment : Byte; dataSize : INTEGER; type_map : ADDRESS; (* RTTypeMap.T *) gc_map : ADDRESS; (* reduced RTTypeMap.T for collector *) type_desc : ADDRESS; (* enhanced RTTipe map for new pickles *) initProc : TypeInitProc; (* called by NEW *) brand_ptr : BrandPtr; name : String; next : TypeDefn; END; TYPE (* OBJECT types have this additional goo *) ObjectTypeDefn = UNTRACED REF ObjectTypecell; ObjectTypecell = RECORD common : Typecell; parentID : INTEGER; linkProc : TypeSetupProc; (* called during initialization *) dataOffset : INTEGER; methodOffset : INTEGER; methodSize : INTEGER; defaultMethods : ADDRESS; parent : TypeDefn; END; TYPE (* and REF open array types have this additional goo *) ArrayTypeDefn = UNTRACED REF ArrayTypecell; ArrayTypecell = RECORD common : Typecell; nDimensions : INTEGER; elementSize : INTEGER; 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); TYPE BrandPtr = UNTRACED REF RECORD length : INTEGER; chars : ARRAY [0..16_ffffff (*length-1*)] OF CHAR; END;----------------------------------------- compiler generated references ---
CONST NilTypecode : Typecode = 0; TextLitTypecode : Typecode = 1; AddressTypecode : Typecode = 2; RefanyTypecode : Typecode = 3; RootTypecode : Typecode = 4; UnRootTypecode : Typecode = 5; MutexTypecode : Typecode = 6; FirstUserTypecode : Typecode = 7; CONST (* Type UIDs for the builtin types *) MutexID = 16_1541f475; TextLiteralID = 1837570855 (*16_6d871b27*); (* ARRAY BOOLEAN OF INTEGER { 1837570855 (*16_6d871b27*), 16_72558b22 } [BITSIZE (INTEGER) = 64]; *) CONST SB = BITSIZE (ADDRESS) - 26; (* # 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 *) dirty : BITS 1 FOR BOOLEAN := FALSE; (* used during collection *) gray : BITS 1 FOR BOOLEAN := FALSE; (* used during collection *) 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 .. 63] := 0; (* for future expansion *) 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;------------------------------------------------------- exceptions ---
TYPE ExceptionPtr = UNTRACED REF ExceptionDesc; ExceptionUID = INTEGER; (* == fingerprint of fully qualified name *) ExceptionArg = ADDRESS; (* actually, it's an untyped 4-byte field *) ActivationPtr = UNTRACED REF RaiseActivation; TYPE ExceptionDesc = RECORD uid : ExceptionUID; name : String; implicit : INTEGER; (* == ORD (BOOLEAN) *) END; TYPE RaiseActivation = RECORD exception : ExceptionPtr; arg : ExceptionArg; module : ModulePtr; (* if available, the raising module that called RAISE *) line : INTEGER; (* if available, the source line number of the RAISE *) pc : ADDRESS; (* if available, the PC of the RAISE *) info0 : ADDRESS; (* misc. info *) info1 : ADDRESS; (* misc. info *) un_except : ExceptionPtr; (* the unhandled exception being reported *) un_arg : ExceptionArg; (* the argument to the unhandled exception *) END; END RT0.