Selaa lähdekoodia

+ introduce tx86intreader.SetSegmentOverride(); using it everywhere adds more
checks for duplicated segment overrides (which cause a warning in TP mode and
an error in all the other compiler modes)

git-svn-id: trunk@38384 -

nickysn 7 vuotta sitten
vanhempi
commit
c93c15429d
1 muutettua tiedostoa jossa 21 lisäystä ja 13 poistoa
  1. 21 13
      compiler/x86/rax86int.pas

+ 21 - 13
compiler/x86/rax86int.pas

@@ -30,6 +30,7 @@ Unit Rax86int;
       cpubase,
       globtype,
       aasmbase,
+      cgbase,
       rasm,
       rax86;
 
@@ -64,6 +65,7 @@ Unit Rax86int;
          function consume(t : tasmtoken):boolean;
          procedure RecoverConsume(allowcomma:boolean);
          procedure AddReferences(dest,src : tx86operand);
+         procedure SetSegmentOverride(oper:tx86operand;seg:tregister);
          procedure BuildRecordOffsetSize(const expr: string;out offset:tcgint;out size:tcgint; out mangledname: string; needvmtofs: boolean; out hastypecast: boolean);
          procedure BuildConstSymbolExpression(needofs,isref,startingminus:boolean;out value:tcgint;out asmsym:string;out asmsymtyp:TAsmsymtype;out size:tcgint;out isseg,is_farproc_entry,hasofs:boolean);
          function BuildConstExpression:aint;
@@ -102,7 +104,7 @@ Unit Rax86int;
        { register allocator }
        rautils,itx86int,
        { codegen }
-       cgbase,procinfo,paramgr
+       procinfo,paramgr
        ;
 
     type
@@ -831,16 +833,7 @@ Unit Rax86int;
         AddRegister(src.opr.ref.base,1);
         AddRegister(src.opr.ref.index,src.opr.ref.scalefactor);
         if src.opr.ref.segment<>NR_NO then
-          begin
-            if dest.opr.ref.segment<>NR_NO then
-              begin
-                if m_tp7 in current_settings.modeswitches then
-                  Message(asmr_w_multiple_segment_overrides)
-                else
-                  Message(asmr_e_multiple_segment_overrides);
-              end;
-            dest.opr.ref.segment:=src.opr.ref.segment;
-          end;
+          SetSegmentOverride(dest,src.opr.ref.segment);
         Inc(dest.opr.ref.offset,src.opr.ref.offset);
         Inc(dest.opr.constoffset,src.opr.constoffset);
         dest.haslabelref:=dest.haslabelref or src.haslabelref;
@@ -863,6 +856,21 @@ Unit Rax86int;
       end;
 
 
+    procedure tx86intreader.SetSegmentOverride(oper:tx86operand;seg:tregister);
+      begin
+        if oper.opr.typ<>OPR_REFERENCE then
+          internalerror(2018022801);
+        if oper.opr.ref.segment<>NR_NO then
+          begin
+            if m_tp7 in current_settings.modeswitches then
+              Message(asmr_w_multiple_segment_overrides)
+            else
+              Message(asmr_e_multiple_segment_overrides);
+          end;
+        oper.opr.ref.segment:=seg;
+      end;
+
+
     { This routine builds up a record offset after a AS_DOT
       token is encountered.
       On entry actasmtoken should be equal to AS_DOT                     }
@@ -1612,7 +1620,7 @@ Unit Rax86int;
                   begin
                     Consume(AS_COLON);
                     oper.InitRefConvertLocal;
-                    oper.opr.ref.segment:=hreg;
+                    SetSegmentOverride(oper,hreg);
                   end
                 else
                   begin
@@ -2176,7 +2184,7 @@ Unit Rax86int;
                  Begin
                    Consume(AS_COLON);
                    oper.InitRef;
-                   oper.opr.ref.segment:=tempreg;
+                   SetSegmentOverride(oper,tempreg);
                    BuildReference(oper);
                  end
                 else