|
@@ -182,7 +182,7 @@ unit hlcgobj;
|
|
|
}
|
|
|
procedure a_call_name(list : TAsmList;pd : tprocdef;const s : TSymStr; weak: boolean);virtual;abstract;
|
|
|
procedure a_call_reg(list : TAsmList;pd : tabstractprocdef;reg : tregister);virtual;abstract;
|
|
|
- procedure a_call_ref(list : TAsmList;pd : tabstractprocdef;ref : treference);virtual;abstract;
|
|
|
+ procedure a_call_ref(list : TAsmList;pd : tabstractprocdef;ref : treference);virtual;
|
|
|
{ same as a_call_name, might be overridden on certain architectures to emit
|
|
|
static calls without usage of a got trampoline }
|
|
|
procedure a_call_name_static(list : TAsmList;pd : tprocdef;const s : TSymStr);virtual;
|
|
@@ -780,6 +780,22 @@ implementation
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
+ procedure thlcgobj.a_call_ref(list: TAsmList; pd: tabstractprocdef; ref: treference);
|
|
|
+ var
|
|
|
+ reg: tregister;
|
|
|
+ size: tdef;
|
|
|
+ begin
|
|
|
+ { the loaded data is always a pointer to a procdef. A procvardef is
|
|
|
+ implicitly a pointer already, but a procdef isn't -> create one }
|
|
|
+ if pd.typ=procvardef then
|
|
|
+ size:=pd
|
|
|
+ else
|
|
|
+ size:=getpointerdef(pd);
|
|
|
+ reg:=getaddressregister(list,size);
|
|
|
+ a_load_ref_reg(list,size,size,ref,reg);
|
|
|
+ a_call_reg(list,pd,reg);
|
|
|
+ end;
|
|
|
+
|
|
|
procedure thlcgobj.a_call_name_static(list: TAsmList; pd: tprocdef; const s: TSymStr);
|
|
|
begin
|
|
|
a_call_name(list,pd,s,false);
|