diff gen/tollvm.cpp @ 207:e0b6040585b4 trunk

[svn r223] Fixed: assert with message could be broken. Fixed: array length exp could fail on slice.
author lindquist
date Tue, 13 May 2008 21:40:39 +0200
parents 9d44ec83acd1
children c4c9b4ac021b
line wrap: on
line diff
--- a/gen/tollvm.cpp	Tue May 13 18:07:03 2008 +0200
+++ b/gen/tollvm.cpp	Tue May 13 21:40:39 2008 +0200
@@ -712,16 +712,35 @@
 
     // func
     const char* fname = msg ? "_d_assert_msg" : "_d_assert";
+    llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, fname);
+
+    c = DtoConstString(loc->filename);
 
     // msg param
-    if (msg) args.push_back(msg->getRVal());
+    if (msg)
+    {
+        if (DSliceValue* s = msg->isSlice())
+        {
+            llvm::AllocaInst* alloc = gIR->func()->msgArg;
+            if (!alloc)
+            {
+                alloc = new llvm::AllocaInst(c->getType(), ".assertmsg", gIR->topallocapoint());
+                DtoSetArray(alloc, DtoArrayLen(s), DtoArrayPtr(s));
+                gIR->func()->msgArg = alloc;
+            }
+            args.push_back(alloc);
+        }
+        else
+        {
+            args.push_back(msg->getRVal());
+        }
+    }
 
     // file param
-    c = DtoConstString(loc->filename);
     llvm::AllocaInst* alloc = gIR->func()->srcfileArg;
     if (!alloc)
     {
-        alloc = new llvm::AllocaInst(c->getType(), "srcfile", gIR->topallocapoint());
+        alloc = new llvm::AllocaInst(c->getType(), ".srcfile", gIR->topallocapoint());
         gIR->func()->srcfileArg = alloc;
     }
     llvm::Value* ptr = DtoGEPi(alloc, 0,0, "tmp");
@@ -735,7 +754,6 @@
     args.push_back(c);
 
     // call
-    llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, fname);
     llvm::CallInst* call = llvm::CallInst::Create(fn, args.begin(), args.end(), "", gIR->scopebb());
 }