Browse Source

* fixed reference parsing

peter 25 years ago
parent
commit
4b09b89588
3 changed files with 49 additions and 32 deletions
  1. 5 2
      compiler/ra386att.pas
  2. 31 19
      compiler/ra386int.pas
  3. 13 11
      compiler/rautils.pas

+ 5 - 2
compiler/ra386att.pas

@@ -1229,7 +1229,7 @@ var
          begin
            BuildRecordOffsetSize(expr,toffset,tsize);
            inc(l,toffset);
-           SetSize(tsize);
+           SetSize(tsize,true);
          end;
      end;
     if actasmtoken in [AS_PLUS,AS_MINUS] then
@@ -1994,7 +1994,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.74  2000-04-29 12:51:33  peter
+  Revision 1.75  2000-05-08 13:23:03  peter
+    * fixed reference parsing
+
+  Revision 1.74  2000/04/29 12:51:33  peter
     * fixed offset support intel reader, the gotoffset variable was not
       always reset
     * moved check for local/para to be only used for varsym

+ 31 - 19
compiler/ra386int.pas

@@ -973,8 +973,8 @@ type
 
 Procedure T386IntelOperand.BuildReference;
 var
-  l : longint;
-  hs : string;
+  k,l : longint;
+  tempstr,hs : string;
   code : integer;
   hreg,
   oldbase : tregister;
@@ -1026,20 +1026,30 @@ Begin
                Message(asmr_e_only_add_relocatable_symbol);
              oldbase:=opr.ref.base;
              opr.ref.base:=R_NO;
-             if not SetupVar(actasmpattern,GotOffset) then
-               Message1(sym_e_unknown_id,actasmpattern);
+             tempstr:=actasmpattern;
+             if not SetupVar(tempstr,GotOffset) then
+               Message1(sym_e_unknown_id,tempstr);
+             Consume(AS_ID);
+             { record.field ? }
+             if actasmtoken=AS_DOT then
+              begin
+                BuildRecordOffsetSize(tempstr,l,k);
+                inc(opr.ref.offset,l);
+              end;
              if GotOffset then
-              if hasvar and (opr.ref.base=procinfo^.framepointer) then
-               begin
-                 opr.ref.base:=R_NO;
-                 hasvar:=hadvar;
-               end
-              else
-               begin
-                 if hasvar and hadvar then
-                   Message(asmr_e_cant_have_multiple_relocatable_symbols);
-                 { should we allow ?? }
-               end;
+              begin
+                if hasvar and (opr.ref.base=procinfo^.framepointer) then
+                 begin
+                   opr.ref.base:=R_NO;
+                   hasvar:=hadvar;
+                 end
+                else
+                 begin
+                   if hasvar and hadvar then
+                    Message(asmr_e_cant_have_multiple_relocatable_symbols);
+                   { should we allow ?? }
+                 end;
+              end;
              { is the base register loaded by the var ? }
              if (opr.ref.base<>R_NO) then
               begin
@@ -1067,7 +1077,6 @@ Begin
                 opr.typ:=OPR_REFERENCE;
                 inc(opr.ref.offset,opr.val);
               end;
-             Consume(AS_ID);
            end;
           GotOffset:=false;
         end;
@@ -1266,7 +1275,7 @@ var
          begin
            BuildRecordOffsetSize(expr,toffset,tsize);
            inc(l,toffset);
-           SetSize(tsize);
+           SetSize(tsize,true);
          end;
      end;
     if actasmtoken in [AS_PLUS,AS_MINUS] then
@@ -1816,7 +1825,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.64  2000-04-29 12:51:34  peter
+  Revision 1.65  2000-05-08 13:23:04  peter
+    * fixed reference parsing
+
+  Revision 1.64  2000/04/29 12:51:34  peter
     * fixed offset support intel reader, the gotoffset variable was not
       always reset
     * moved check for local/para to be only used for varsym
@@ -1909,4 +1921,4 @@ end.
     * string constants are now handle correctly and also allowed in
       constant expressions
 
-}
+}

+ 13 - 11
compiler/rautils.pas

@@ -93,7 +93,7 @@ type
     constructor init;
     destructor  done;virtual;
     Procedure BuildOperand;virtual;
-    Procedure SetSize(_size:longint);
+    Procedure SetSize(_size:longint;force:boolean);
     Procedure SetCorrectSize(opcode:tasmop);virtual;
     Function  SetupResult:boolean;
     Function  SetupSelf:boolean;
@@ -663,9 +663,10 @@ Procedure TOperand.SetCorrectSize(opcode:tasmop);
 begin
 end;
 
-Procedure TOperand.SetSize(_size:longint);
+Procedure TOperand.SetSize(_size:longint;force:boolean);
 begin
-  if (size = S_NO) and (_size<=extended_size) then
+  if force or
+     ((size = S_NO) and (_size<=extended_size)) then
    Begin
      case _size of
       1 : size:=S_B;
@@ -854,7 +855,7 @@ Begin
           enumdef,
           pointerdef,
           floatdef :
-            SetSize(pvarsym(sym)^.getsize);
+            SetSize(pvarsym(sym)^.getsize,false);
           arraydef :
             begin
               { for arrays try to get the element size, take care of
@@ -863,7 +864,7 @@ Begin
               while assigned(harrdef^.elementtype.def) and
                     (harrdef^.elementtype.def^.deftype=arraydef) do
                harrdef:=parraydef(harrdef^.elementtype.def);
-              SetSize(harrdef^.elesize);
+              SetSize(harrdef^.elesize,false);
             end;
         end;
         hasvar:=true;
@@ -878,7 +879,7 @@ Begin
           enumdef,
           pointerdef,
           floatdef :
-            SetSize(ptypedconstsym(sym)^.getsize);
+            SetSize(ptypedconstsym(sym)^.getsize,false);
           arraydef :
             begin
               { for arrays try to get the element size, take care of
@@ -887,7 +888,7 @@ Begin
               while assigned(harrdef^.elementtype.def) and
                     (harrdef^.elementtype.def^.deftype=arraydef) do
                harrdef:=parraydef(harrdef^.elementtype.def);
-              SetSize(harrdef^.elesize);
+              SetSize(harrdef^.elesize,false);
             end;
         end;
         hasvar:=true;
@@ -900,7 +901,6 @@ Begin
          begin
            opr.typ:=OPR_CONSTANT;
            opr.val:=pconstsym(sym)^.value;
-           hasvar:=true;
            SetupVar:=true;
            Exit;
          end;
@@ -911,7 +911,6 @@ Begin
          begin
            opr.typ:=OPR_CONSTANT;
            opr.val:=0;
-           hasvar:=true;
            SetupVar:=TRUE;
            Exit;
          end;
@@ -1513,7 +1512,10 @@ end;
 end.
 {
   $Log$
-  Revision 1.40  2000-04-06 07:56:04  pierre
+  Revision 1.41  2000-05-08 13:23:05  peter
+    * fixed reference parsing
+
+  Revision 1.40  2000/04/06 07:56:04  pierre
    * bug in TOperand.SetSize corrected
 
   Revision 1.39  2000/04/04 13:48:45  pierre
@@ -1586,4 +1588,4 @@ end.
   Revision 1.20  1999/07/29 20:54:06  peter
     * write .size also
 
-}
+}