changeset 264:a9dae3da4e87 trunk

[svn r285] Fixed D -> bool LLVM helper for floating point values. Changed the way D-style varargs are passed, now each param should be aligned to size_t.sizeof.
author lindquist
date Sat, 14 Jun 2008 17:28:13 +0200
parents 2be09ee06bc7
children 455eb10696f2
files gen/toir.cpp gen/tollvm.cpp tango/tango/core/Vararg.d tango/tango/text/convert/Layout.d tangotests/vararg3.d
diffstat 5 files changed, 31 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/gen/toir.cpp	Sat Jun 14 06:13:35 2008 +0200
+++ b/gen/toir.cpp	Sat Jun 14 17:28:13 2008 +0200
@@ -1121,6 +1121,9 @@
             Argument* argu = Argument::getNth(tf->parameters, i);
             Expression* argexp = (Expression*)arguments->data[i];
             vtypes.push_back(DtoType(argexp->type));
+            size_t sz = getABITypeSize(vtypes.back());
+            if (sz < PTRSIZE)
+                vtypes.back() = DtoSize_t();
         }
         const LLStructType* vtype = LLStructType::get(vtypes);
         Logger::cout() << "d-variadic argument struct type:\n" << *vtype << '\n';
@@ -1132,7 +1135,9 @@
             Expression* argexp = (Expression*)arguments->data[i];
             if (global.params.llvmAnnotate)
                 DtoAnnotation(argexp->toChars());
-            DtoVariadicArgument(argexp, DtoGEPi(mem,0,k,"tmp"));
+            LLValue* argdst = DtoGEPi(mem,0,k);
+            argdst = DtoBitCast(argdst, getPtrToType(DtoType(argexp->type)));
+            DtoVariadicArgument(argexp, argdst);
         }
 
         // build type info array
--- a/gen/tollvm.cpp	Sat Jun 14 06:13:35 2008 +0200
+++ b/gen/tollvm.cpp	Sat Jun 14 17:28:13 2008 +0200
@@ -330,14 +330,16 @@
             return new llvm::ICmpInst(llvm::ICmpInst::ICMP_NE, val, zero, "tmp", gIR->scopebb());
         }
     }
+    else if (t->isFloatingPoint())
+    {
+        LLValue* zero = llvm::Constant::getNullValue(t);
+        return new llvm::FCmpInst(llvm::FCmpInst::FCMP_ONE, val, zero, "tmp", gIR->scopebb());
+    }
     else if (isaPointer(t)) {
         LLValue* zero = llvm::Constant::getNullValue(t);
         return new llvm::ICmpInst(llvm::ICmpInst::ICMP_NE, val, zero, "tmp", gIR->scopebb());
     }
-    else
-    {
-        Logger::cout() << *t << '\n';
-    }
+    std::cout << "unsupported -> bool : " << *t << '\n';
     assert(0);
     return 0;
 }
--- a/tango/tango/core/Vararg.d	Sat Jun 14 06:13:35 2008 +0200
+++ b/tango/tango/core/Vararg.d	Sat Jun 14 17:28:13 2008 +0200
@@ -36,10 +36,13 @@
      */
     T va_arg(T)(ref va_list vp)
     {
-        size_t size = T.sizeof > size_t.sizeof ? size_t.sizeof : T.sizeof;
-        va_list vptmp = cast(va_list)((cast(size_t)vp + size - 1) &  ~(size - 1));
-        vp = vptmp + T.sizeof;
-        return *cast(T*)vptmp;
+//         size_t size = T.sizeof > size_t.sizeof ? size_t.sizeof : T.sizeof;
+//         va_list vptmp = cast(va_list)((cast(size_t)vp + size - 1) &  ~(size - 1));
+//         vp = vptmp + T.sizeof;
+//         return *cast(T*)vptmp;
+        T* arg = cast(T*) vp;
+        vp = cast(va_list) ( cast(void*) vp + ( ( T.sizeof + size_t.sizeof - 1 ) & ~( size_t.sizeof - 1 ) ) );
+        return *arg;
     }
 }
 else
--- a/tango/tango/text/convert/Layout.d	Sat Jun 14 06:13:35 2008 +0200
+++ b/tango/tango/text/convert/Layout.d	Sat Jun 14 17:28:13 2008 +0200
@@ -195,6 +195,14 @@
 
         version (LLVMDC)
                 {
+                // code for LLVMDC, all targets!
+                Arg[64] arglist = void;
+                foreach (i, arg; arguments)
+                        {
+                        arglist[i] = args;
+                        args += (arg.tsize + size_t.sizeof - 1) & ~ (size_t.sizeof - 1);
+                        }
+                /*
                 static va_list get_va_arg(TypeInfo ti, ref va_list vp)
                 {
                     auto tisize = ti.tsize;
@@ -209,6 +217,7 @@
                         {
                         arglist[i] = get_va_arg(arg, args);
                         }
+                */
                 }
              else version (X86_64)
                 {
--- a/tangotests/vararg3.d	Sat Jun 14 06:13:35 2008 +0200
+++ b/tangotests/vararg3.d	Sat Jun 14 17:28:13 2008 +0200
@@ -113,12 +113,9 @@
 
 private void* get_va_arg(TypeInfo ti, ref void* vp)
 {
-    auto tisize = ti.tsize;
-    assert(tisize);
-    size_t size = tisize > size_t.sizeof ? size_t.sizeof : tisize;
-    void* vptmp = cast(void*)((cast(size_t)vp + size - 1) &  ~(size - 1));
-    vp = vptmp + tisize;
-    return vptmp;
+    void* arg = vp;
+    vp = vp + ( ( ti.tsize + size_t.sizeof - 1 ) & ~( size_t.sizeof - 1 ) );
+    return arg;
 }
 
 void print(TypeInfo ti, void* arg)