mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-10 06:05:57 +02:00
+ llvm blockaddress() intrinsic (supported as of LLVM 3.5.1)
git-svn-id: trunk@32409 -
This commit is contained in:
parent
949fd53a0a
commit
1284032765
@ -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
|
||||
|
@ -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)+' = ');
|
||||
|
@ -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 }
|
||||
|
@ -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 }
|
||||
|
Loading…
Reference in New Issue
Block a user