Bläddra i källkod

llvm: version 12.0 support

Jonas Maebe 3 år sedan
förälder
incheckning
1b06599e82
3 ändrade filer med 45 tillägg och 15 borttagningar
  1. 3 2
      compiler/llvm/agllvm.pas
  2. 29 9
      compiler/llvm/llvmdef.pas
  3. 13 4
      compiler/llvm/llvminfo.pas

+ 3 - 2
compiler/llvm/agllvm.pas

@@ -330,6 +330,7 @@ implementation
 
 
    procedure TLLVMInstrWriter.writeparas(const paras: tfplist);
+
      var
        hp: tai;
        para: pllvmcallpara;
@@ -350,9 +351,9 @@ implementation
            if para^.valueext<>lve_none then
              owner.writer.AsmWrite(llvmvalueextension2str[para^.valueext]);
            if para^.byval then
-             owner.writer.AsmWrite(' byval');
+             owner.writer.AsmWrite(llvmparatypeattr(' byval',para^.def,true));
            if para^.sret then
-             owner.writer.AsmWrite(' sret');
+             owner.writer.AsmWrite(llvmparatypeattr(' sret',para^.def,true));
            { For byval, this means "alignment on the stack" and of the passed source data.
              For other pointer parameters, this means "alignment of the passed source data" }
            if (para^.alignment<>std_param_align) or

+ 29 - 9
compiler/llvm/llvmdef.pas

@@ -107,6 +107,10 @@ interface
       name further according to platform conventions (we already did that) }
     function llvmmangledname(const s: TSymStr): TSymStr;
 
+    { convert a parameter attribute to a string. Depending on the target
+      LLVM version, we may have to add the dereferenced parameter type as well }
+    function llvmparatypeattr(const attr: TSymStr; paradef: tdef; strippointer: boolean): TSymStr;
+
     function llvmasmsymname(const sym: TAsmSymbol): TSymStr;
 
     function llvmfloatintrinsicsuffix(def: tfloatdef): TIDString;
@@ -121,7 +125,7 @@ implementation
     symtable,symsym,
     llvmsym,hlcgobj,
     defutil,blockutl,cgbase,paramgr,
-    cpubase;
+    llvminfo,cpubase;
 
 
 {******************************************************************
@@ -280,6 +284,21 @@ implementation
         result:='@'+s
     end;
 
+  function llvmparatypeattr(const attr: TSymStr; paradef: tdef; strippointer: boolean): TSymStr;
+    begin
+      result:=attr;
+      if llvmflag_para_attr_type in llvmversion_properties[current_settings.llvmversion] then
+        begin
+          if not strippointer then
+            result:=result+'('+llvmencodetypename(paradef)+')'
+          else
+            begin
+              if paradef.typ<>pointerdef then
+                internalerror(2022060310);
+              result:=result+'('+llvmencodetypename(tpointerdef(paradef).pointeddef)+')'
+            end;
+        end;
+    end;
 
   function llvmasmsymname(const sym: TAsmSymbol): TSymStr;
     begin
@@ -743,29 +762,30 @@ implementation
                 internalerror(2015101404);
 {$endif aarch64}
               if withattributes then
-                 if first
+                begin
+                  if first
 {$ifdef aarch64}
-                    and not is_managed_type(hp.vardef)
+                     and not is_managed_type(hp.vardef)
 {$endif aarch64}
                     then
-                   encodedstr:=encodedstr+' sret noalias nocapture'
-                 else
-                   encodedstr:=encodedstr+' noalias nocapture';
+                      encodedstr:=encodedstr+llvmparatypeattr(' sret',hp.vardef,false)+' noalias nocapture'
+                    else
+                      encodedstr:=encodedstr+' noalias nocapture';
+                end;
             end
           else if not paramanager.push_addr_param(hp.varspez,hp.vardef,proccalloption) and
              llvmbyvalparaloc(paraloc) then
             begin
+              encodedstr:=encodedstr+'*';
               if withattributes then
                 begin
-                  encodedstr:=encodedstr+'* byval';
+                  encodedstr:=encodedstr+llvmparatypeattr(' byval',hp.vardef,false);
                   if firstloc and
                      (para^.alignment<>std_param_align) then
                     begin
                       encodedstr:=encodedstr+' align '+tostr(para^.alignment);
                     end;
                 end
-              else
-                encodedstr:=encodedstr+'*';
             end
           else if withattributes and
              paramanager.push_addr_param(hp.varspez,hp.vardef,proccalloption) then

+ 13 - 4
compiler/llvm/llvminfo.pas

@@ -44,7 +44,9 @@ Type
        llvmver_xc_11,
        llvmver_9_0,
        llvmver_10_0,
-       llvmver_11_0
+       llvmver_11_0,
+       llvmver_11_1,
+       llvmver_12_0
       );
 
 type
@@ -57,7 +59,8 @@ type
      llvmflag_null_pointer_valid_new,       { new syntax for the null pointer valid attribute: null_pointer_is_valid }
      llvmflag_array_datalocation,           { arrays debug info supports a dataLocation attribute to specify how to obtain the array data based on the array variable }
      llvmflag_NoDISPFlags,                  { no DI sub program flags, but separate fields }
-     llvmflag_NoDISPFlagMainSubprogram      { MainSubprogram still in DIFlags instead of DISPFlags }
+     llvmflag_NoDISPFlagMainSubprogram,     { MainSubprogram still in DIFlags instead of DISPFlags }
+     llvmflag_para_attr_type                { parameter attributes such as noalias and byval need to repeat the type }
    );
    tllvmversionflags = set of tllvmversionflag;
 
@@ -72,7 +75,9 @@ Const
      'Xcode-11.0',
      '9.0',
      '10.0',
-     '11.0'
+     '11.0',
+     '11.1',
+     '12.0'
    );
 
    llvm_debuginfo_metadata_format : array[tllvmversion] of byte = (
@@ -85,6 +90,8 @@ Const
      3,
      3,
      3,
+     3,
+     3,
      3
    );
 
@@ -99,7 +106,9 @@ Const
        { llvmver_xc_11   } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_NoDISPFlagMainSubprogram],
        { llvmver_9_0     } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_constrained_fptrunc_fpext],
        { llvmver_10_0    } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp],
-       { llvmver_11_0    } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid_new,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp,llvmflag_array_datalocation]
+       { llvmver_11_0    } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid_new,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp,llvmflag_array_datalocation],
+       { llvmver_11_1    } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid_new,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp,llvmflag_array_datalocation],
+       { llvmver_12_0    } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid_new,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp,llvmflag_array_datalocation,llvmflag_para_attr_type]
      );
 
    { Supported optimizations, only used for information }