|
|
@@ -612,7 +612,7 @@ PROCEDURE MaskGetBit (VAR mask: ARRAY OF CARDINAL; bit: INTEGER): INTEGER;
|
|
|
PROCEDURE EvalOrdConst (n: AST.Node; VAR v: INTEGER): BOOLEAN;
|
|
|
(* The integer value of a compile-time ordinal expression, matching the
|
|
|
grammar's folding (literals, named CONSTs, unary +/-, + - * DIV MOD). *)
|
|
|
- VAR k: INTEGER; s, cv: QbeGen.QVal; nm: SymTab.Name;
|
|
|
+ VAR k: INTEGER; s, cv: QbeGen.QVal; nm, qnm, al: SymTab.Name;
|
|
|
a, b: INTEGER; isCh: BOOLEAN;
|
|
|
BEGIN
|
|
|
IF n = AST.NoNode THEN RETURN FALSE END;
|
|
|
@@ -631,14 +631,26 @@ PROCEDURE EvalOrdConst (n: AST.Node; VAR v: INTEGER): BOOLEAN;
|
|
|
IF SymTab.StrLen(s) = 3 THEN v := QbeGen.CharVal(s); RETURN TRUE END;
|
|
|
RETURN FALSE
|
|
|
ELSIF k = AST.NkDesignator THEN
|
|
|
- IF (AST.NChild(n) # 1) OR (AST.Kind(AST.Child(n, 0)) # AST.NkIdent) THEN
|
|
|
- RETURN FALSE END;
|
|
|
- Name(AST.Child(n, 0), nm);
|
|
|
- IF SymTab.Equal(nm, "TRUE") THEN v := 1; RETURN TRUE END;
|
|
|
- IF SymTab.Equal(nm, "FALSE") THEN v := 0; RETURN TRUE END;
|
|
|
- IF SymTab.Lookup(nm) AND (SymTab.SymKind(nm) = SymTab.KindConst)
|
|
|
- AND SymTab.GetSymVal(nm, cv) AND QbeGen.IsImm(cv) THEN
|
|
|
- RETURN SymTab.ConstInt(cv, v)
|
|
|
+ IF (AST.NChild(n) = 1) AND (AST.Kind(AST.Child(n, 0)) = AST.NkIdent) THEN
|
|
|
+ Name(AST.Child(n, 0), nm);
|
|
|
+ IF SymTab.Equal(nm, "TRUE") THEN v := 1; RETURN TRUE END;
|
|
|
+ IF SymTab.Equal(nm, "FALSE") THEN v := 0; RETURN TRUE END;
|
|
|
+ IF SymTab.Lookup(nm) AND (SymTab.SymKind(nm) = SymTab.KindConst)
|
|
|
+ AND SymTab.GetSymVal(nm, cv) AND QbeGen.IsImm(cv) THEN
|
|
|
+ RETURN SymTab.ConstInt(cv, v)
|
|
|
+ END;
|
|
|
+ RETURN FALSE
|
|
|
+ ELSIF (AST.NChild(n) = 2) AND (AST.Kind(AST.Child(n, 0)) = AST.NkIdent)
|
|
|
+ AND (AST.Kind(AST.Child(n, 1)) = AST.NkSelector)
|
|
|
+ AND (AST.Op(AST.Child(n, 1)) = AST.SelField) THEN
|
|
|
+ (* M.lit: a module-qualified constant (enum literal / CONST) *)
|
|
|
+ Name(AST.Child(n, 0), nm);
|
|
|
+ Name(AST.Child(AST.Child(n, 1), 0), qnm);
|
|
|
+ IF SymTab.MaterializeAlias(nm, qnm, al)
|
|
|
+ AND SymTab.GetSymVal(al, cv) AND QbeGen.IsImm(cv) THEN
|
|
|
+ RETURN SymTab.ConstInt(cv, v)
|
|
|
+ END;
|
|
|
+ RETURN FALSE
|
|
|
END;
|
|
|
RETURN FALSE
|
|
|
ELSIF k = AST.NkUnary THEN
|
|
|
@@ -2518,7 +2530,7 @@ PROCEDURE EmitCountInits;
|
|
|
END EmitCountInits;
|
|
|
|
|
|
PROCEDURE LowerDecls (seq: AST.Node);
|
|
|
- VAR i, j: CARDINAL; c: AST.Node; nm, txt: SymTab.Name; qv: QbeGen.QVal;
|
|
|
+ VAR i, j: CARDINAL; c: AST.Node; nm, txt, gn: SymTab.Name; qv: QbeGen.QVal;
|
|
|
mg: QbeGen.QVal; uid, depth, np: CARDINAL; res, pt: SymTab.TypeIndex;
|
|
|
ext, pv: BOOLEAN; kk: INTEGER; ct: SymTab.TypeIndex; savedProc: INTEGER;
|
|
|
chunk, vn: AST.Node; pi: INTEGER;
|
|
|
@@ -2564,9 +2576,15 @@ PROCEDURE LowerDecls (seq: AST.Node);
|
|
|
Name(AST.Child(c, 0), nm);
|
|
|
kk := SymTab.ClassOf(AST.Ty(c));
|
|
|
IF kk = SymTab.ClSet THEN
|
|
|
- (* SET CONST: static data from the mask the grammar computed *)
|
|
|
+ (* SET CONST: static data from the mask the grammar computed.
|
|
|
+ A module-level const is emitted under its global name
|
|
|
+ (<unit>_<name>) so a client's qualified reference binds. *)
|
|
|
IF LookupSetMask(nm, mk, mw, mlo) THEN
|
|
|
- QbeGen.PoolSet(mk, mw, qv); SetConstVal(nm, qv)
|
|
|
+ IF SymTab.GlobalRef(nm, gn) THEN
|
|
|
+ QbeGen.PoolSetNamed(gn, mk, mw, qv)
|
|
|
+ ELSE QbeGen.PoolSet(mk, mw, qv)
|
|
|
+ END;
|
|
|
+ SetConstVal(nm, qv)
|
|
|
ELSE SetConstVal(nm, "0")
|
|
|
END
|
|
|
ELSIF (kk = SymTab.ClArray) OR (kk = SymTab.ClRecord)
|