diff options
author | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2016-06-05 21:34:45 +0000 |
---|---|---|
committer | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2016-06-05 21:34:45 +0000 |
commit | 9600dd45c8f9c0a505e4a08fd98cf6a6864558c9 (patch) | |
tree | 3c9675c235b1ef4e48055a53ed85d9f4bce20931 /compiler/ncgcal.pas | |
parent | c5f3223126e41e416902dc37a46fc5155ca99798 (diff) | |
download | fpc-9600dd45c8f9c0a505e4a08fd98cf6a6864558c9.tar.gz |
* fixed procdef used to call C-style blocks (only relevant for LLVM)
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@33925 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/ncgcal.pas')
-rw-r--r-- | compiler/ncgcal.pas | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/compiler/ncgcal.pas b/compiler/ncgcal.pas index fd3cf64af4..815d54fdd5 100644 --- a/compiler/ncgcal.pas +++ b/compiler/ncgcal.pas @@ -109,7 +109,7 @@ interface { loads the procvar code pointer into a register with type def } procedure load_procvar_codeptr(out reg: tregister; out callprocdef: tabstractprocdef); - procedure load_block_invoke(toreg: tregister; out callprocdef: tabstractprocdef); + procedure load_block_invoke(out toreg: tregister; out callprocdef: tabstractprocdef); function get_call_reg(list: TAsmList): tregister; virtual; procedure unget_call_reg(list: TAsmList; reg: tregister); virtual; @@ -436,7 +436,7 @@ implementation end; - procedure tcgcallnode.load_block_invoke(toreg: tregister; out callprocdef: tabstractprocdef); + procedure tcgcallnode.load_block_invoke(out toreg: tregister; out callprocdef: tabstractprocdef); var href: treference; literaldef: trecorddef; @@ -445,9 +445,10 @@ implementation hlcg.location_force_reg(current_asmdata.CurrAsmList,right.location,right.resultdef,cpointerdef.getreusable(literaldef),true); { load the invoke pointer } hlcg.reference_reset_base(href,right.resultdef,right.location.register,0,right.resultdef.alignment); - hlcg.g_load_field_reg_by_name(current_asmdata.CurrAsmList,literaldef,procdefinition,'INVOKE',href,toreg); - callprocdef:=procdefinition; - end; + callprocdef:=cprocvardef.getreusableprocaddr(procdefinition); + toreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,callprocdef); + hlcg.g_load_field_reg_by_name(current_asmdata.CurrAsmList,literaldef,callprocdef,'INVOKE',href,toreg); + end; function tcgcallnode.get_call_reg(list: TAsmList): tregister; @@ -815,10 +816,7 @@ implementation procedure tcgcallnode.load_procvar_codeptr(out reg: tregister; out callprocdef: tabstractprocdef); begin if po_is_block in procdefinition.procoptions then - begin - reg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,procdefinition); - load_block_invoke(reg,callprocdef); - end + load_block_invoke(reg,callprocdef) else if not(procdefinition.is_addressonly) then load_complex_procvar_codeptr(reg,callprocdef) else |