changeset 724:6de2ed4f0abe

Disabled parameter reversing by default, it broke mini/typeinfo10.d Fixed 'inreg' property placement for functions with reversed parameters. Made parameter reversal and inreg passing of first arg configurable in premake.lua
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Sat, 25 Oct 2008 18:12:07 +0200
parents 55f6c2e454d7
children 3e143b611c1e
files gen/functions.cpp premake.lua
diffstat 2 files changed, 15 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/gen/functions.cpp	Sat Oct 25 06:03:28 2008 +0200
+++ b/gen/functions.cpp	Sat Oct 25 18:12:07 2008 +0200
@@ -108,14 +108,11 @@
         paramvec.push_back(t1);
         paramvec.push_back(getPtrToType(LLType::Int8Ty));
     }
-    else if (arrayVararg)
-    {
-        // do nothing?
-    }
 
     // number of formal params
     size_t n = Argument::dim(f->parameters);
 
+#if X86_REVERSE_PARAMS
     // on x86 we need to reverse the formal params in some cases to match the ABI
     if (global.params.cpu == ARCHx86)
     {
@@ -128,6 +125,7 @@
             f->reverseIndex = paramvec.size();
         }
     }
+#endif // X86_REVERSE_PARAMS
 
 
     for (int i=0; i < n; ++i) {
@@ -194,6 +192,7 @@
     bool isvararg = !(typesafeVararg || arrayVararg) && f->varargs;
     llvm::FunctionType* functype = llvm::FunctionType::get(actualRettype, paramvec, isvararg);
 
+#if X86_PASS_IN_EAX
     // tell first param to be passed in a register if we can
     // ONLY extern(D) functions !
     if ((n > 0 || usesthis || usesnest) && f->linkage == LINKd)
@@ -213,12 +212,14 @@
             else
             {
                 int inreg = f->reverseParams ? n - 1 : 0;
-                Argument* arg = Argument::getNth(f->parameters, 0);
+                Argument* arg = Argument::getNth(f->parameters, inreg);
                 Type* t = arg->type->toBasetype();
 
-                // 32bit ints, pointers, classes and static arrays are candidate for being passed in EAX
+                // 32bit ints, pointers, classes, static arrays and AAs
+                // are candidate for being passed in EAX
                 if ((arg->storageClass & STCin) &&
-                    ((t->isscalar() && !t->isfloating()) || t->ty == Tclass || t->ty == Tsarray) &&
+                    ((t->isscalar() && !t->isfloating()) ||
+                     t->ty == Tclass || t->ty == Tsarray || t->ty == Taarray) &&
                     (t->size() <= PTRSIZE))
                 {
                     arg->llvmAttrs |= llvm::Attribute::InReg;
@@ -226,6 +227,7 @@
             }
         }
     }
+#endif // X86_PASS_IN_EAX
 
     // done
     f->retInPtr = retinptr;
--- a/premake.lua	Sat Oct 25 06:03:28 2008 +0200
+++ b/premake.lua	Sat Oct 25 18:12:07 2008 +0200
@@ -37,6 +37,10 @@
 
 io.write("Default target: '"..TRIPLE.."'\n");
 
+-- x86 ABI support
+X86_REVERSE_PARAMS = 0 --disabled for now
+X86_PASS_IN_EAX = 1
+
 -- D version - don't change these !!!
 DMDV1 = "1"
 
@@ -82,6 +86,8 @@
     "DMDV1="..DMDV1,
     "POSIX="..POSIX,
     "DEFAULT_TARGET_TRIPLE=\\\""..TRIPLE.."\\\"",
+    "X86_REVERSE_PARAMS="..X86_REVERSE_PARAMS,
+    "X86_PASS_IN_EAX="..X86_PASS_IN_EAX,
 }
 package.config.Release.defines = { "LLVMD_NO_LOGGER" }
 package.config.Debug.buildoptions = { "-g -O0" }