mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 17:49:27 +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));
|
||||
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));
|
||||
{ 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),
|
||||
adjust the type of the pointer }
|
||||
if (vs.offsetfromllvmfield<>0) or
|
||||
(llvmfielddef<>resultdef) then
|
||||
begin
|
||||
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;
|
||||
hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,getpointerdef(llvmfielddef),getpointerdef(resultdef),location.reference);
|
||||
location.size:=def_cgsize(resultdef);
|
||||
result:=true;
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user