From 1284032765bdedce628ea94844bf7c7c9cc302a3 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Sat, 21 Nov 2015 12:36:55 +0000 Subject: [PATCH] + llvm blockaddress() intrinsic (supported as of LLVM 3.5.1) git-svn-id: trunk@32409 - --- compiler/llvm/aasmllvm.pas | 23 +++++++++++++++++++++++ compiler/llvm/agllvm.pas | 10 ++++++++++ compiler/llvm/itllvm.pas | 1 + compiler/llvm/llvmbase.pas | 1 + 4 files changed, 35 insertions(+) diff --git a/compiler/llvm/aasmllvm.pas b/compiler/llvm/aasmllvm.pas index 1d44bffa69..6e1657c861 100644 --- a/compiler/llvm/aasmllvm.pas +++ b/compiler/llvm/aasmllvm.pas @@ -101,6 +101,8 @@ interface constructor getelementptr_reg_size_ref_size_const(dst:tregister;ptrsize:tdef;const ref:treference;indextype:tdef;index1:ptrint;indirect:boolean); constructor getelementptr_reg_tai_size_const(dst:tregister;const ai:tai;indextype:tdef;index1:ptrint;indirect:boolean); + constructor blockaddress(dstreg: tregister; fun, lab: tasmsymbol); + { e.g. dst = call retsize name (paras) } constructor call_size_name_paras(callpd: tdef; dst: tregister;retsize: tdef;name:tasmsymbol;paras: tfplist); { e.g. dst = call retsize reg (paras) } @@ -462,6 +464,12 @@ uses else result:=operand_read; end; + la_blockaddress: + case opnr of + 0: result:=operand_write + else + result:=operand_read; + end else internalerror(2013103101) end; @@ -578,6 +586,12 @@ uses internalerror(2013110110); end; end; + la_blockaddress: + case opnr of + 0: result:=voidcodepointertype + else + internalerror(2015111904); + end else internalerror(2013103101) end; @@ -923,6 +937,15 @@ uses loadconst(index+1,index1); end; + constructor taillvm.blockaddress(dstreg: tregister; fun, lab: tasmsymbol); + begin + create_llvm(la_blockaddress); + ops:=3; + loadreg(0,dstreg); + loadsymbol(1,fun,0); + loadsymbol(2,lab,0); + end; + constructor taillvm.call_size_name_paras(callpd: tdef; dst: tregister; retsize: tdef; name:tasmsymbol; paras: tfplist); begin diff --git a/compiler/llvm/agllvm.pas b/compiler/llvm/agllvm.pas index 1d4cd3a537..09f52e0847 100644 --- a/compiler/llvm/agllvm.pas +++ b/compiler/llvm/agllvm.pas @@ -419,6 +419,16 @@ implementation sep:=' '; opstart:=2; end; + la_blockaddress: + begin + owner.writer.AsmWrite(getopstr(taillvm(hp).oper[0]^,false)); + owner.writer.AsmWrite(' = blockaddress('); + owner.writer.AsmWrite(getopstr(taillvm(hp).oper[1]^,false)); + owner.writer.AsmWrite(','); + owner.writer.AsmWrite(getopstr(taillvm(hp).oper[2]^,false)); + owner.writer.AsmWrite(')'); + done:=true; + end; la_alloca: begin owner.writer.AsmWrite(getreferencestring(taillvm(hp).oper[0]^.ref^,false)+' = '); diff --git a/compiler/llvm/itllvm.pas b/compiler/llvm/itllvm.pas index bf691af7bd..93143af201 100644 --- a/compiler/llvm/itllvm.pas +++ b/compiler/llvm/itllvm.pas @@ -57,6 +57,7 @@ interface 'icmp', 'fcmp', 'phi', 'select', 'call', 'va_arg', 'landingpad', + 'blockaddress', { fpc pseudo opcodes } 'type', { type definition } 'invalid1', { la_x_to_inttoptr } diff --git a/compiler/llvm/llvmbase.pas b/compiler/llvm/llvmbase.pas index 59a22797fd..91821df24e 100644 --- a/compiler/llvm/llvmbase.pas +++ b/compiler/llvm/llvmbase.pas @@ -65,6 +65,7 @@ interface la_icmp, la_fcmp, la_phi, la_select, la_call, la_va_arg, la_landingpad, + la_blockaddress, { fpc pseudo opcodes } la_type, { type definition } la_x_to_inttoptr, { have to convert something first to int before it can be converted to a pointer }