Browse Source

* 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 -

Jonas Maebe 10 years ago
parent
commit
03a3136525
1 changed files with 7 additions and 5 deletions
  1. 7 5
      compiler/llvm/nllvmmem.pas

+ 7 - 5
compiler/llvm/nllvmmem.pas

@@ -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;