Quellcode durchsuchen

* fixed passing of C-style varargs parameters

git-svn-id: branches/hlcgllvm@28357 -
Jonas Maebe vor 11 Jahren
Ursprung
Commit
39fa81eaa0
2 geänderte Dateien mit 12 neuen und 3 gelöschten Zeilen
  1. 4 1
      compiler/llvm/llvmpara.pas
  2. 8 2
      compiler/llvm/nllvmcal.pas

+ 4 - 1
compiler/llvm/llvmpara.pas

@@ -89,7 +89,10 @@ unit llvmpara;
         paralocs }
       while assigned(paraloc) do
         begin
-          if paramanager.push_addr_param(parasym.varspez,parasym.vardef,tabstractprocdef(parasym.owner.defowner).proccalloption) or
+          { varargs parameters do not have a parasym.owner, but they're always
+            by value }
+          if (assigned(parasym.owner) and
+              paramanager.push_addr_param(parasym.varspez,parasym.vardef,tabstractprocdef(parasym.owner.defowner).proccalloption)) or
              not llvmbyvalparaloc(paraloc) then
             begin
               case paraloc^.loc of

+ 8 - 2
compiler/llvm/nllvmcal.pas

@@ -57,14 +57,20 @@ implementation
         paraindex: longint;
       begin
         { we just pass the temp paralocs here }
-        setlength(paralocs,procdefinition.paras.count);
+        if not assigned(varargsparas) then
+          setlength(paralocs,procdefinition.paras.count)
+        else
+          setlength(paralocs,procdefinition.paras.count+varargsparas.count);
         n:=tcgcallparanode(left);
         while assigned(n) do
           begin
             { TODO: check whether this is correct for left-to-right calling
               conventions, may also depend on whether or not llvm knows about
               the calling convention }
-            paraindex:=procdefinition.paras.indexof(n.parasym);
+            if not(cpf_varargs_para in n.callparaflags) then
+              paraindex:=procdefinition.paras.indexof(n.parasym)
+            else
+              paraindex:=procdefinition.paras.count+varargsparas.indexof(n.parasym);
             if paraindex=-1 then
              internalerror(2014010602);
             paralocs[paraindex]:[email protected];