diff --git a/compiler/llvm/aasmllvm.pas b/compiler/llvm/aasmllvm.pas index 371c14f031..e0e2f915b6 100644 --- a/compiler/llvm/aasmllvm.pas +++ b/compiler/llvm/aasmllvm.pas @@ -209,14 +209,16 @@ interface destructor destroy; override; end; + tllvmcallparaflag = (lcp_byval, lcp_sret); + tllvmcallparaflags = set of tllvmcallparaflag; + { parameter to an llvm call instruction } pllvmcallpara = ^tllvmcallpara; tllvmcallpara = record def: tdef; alignment: shortint; valueext: tllvmvalueextension; - byval, - sret: boolean; + flags: tllvmcallparaflags; case typ: toptype of top_none: (); top_reg: (register: tregister); diff --git a/compiler/llvm/agllvm.pas b/compiler/llvm/agllvm.pas index 72d3c0a78c..4b0ae128cc 100644 --- a/compiler/llvm/agllvm.pas +++ b/compiler/llvm/agllvm.pas @@ -350,9 +350,9 @@ implementation owner.writer.AsmWrite(llvmencodetypename(para^.def)); if para^.valueext<>lve_none then owner.writer.AsmWrite(llvmvalueextension2str[para^.valueext]); - if para^.byval then + if lcp_byval in para^.flags then owner.writer.AsmWrite(llvmparatypeattr(' byval',para^.def,true)); - if para^.sret then + if lcp_sret in para^.flags then owner.writer.AsmWrite(llvmparatypeattr(' sret',para^.def,true)); if asmblock and (llvmflag_opaque_ptr_transition in llvmversion_properties[current_settings.llvmversion]) and diff --git a/compiler/llvm/hlcgllvm.pas b/compiler/llvm/hlcgllvm.pas index 08363c9c25..0105a31374 100644 --- a/compiler/llvm/hlcgllvm.pas +++ b/compiler/llvm/hlcgllvm.pas @@ -476,21 +476,21 @@ implementation while assigned(paraloc) do begin new(callpara); + callpara^.flags:=[]; callpara^.def:=paraloc^.def; { if the paraloc doesn't contain the value itself, it's a byval parameter } if paraloc^.retvalloc then begin - callpara^.sret:=true; - callpara^.byval:=false; + include(callpara^.flags,lcp_sret); end else begin - callpara^.sret:=false; - callpara^.byval:=not paraloc^.llvmvalueloc; + if not paraloc^.llvmvalueloc then + include(callpara^.flags,lcp_byval); end; if firstparaloc and - callpara^.byval then + (lcp_byval in callpara^.flags) then callpara^.alignment:=paras[i]^.Alignment else callpara^.alignment:=std_param_align; diff --git a/compiler/llvm/nllvmbas.pas b/compiler/llvm/nllvmbas.pas index 533bf50c4c..b69edbefe1 100644 --- a/compiler/llvm/nllvmbas.pas +++ b/compiler/llvm/nllvmbas.pas @@ -89,8 +89,7 @@ interface if (sym.typ=paravarsym) and paramanager.push_addr_param(sym.varspez,sym.vardef,current_procinfo.procdef.proccalloption) then callpara^.def:=cpointerdef.getreusable(callpara^.def); - callpara^.sret:=false; - callpara^.byval:=false; + callpara^.flags:=[]; callpara^.valueext:=lve_none; callpara^.typ:=top_reg; { address must be a temp register }