* 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:
Jonas Maebe 2016-11-21 07:39:05 +00:00
parent ebe134febc
commit 3b7d9447ae
2 changed files with 17 additions and 11 deletions

View File

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

View File

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