mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2026-01-04 01:12:04 +01:00
* blockaddress creates a constant operand for another opcode, it's not an
independent operation o additionally, it does not take a "label" qualifier for its label argument git-svn-id: trunk@34944 -
This commit is contained in:
parent
ebe134febc
commit
3b7d9447ae
@ -104,7 +104,7 @@ 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);
|
||||
constructor blockaddress(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);
|
||||
@ -1024,13 +1024,12 @@ uses
|
||||
loadconst(index+1,index1);
|
||||
end;
|
||||
|
||||
constructor taillvm.blockaddress(dstreg: tregister; fun, lab: tasmsymbol);
|
||||
constructor taillvm.blockaddress(fun, lab: tasmsymbol);
|
||||
begin
|
||||
create_llvm(la_blockaddress);
|
||||
ops:=3;
|
||||
loadreg(0,dstreg);
|
||||
loadsymbol(1,fun,0);
|
||||
loadsymbol(2,lab,0);
|
||||
ops:=2;
|
||||
loadsymbol(0,fun,0);
|
||||
loadsymbol(1,lab,0);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
@ -594,12 +594,19 @@ implementation
|
||||
end;
|
||||
la_blockaddress:
|
||||
begin
|
||||
owner.writer.AsmWrite('i8* blockaddress(');
|
||||
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(')');
|
||||
{ getopstr would add a "label" qualifier, which blockaddress does
|
||||
not want }
|
||||
owner.writer.AsmWrite(',%');
|
||||
with taillvm(hp).oper[1]^ do
|
||||
begin
|
||||
if (typ<>top_ref) or
|
||||
(ref^.refaddr<>addr_full) then
|
||||
internalerror(2016112001);
|
||||
owner.writer.AsmWrite(ref^.symbol.name);
|
||||
end;
|
||||
nested:=true;
|
||||
done:=true;
|
||||
end;
|
||||
la_alloca:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user