Browse Source

* fixed updating the reference alignment in thlcgllvm.g_set_addr_nonbitpacked_field_ref()

git-svn-id: trunk@34298 -
Jonas Maebe 9 years ago
parent
commit
2f0c3ce8cc
1 changed files with 9 additions and 9 deletions
  1. 9 9
      compiler/llvm/hlcgllvm.pas

+ 9 - 9
compiler/llvm/hlcgllvm.pas

@@ -1416,6 +1416,7 @@ implementation
       subscriptdef,
       subscriptdef,
       currentstructdef,
       currentstructdef,
       llvmfielddef: tdef;
       llvmfielddef: tdef;
+      llvmfield: tllvmshadowsymtableentry;
       newbase: tregister;
       newbase: tregister;
       implicitpointer: boolean;
       implicitpointer: boolean;
     begin
     begin
@@ -1446,29 +1447,28 @@ implementation
           { go to the parent }
           { go to the parent }
           currentstructdef:=parentdef;
           currentstructdef:=parentdef;
         end;
         end;
-      { get the type of the corresponding field in the llvm shadow
-        definition }
-      llvmfielddef:=tabstractrecordsymtable(tabstractrecorddef(currentstructdef).symtable).llvmst[field].def;
+      { get the corresponding field in the llvm shadow symtable }
+      llvmfield:=tabstractrecordsymtable(tabstractrecorddef(currentstructdef).symtable).llvmst[field];
       if implicitpointer then
       if implicitpointer then
         subscriptdef:=currentstructdef
         subscriptdef:=currentstructdef
       else
       else
         subscriptdef:=cpointerdef.getreusable(currentstructdef);
         subscriptdef:=cpointerdef.getreusable(currentstructdef);
       { load the address of that shadow field }
       { load the address of that shadow field }
-      newbase:=getaddressregister(list,cpointerdef.getreusable(llvmfielddef));
+      newbase:=getaddressregister(list,cpointerdef.getreusable(llvmfield.def));
       recref:=make_simple_ref(list,recref,recdef);
       recref:=make_simple_ref(list,recref,recdef);
       list.concat(taillvm.getelementptr_reg_size_ref_size_const(newbase,subscriptdef,recref,s32inttype,field.llvmfieldnr,true));
       list.concat(taillvm.getelementptr_reg_size_ref_size_const(newbase,subscriptdef,recref,s32inttype,field.llvmfieldnr,true));
-      reference_reset_base(recref,subscriptdef,newbase,field.offsetfromllvmfield,newalignment(recref.alignment,field.fieldoffset+field.offsetfromllvmfield));
+      reference_reset_base(recref,subscriptdef,newbase,field.offsetfromllvmfield,newalignment(recref.alignment,llvmfield.fieldoffset+field.offsetfromllvmfield));
       { in case of an 80 bits extended type, typecast from an array of 10
       { in case of an 80 bits extended type, typecast from an array of 10
         bytes (used because otherwise llvm will allocate the ABI-defined
         bytes (used because otherwise llvm will allocate the ABI-defined
         size for extended, which is usually larger) into an extended }
         size for extended, which is usually larger) into an extended }
-      if (llvmfielddef.typ=floatdef) and
-         (tfloatdef(llvmfielddef).floattype=s80real) then
+      if (llvmfield.def.typ=floatdef) and
+         (tfloatdef(llvmfield.def).floattype=s80real) then
         g_ptrtypecast_ref(list,cpointerdef.getreusable(carraydef.getreusable(u8inttype,10)),cpointerdef.getreusable(s80floattype),recref);
         g_ptrtypecast_ref(list,cpointerdef.getreusable(carraydef.getreusable(u8inttype,10)),cpointerdef.getreusable(s80floattype),recref);
       { if it doesn't match the requested field exactly (variant record),
       { if it doesn't match the requested field exactly (variant record),
         adjust the type of the pointer }
         adjust the type of the pointer }
       if (field.offsetfromllvmfield<>0) or
       if (field.offsetfromllvmfield<>0) or
-         (llvmfielddef<>field.vardef) then
-        g_ptrtypecast_ref(list,cpointerdef.getreusable(llvmfielddef),cpointerdef.getreusable(field.vardef),recref);
+         (llvmfield.def<>field.vardef) then
+        g_ptrtypecast_ref(list,cpointerdef.getreusable(llvmfield.def),cpointerdef.getreusable(field.vardef),recref);
     end;
     end;