diff gen/tocall.cpp @ 1050:32ead42679d1

Fix a bug in the X86 ABI. The size of a struct is different from the size of a pointer to that struct...
author Frits van Bommel <fvbommel wxs.nl>
date Fri, 06 Mar 2009 21:15:13 +0100
parents 6bb04dbee21f
children dc608dc33081
line wrap: on
line diff
--- a/gen/tocall.cpp	Fri Mar 06 19:12:48 2009 +0100
+++ b/gen/tocall.cpp	Fri Mar 06 21:15:13 2009 +0100
@@ -373,6 +373,16 @@
     else
     {
         Logger::println("doing normal arguments");
+        if (Logger::enabled()) {
+            Logger::println("Arguments so far: (%d)", (int)args.size());
+            Logger::indent();
+            for (size_t i = 0; i < args.size(); i++) {
+                Logger::cout() << *args[i] << '\n';
+            }
+            Logger::undent();
+            Logger::cout() << "Function type: " << tf->toChars() << '\n';
+            Logger::cout() << "LLVM functype: " << *callable->getType() << '\n';
+        }
 
         size_t n = Argument::dim(tf->parameters);
 
@@ -386,9 +396,19 @@
             assert(fnarg);
             DValue* argval = DtoArgument(fnarg, (Expression*)arguments->data[i]);
 
+            if (Logger::enabled()) {
+                Logger::cout() << "Argument before ABI: " << *argval->getRVal() << '\n';
+                Logger::cout() << "Argument type before ABI: " << *DtoType(argval->getType()) << '\n';
+            }
+
             // give the ABI a say
             LLValue* arg = tf->fty->putParam(argval->getType(), i, argval);
 
+            if (Logger::enabled()) {
+                Logger::cout() << "Argument after ABI: " << *arg << '\n';
+                Logger::cout() << "Argument type after ABI: " << *arg->getType() << '\n';
+            }
+
             int j = tf->fty->reverseParams ? beg + n - i - 1 : beg + i;
 
             // Hack around LDC assuming structs are in memory: