+ llvm blockaddress() intrinsic (supported as of LLVM 3.5.1)

git-svn-id: trunk@32409 -
This commit is contained in:
Jonas Maebe 2015-11-21 12:36:55 +00:00
parent 949fd53a0a
commit 1284032765
4 changed files with 35 additions and 0 deletions

View File

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

View File

@ -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)+' = ');

View File

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

View File

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