mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 03:46:10 +02:00
* since extended values are represented as "array[1..10] of byte" in records
for llvm in order to ensure that it doesn't allocate the ABI-specified size, we have to convert the resulting pointer to an array of 10 bytes into a pointer to extended when we subscript the record (like is already done for arrays) git-svn-id: trunk@30720 -
This commit is contained in:
parent
b9138a1c90
commit
03a3136525
@ -88,15 +88,17 @@ implementation
|
|||||||
newbase:=hlcg.getaddressregister(current_asmdata.CurrAsmList,getpointerdef(llvmfielddef));
|
newbase:=hlcg.getaddressregister(current_asmdata.CurrAsmList,getpointerdef(llvmfielddef));
|
||||||
current_asmdata.CurrAsmList.concat(taillvm.getelementptr_reg_size_ref_size_const(newbase,getpointerdef(left.resultdef),location.reference,s32inttype,vs.llvmfieldnr,true));
|
current_asmdata.CurrAsmList.concat(taillvm.getelementptr_reg_size_ref_size_const(newbase,getpointerdef(left.resultdef),location.reference,s32inttype,vs.llvmfieldnr,true));
|
||||||
reference_reset_base(location.reference,newbase,vs.offsetfromllvmfield,newalignment(location.reference.alignment,vs.fieldoffset));
|
reference_reset_base(location.reference,newbase,vs.offsetfromllvmfield,newalignment(location.reference.alignment,vs.fieldoffset));
|
||||||
|
{ in case of an 80 bits extended type, typecast from an array of 10
|
||||||
|
bytes (used because otherwise llvm will allocate the ABI-defined
|
||||||
|
size for extended, which is usually larger) into an extended }
|
||||||
|
if (llvmfielddef.typ=floatdef) and
|
||||||
|
(tfloatdef(llvmfielddef).floattype=s80real) then
|
||||||
|
hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,getpointerdef(getarraydef(u8inttype,10)),getpointerdef(s80floattype),location.reference);
|
||||||
{ 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 (vs.offsetfromllvmfield<>0) or
|
if (vs.offsetfromllvmfield<>0) or
|
||||||
(llvmfielddef<>resultdef) then
|
(llvmfielddef<>resultdef) then
|
||||||
begin
|
hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,getpointerdef(llvmfielddef),getpointerdef(resultdef),location.reference);
|
||||||
newbase:=hlcg.getaddressregister(current_asmdata.CurrAsmList,getpointerdef(resultdef));
|
|
||||||
hlcg.a_load_reg_reg(current_asmdata.CurrAsmList,getpointerdef(llvmfielddef),getpointerdef(resultdef),location.reference.base,newbase);
|
|
||||||
location.reference.base:=newbase;
|
|
||||||
end;
|
|
||||||
location.size:=def_cgsize(resultdef);
|
location.size:=def_cgsize(resultdef);
|
||||||
result:=true;
|
result:=true;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user