mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-23 19:49:46 +02:00
* cleaned up blockaddress instruction (add type rather than hardcoding it
in the assembler writer) * fixed taking the address of a label in a typed const for llvm (fixes tbs/tb0468a) git-svn-id: trunk@40599 -
This commit is contained in:
parent
c6bb85eae9
commit
3b4011760a
compiler/llvm
@ -107,7 +107,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(fun, lab: tasmsymbol);
|
||||
constructor blockaddress(size: tdef; fun, lab: tasmsymbol);
|
||||
constructor landingpad(dst:tregister;def:tdef;firstclause:taillvm);
|
||||
constructor exceptclause(op:tllvmop;def:tdef;kind:TAsmSymbol;nextclause:taillvm);
|
||||
|
||||
@ -514,7 +514,7 @@ uses
|
||||
end;
|
||||
la_blockaddress:
|
||||
case opnr of
|
||||
0: result:=operand_write
|
||||
1: result:=operand_write
|
||||
else
|
||||
result:=operand_read;
|
||||
end
|
||||
@ -673,7 +673,7 @@ uses
|
||||
end;
|
||||
la_blockaddress:
|
||||
case opnr of
|
||||
0: result:=voidcodepointertype
|
||||
1: result:=voidcodepointertype
|
||||
else
|
||||
internalerror(2015111904);
|
||||
end
|
||||
@ -1037,12 +1037,13 @@ uses
|
||||
loadconst(index+1,index1);
|
||||
end;
|
||||
|
||||
constructor taillvm.blockaddress(fun, lab: tasmsymbol);
|
||||
constructor taillvm.blockaddress(size: tdef; fun, lab: tasmsymbol);
|
||||
begin
|
||||
create_llvm(la_blockaddress);
|
||||
ops:=2;
|
||||
loadsymbol(0,fun,0);
|
||||
loadsymbol(1,lab,0);
|
||||
ops:=3;
|
||||
loaddef(0,size);
|
||||
loadsymbol(1,fun,0);
|
||||
loadsymbol(2,lab,0);
|
||||
end;
|
||||
|
||||
|
||||
|
@ -604,12 +604,18 @@ implementation
|
||||
end;
|
||||
la_blockaddress:
|
||||
begin
|
||||
owner.writer.AsmWrite('i8* blockaddress(');
|
||||
owner.writer.AsmWrite(getopstr(taillvm(hp).oper[0]^,false));
|
||||
{ nested -> no type }
|
||||
if owner.fdecllevel = 0 then
|
||||
begin
|
||||
owner.writer.AsmWrite(getopstr(taillvm(hp).oper[0]^,false));
|
||||
owner.writer.AsmWrite(' ');
|
||||
end;
|
||||
owner.writer.AsmWrite('blockaddress(');
|
||||
owner.writer.AsmWrite(getopstr(taillvm(hp).oper[1]^,false));
|
||||
{ getopstr would add a "label" qualifier, which blockaddress does
|
||||
not want }
|
||||
owner.writer.AsmWrite(',%');
|
||||
with taillvm(hp).oper[1]^ do
|
||||
with taillvm(hp).oper[2]^ do
|
||||
begin
|
||||
if (typ<>top_ref) or
|
||||
(ref^.refaddr<>addr_full) then
|
||||
|
@ -124,7 +124,7 @@ procedure tllvmloadnode.pass_generate_code;
|
||||
labelsym:
|
||||
begin
|
||||
selfreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,voidcodepointertype);
|
||||
ai:=taillvm.blockaddress(
|
||||
ai:=taillvm.blockaddress(voidcodepointertype,
|
||||
current_asmdata.RefAsmSymbol(current_procinfo.procdef.mangledname,AT_FUNCTION),
|
||||
location.reference.symbol
|
||||
);
|
||||
|
@ -109,6 +109,7 @@ interface
|
||||
procedure queue_subscriptn(def: tabstractrecorddef; vs: tfieldvarsym); override;
|
||||
procedure queue_typeconvn(fromdef, todef: tdef); override;
|
||||
procedure queue_emit_staticvar(vs: tstaticvarsym); override;
|
||||
procedure queue_emit_label(l: tlabelsym); override;
|
||||
procedure queue_emit_asmsym(sym: tasmsymbol; def: tdef); override;
|
||||
procedure queue_emit_ordconst(value: int64; def: tdef); override;
|
||||
|
||||
@ -128,6 +129,7 @@ implementation
|
||||
uses
|
||||
verbose,systems,fmodule,
|
||||
aasmdata,
|
||||
procinfo,
|
||||
cpubase,cpuinfo,llvmbase,
|
||||
symtable,llvmdef,defutil,defcmp;
|
||||
|
||||
@ -782,6 +784,24 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure tllvmtai_typedconstbuilder.queue_emit_label(l: tlabelsym);
|
||||
var
|
||||
ai: taillvm;
|
||||
typedai: tai;
|
||||
tmpintdef: tdef;
|
||||
op,
|
||||
firstop,
|
||||
secondop: tllvmop;
|
||||
begin
|
||||
ai:=taillvm.blockaddress(voidcodepointertype,
|
||||
current_asmdata.RefAsmSymbol(current_procinfo.procdef.mangledname,AT_FUNCTION),
|
||||
current_asmdata.RefAsmSymbol(l.mangledname,AT_LABEL)
|
||||
);
|
||||
emit_tai(ai,voidcodepointertype);
|
||||
fqueue_offset:=low(fqueue_offset);
|
||||
end;
|
||||
|
||||
|
||||
procedure tllvmtai_typedconstbuilder.queue_emit_asmsym(sym: tasmsymbol; def: tdef);
|
||||
begin
|
||||
{ we've already incorporated the offset via the inserted operations above,
|
||||
|
Loading…
Reference in New Issue
Block a user