|
@@ -1021,10 +1021,11 @@ PROCEDURE LowerDesign (n: AST.Node; VAR t: SymTab.TypeIndex; VAR k: INTEGER;
|
|
|
VAR sfx: BOOLEAN);
|
|
VAR sfx: BOOLEAN);
|
|
|
(* Base ident then selectors (mirrors the grammar's Design). Leaves the
|
|
(* Base ident then selectors (mirrors the grammar's Design). Leaves the
|
|
|
address in q with sfx=TRUE for selectors; base vars/consts load. *)
|
|
address in q with sfx=TRUE for selectors; base vars/consts load. *)
|
|
|
- VAR nm, fn, mal: SymTab.Name; cv: QbeGen.QVal; cls, op: INTEGER;
|
|
|
|
|
|
|
+ VAR nm, fn, mal: SymTab.Name; cv, qa: QbeGen.QVal; cls, op: INTEGER;
|
|
|
i: CARDINAL; sel: AST.Node; eT, it: SymTab.TypeIndex;
|
|
i: CARDINAL; sel: AST.Node; eT, it: SymTab.TypeIndex;
|
|
|
iq, ql, qlo, qhi, qe: QbeGen.QVal;
|
|
iq, ql, qlo, qhi, qe: QbeGen.QVal;
|
|
|
lo, hi, fo: INTEGER; isOpen, viewMode: BOOLEAN;
|
|
lo, hi, fo: INTEGER; isOpen, viewMode: BOOLEAN;
|
|
|
|
|
+ absAddr: LONGINT;
|
|
|
BEGIN
|
|
BEGIN
|
|
|
IF AST.Kind(AST.Child(n, 0)) = AST.NkCall THEN
|
|
IF AST.Kind(AST.Child(n, 0)) = AST.NkCall THEN
|
|
|
(* a call result used as a designator base: P()^, P()^.field,
|
|
(* a call result used as a designator base: P()^, P()^.field,
|
|
@@ -1086,7 +1087,13 @@ PROCEDURE LowerDesign (n: AST.Node; VAR t: SymTab.TypeIndex; VAR k: INTEGER;
|
|
|
END
|
|
END
|
|
|
ELSIF (k = SymTab.KindVar) OR (k = SymTab.KindParam) THEN
|
|
ELSIF (k = SymTab.KindVar) OR (k = SymTab.KindParam) THEN
|
|
|
cls := SymTab.ClassOf(t);
|
|
cls := SymTab.ClassOf(t);
|
|
|
- IF AST.Op(n) = 1 THEN
|
|
|
|
|
|
|
+ IF SymTab.GetSymAbs(nm, absAddr) THEN
|
|
|
|
|
+ (* absolute variable: materialize the fixed address as a value *)
|
|
|
|
|
+ QbeGen.IntStr(VAL(INTEGER, absAddr), qa);
|
|
|
|
|
+ QbeGen.NewTemp(q);
|
|
|
|
|
+ QbeGen.Op3L("add", q, qa, "0");
|
|
|
|
|
+ sfx := TRUE
|
|
|
|
|
+ ELSIF AST.Op(n) = 1 THEN
|
|
|
(* a forward module-level reference: the grammar's FwdAddrOper
|
|
(* a forward module-level reference: the grammar's FwdAddrOper
|
|
|
leaves an address (sfx=TRUE), not a loaded value *)
|
|
leaves an address (sfx=TRUE), not a loaded value *)
|
|
|
QbeGen.AddrOf(nm, q); sfx := TRUE
|
|
QbeGen.AddrOf(nm, q); sfx := TRUE
|
|
@@ -2962,6 +2969,7 @@ PROCEDURE EmitVarNames (c: AST.Node);
|
|
|
(* Emit DeclVar for each name of an NkVarDecl; the names are a chunked
|
|
(* Emit DeclVar for each name of an NkVarDecl; the names are a chunked
|
|
|
sequence (AstAppend), so follow NkBlock continuations. *)
|
|
sequence (AstAppend), so follow NkBlock continuations. *)
|
|
|
VAR j: CARDINAL; chunk, vn: AST.Node; nm: SymTab.Name;
|
|
VAR j: CARDINAL; chunk, vn: AST.Node; nm: SymTab.Name;
|
|
|
|
|
+ absAddr: LONGINT;
|
|
|
BEGIN
|
|
BEGIN
|
|
|
chunk := c;
|
|
chunk := c;
|
|
|
WHILE chunk # AST.NoNode DO
|
|
WHILE chunk # AST.NoNode DO
|
|
@@ -2970,8 +2978,11 @@ PROCEDURE EmitVarNames (c: AST.Node);
|
|
|
vn := AST.Child(chunk, j);
|
|
vn := AST.Child(chunk, j);
|
|
|
IF AST.Kind(vn) = AST.NkIdent THEN
|
|
IF AST.Kind(vn) = AST.NkIdent THEN
|
|
|
Name(vn, nm);
|
|
Name(vn, nm);
|
|
|
- QbeGen.DeclVar(nm, AST.Ty(c));
|
|
|
|
|
- IF (NOT QbeGen.InFunction())
|
|
|
|
|
|
|
+ IF NOT SymTab.GetSymAbs(nm, absAddr) THEN
|
|
|
|
|
+ QbeGen.DeclVar(nm, AST.Ty(c))
|
|
|
|
|
+ END;
|
|
|
|
|
+ IF (NOT SymTab.GetSymAbs(nm, absAddr))
|
|
|
|
|
+ AND (NOT QbeGen.InFunction())
|
|
|
AND (SymTab.ClassOf(AST.Ty(c)) = SymTab.ClArray)
|
|
AND (SymTab.ClassOf(AST.Ty(c)) = SymTab.ClArray)
|
|
|
AND QbeGen.RecArrayNeedsInit(SymTab.ArrayLen(AST.Ty(c)),
|
|
AND QbeGen.RecArrayNeedsInit(SymTab.ArrayLen(AST.Ty(c)),
|
|
|
AST.Ty(c))
|
|
AST.Ty(c))
|