Bladeren bron

* fixed pointer plus/minus integer on llvm (since a_op_* only gets a single
def, we have to ensure that both arguments have in fact the same type)

git-svn-id: branches/hlcgllvm@30108 -

Jonas Maebe 10 jaren geleden
bovenliggende
commit
511e878606
2 gewijzigde bestanden met toevoegingen van 20 en 2 verwijderingen
  1. 19 1
      compiler/llvm/nllvmadd.pas
  2. 1 1
      compiler/ncgadd.pas

+ 19 - 1
compiler/llvm/nllvmadd.pas

@@ -33,6 +33,7 @@ interface
       tllvmaddnode = class(tcgaddnode)
        public
         function pass_1: tnode; override;
+        procedure force_reg_left_right(allow_swap, allow_constant: boolean); override;
        protected
         procedure second_cmpsmallset; override;
         procedure second_cmpordinal; override;
@@ -48,7 +49,7 @@ implementation
      uses
        verbose,globtype,
        aasmdata,
-       symtype,symdef,defutil,
+       symconst,symtype,symdef,defutil,
        llvmbase,aasmllvm,
        cgbase,cgutils,
        hlcgobj,
@@ -66,6 +67,23 @@ implementation
     end;
 
 
+  procedure tllvmaddnode.force_reg_left_right(allow_swap, allow_constant: boolean);
+    begin
+      inherited;
+      { pointer +/- integer -> make defs the same since a_op_* only gets a
+        single type as argument }
+      if (left.resultdef.typ=pointerdef)<>(right.resultdef.typ=pointerdef) then
+        begin
+          { the result is a pointerdef -> typecast both arguments to pointer;
+            a_op_*_reg will convert them back to integer as needed }
+          if left.resultdef.typ<>pointerdef then
+            hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,resultdef,true);
+          if right.resultdef.typ<>pointerdef then
+            hlcg.location_force_reg(current_asmdata.CurrAsmList,right.location,right.resultdef,resultdef,true);
+        end;
+    end;
+
+
   procedure tllvmaddnode.second_cmpsmallset;
     var
       tmpreg,

+ 1 - 1
compiler/ncgadd.pas

@@ -38,7 +38,7 @@ interface
           { set the register of the result location }
           procedure set_result_location_reg;
           { load left and right nodes into registers }
-          procedure force_reg_left_right(allow_swap,allow_constant:boolean);
+          procedure force_reg_left_right(allow_swap,allow_constant:boolean); virtual;
 
           function cmpnode2topcmp(unsigned: boolean): TOpCmp;