Browse Source

llvm: replaced boolean fields in tllvmcallpara with a set

Jonas Maebe 3 years ago
parent
commit
aa43441ac9
4 changed files with 12 additions and 11 deletions
  1. 4 2
      compiler/llvm/aasmllvm.pas
  2. 2 2
      compiler/llvm/agllvm.pas
  3. 5 5
      compiler/llvm/hlcgllvm.pas
  4. 1 2
      compiler/llvm/nllvmbas.pas

+ 4 - 2
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);

+ 2 - 2
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

+ 5 - 5
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;

+ 1 - 2
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 }