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

git-svn-id: trunk@34298 -
This commit is contained in:
Jonas Maebe 2016-08-13 14:47:31 +00:00
parent ade1d811b0
commit 2f0c3ce8cc

View File

@ -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 { get the corresponding field in the llvm shadow symtable }
definition } llvmfield:=tabstractrecordsymtable(tabstractrecorddef(currentstructdef).symtable).llvmst[field];
llvmfielddef:=tabstractrecordsymtable(tabstractrecorddef(currentstructdef).symtable).llvmst[field].def;
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 if (llvmfield.def.typ=floatdef) and
(tfloatdef(llvmfielddef).floattype=s80real) then (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 (llvmfield.def<>field.vardef) then
g_ptrtypecast_ref(list,cpointerdef.getreusable(llvmfielddef),cpointerdef.getreusable(field.vardef),recref); g_ptrtypecast_ref(list,cpointerdef.getreusable(llvmfield.def),cpointerdef.getreusable(field.vardef),recref);
end; end;