mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 13:06:18 +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_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 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) }
|
{ e.g. dst = call retsize name (paras) }
|
||||||
constructor call_size_name_paras(callpd: tdef; dst: tregister;retsize: tdef;name:tasmsymbol;paras: tfplist);
|
constructor call_size_name_paras(callpd: tdef; dst: tregister;retsize: tdef;name:tasmsymbol;paras: tfplist);
|
||||||
{ e.g. dst = call retsize reg (paras) }
|
{ e.g. dst = call retsize reg (paras) }
|
||||||
@ -462,6 +464,12 @@ uses
|
|||||||
else
|
else
|
||||||
result:=operand_read;
|
result:=operand_read;
|
||||||
end;
|
end;
|
||||||
|
la_blockaddress:
|
||||||
|
case opnr of
|
||||||
|
0: result:=operand_write
|
||||||
|
else
|
||||||
|
result:=operand_read;
|
||||||
|
end
|
||||||
else
|
else
|
||||||
internalerror(2013103101)
|
internalerror(2013103101)
|
||||||
end;
|
end;
|
||||||
@ -578,6 +586,12 @@ uses
|
|||||||
internalerror(2013110110);
|
internalerror(2013110110);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
la_blockaddress:
|
||||||
|
case opnr of
|
||||||
|
0: result:=voidcodepointertype
|
||||||
|
else
|
||||||
|
internalerror(2015111904);
|
||||||
|
end
|
||||||
else
|
else
|
||||||
internalerror(2013103101)
|
internalerror(2013103101)
|
||||||
end;
|
end;
|
||||||
@ -923,6 +937,15 @@ uses
|
|||||||
loadconst(index+1,index1);
|
loadconst(index+1,index1);
|
||||||
end;
|
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);
|
constructor taillvm.call_size_name_paras(callpd: tdef; dst: tregister; retsize: tdef; name:tasmsymbol; paras: tfplist);
|
||||||
begin
|
begin
|
||||||
|
@ -419,6 +419,16 @@ implementation
|
|||||||
sep:=' ';
|
sep:=' ';
|
||||||
opstart:=2;
|
opstart:=2;
|
||||||
end;
|
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:
|
la_alloca:
|
||||||
begin
|
begin
|
||||||
owner.writer.AsmWrite(getreferencestring(taillvm(hp).oper[0]^.ref^,false)+' = ');
|
owner.writer.AsmWrite(getreferencestring(taillvm(hp).oper[0]^.ref^,false)+' = ');
|
||||||
|
@ -57,6 +57,7 @@ interface
|
|||||||
'icmp', 'fcmp',
|
'icmp', 'fcmp',
|
||||||
'phi', 'select', 'call',
|
'phi', 'select', 'call',
|
||||||
'va_arg', 'landingpad',
|
'va_arg', 'landingpad',
|
||||||
|
'blockaddress',
|
||||||
{ fpc pseudo opcodes }
|
{ fpc pseudo opcodes }
|
||||||
'type', { type definition }
|
'type', { type definition }
|
||||||
'invalid1', { la_x_to_inttoptr }
|
'invalid1', { la_x_to_inttoptr }
|
||||||
|
@ -65,6 +65,7 @@ interface
|
|||||||
la_icmp, la_fcmp,
|
la_icmp, la_fcmp,
|
||||||
la_phi, la_select, la_call,
|
la_phi, la_select, la_call,
|
||||||
la_va_arg, la_landingpad,
|
la_va_arg, la_landingpad,
|
||||||
|
la_blockaddress,
|
||||||
{ fpc pseudo opcodes }
|
{ fpc pseudo opcodes }
|
||||||
la_type, { type definition }
|
la_type, { type definition }
|
||||||
la_x_to_inttoptr, { have to convert something first to int before it can be converted to a pointer }
|
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