* explicitly name the fields we add in llvmgettemprecorddef()

* use those field names when loading their addresses in
    thlcgllvm.a_load_ref_cgpara()/gen_load_cgpara_loc(), instead of
    assuming the field indices in the llvm representation of those
    records matches the parameter location order (it currently does
    because we let llvm lay out C-packed records, but that will
    change)

git-svn-id: trunk@32713 -
This commit is contained in:
Jonas Maebe 2015-12-25 21:05:17 +00:00
parent 5774238887
commit f57a94b5aa
2 changed files with 11 additions and 18 deletions

View File

@ -189,16 +189,13 @@ implementation
procedure thlcgllvm.a_load_ref_cgpara(list: TAsmList; size: tdef; const r: treference; const cgpara: TCGPara);
var
tmpref, initialref, ref: treference;
fielddef,
orgsize: tdef;
tmpreg: tregister;
hloc: tlocation;
location: pcgparalocation;
orgsizeleft,
sizeleft,
totaloffset: asizeint;
paralocidx: longint;
userecord,
reghasvalue: boolean;
userecord: boolean;
begin
location:=cgpara.location;
sizeleft:=cgpara.intsize;
@ -213,12 +210,10 @@ implementation
begin
if userecord then
begin
{ llvmparadef is a record in this case, with every field corresponding
to a single paraloc }
paraloctoloc(location,hloc);
tmpreg:=getaddressregister(list,cpointerdef.getreusable(location^.def));
list.concat(taillvm.getelementptr_reg_size_ref_size_const(tmpreg,cpointerdef.getreusable(size),initialref,s32inttype,paralocidx,true));
reference_reset_base(tmpref,cpointerdef.getreusable(location^.def),tmpreg,0,newalignment(initialref.alignment,totaloffset));
{ llvmparadef is a record in this case, with every field
corresponding to a single paraloc (fielddef is unused, because
it will be equivalent to location^.def -- see below) }
g_setup_load_field_by_name(list,trecorddef(size),'F'+tostr(paralocidx),initialref,tmpref,fielddef);
end
else
tmpref:=initialref;
@ -1446,6 +1441,7 @@ implementation
hloc : tlocation;
href, href2 : treference;
hreg : tregister;
fielddef,
llvmparadef : tdef;
index : longint;
offset : pint;
@ -1479,15 +1475,11 @@ implementation
reference_reset_base(href,cpointerdef.getreusable(llvmparadef),hreg,0,destloc.reference.alignment);
end;
index:=0;
offset:=0;
ploc:=para.location;
repeat
paraloctoloc(ploc,hloc);
hreg:=getaddressregister(list,cpointerdef.getreusable(ploc^.def));
list.concat(taillvm.getelementptr_reg_size_ref_size_const(hreg,cpointerdef.getreusable(llvmparadef),href,s32inttype,index,true));
reference_reset_base(href2,cpointerdef.getreusable(ploc^.def),hreg,0,newalignment(href.alignment,offset));
a_load_loc_ref(list,ploc^.def,ploc^.def,hloc,href2);
inc(offset,ploc^.def.size);
g_setup_load_field_by_name(list,trecorddef(llvmparadef),'F'+tostr(index),href,href2,fielddef);
a_load_loc_ref(list,ploc^.def,fielddef,hloc,href2);
inc(index);
ploc:=ploc^.next;
until not assigned(ploc);

View File

@ -787,7 +787,8 @@ implementation
begin
res^.Data:=crecorddef.create_global_internal(typename,packrecords,
recordalignmin,maxcrecordalign);
trecorddef(res^.Data).add_fields_from_deflist(fieldtypes);
for i:=0 to fieldtypes.count-1 do
trecorddef(res^.Data).add_field_by_def('F'+tostr(i),tdef(fieldtypes[i]));
end;
trecordsymtable(trecorddef(res^.Data).symtable).addalignmentpadding;
result:=trecorddef(res^.Data);