diff gen/tollvm.cpp @ 94:61615fa85940 trunk

[svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca"). Added support for array .sort and .reverse properties. Fixed some bugs with pointer arithmetic. Disabled some DMD AST optimizations that was messing things up, destroying valuable information. Added a KDevelop project file, this is what I use for coding LLVMDC now :) Other minor stuff.
author lindquist
date Mon, 12 Nov 2007 06:32:46 +0100
parents 08508eebbb3e
children ce7ed8f59b99
line wrap: on
line diff
--- a/gen/tollvm.cpp	Thu Nov 08 19:21:05 2007 +0100
+++ b/gen/tollvm.cpp	Mon Nov 12 06:32:46 2007 +0100
@@ -797,15 +797,13 @@
 
 //////////////////////////////////////////////////////////////////////////////////////////
 
-DValue* DtoInitializer(Initializer* init, DValue* v)
+DValue* DtoInitializer(Initializer* init)
 {
     if (ExpInitializer* ex = init->isExpInitializer())
     {
         Logger::println("expression initializer");
         assert(ex->exp);
-        if (v) gIR->exps.push_back(IRExp(NULL,ex->exp,v));
         return ex->exp->toElem(gIR);
-        if (v) gIR->exps.pop_back();
     }
     else if (init->isVoidInitializer())
     {
@@ -1050,16 +1048,17 @@
 
 //////////////////////////////////////////////////////////////////////////////////////////
 
-void DtoAssert(llvm::Value* cond, llvm::Value* loc, llvm::Value* msg)
+void DtoAssert(llvm::Value* cond, Loc* loc, DValue* msg)
 {
-    assert(loc);
+    llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_assert");
+    const llvm::FunctionType* fnt = fn->getFunctionType();
+
     std::vector<llvm::Value*> llargs;
     llargs.resize(3);
     llargs[0] = cond ? DtoBoolean(cond) : llvm::ConstantInt::getFalse();
-    llargs[1] = loc;
-    llargs[2] = msg ? msg : llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty));
+    llargs[1] = DtoConstUint(loc->linnum);
+    llargs[2] = msg ? msg->getRVal() : llvm::Constant::getNullValue(fnt->getParamType(2));
 
-    llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_assert");
     assert(fn);
     llvm::CallInst* call = new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb());
     call->setCallingConv(llvm::CallingConv::C);
@@ -1301,6 +1300,11 @@
         llvm::Value* r = rhs->getRVal();
         llvm::Value* l = lhs->getLVal();
         Logger::cout() << "assign\nlhs: " << *l << "rhs: " << *r << '\n';
+        const llvm::Type* lit = l->getType()->getContainedType(0);
+        if (r->getType() != lit) {
+            r = DtoBitCast(r, lit);
+            Logger::cout() << "really assign\nlhs: " << *l << "rhs: " << *r << '\n';
+        }
         gIR->ir->CreateStore(r, l);
     }
 }
@@ -1404,6 +1408,31 @@
     return gIR->ir->CreateBitCast(v, t, "tmp");
 }
 
+const llvm::PointerType* isaPointer(llvm::Value* v)
+{
+    return llvm::dyn_cast<llvm::PointerType>(v->getType());
+}
+
+const llvm::ArrayType* isaArray(llvm::Value* v)
+{
+    return llvm::dyn_cast<llvm::ArrayType>(v->getType());
+}
+
+const llvm::StructType* isaStruct(llvm::Value* v)
+{
+    return llvm::dyn_cast<llvm::StructType>(v->getType());
+}
+
+llvm::Constant* isaConstant(llvm::Value* v)
+{
+    return llvm::dyn_cast<llvm::Constant>(v);
+}
+
+llvm::ConstantInt* isaConstantInt(llvm::Value* v)
+{
+    return llvm::dyn_cast<llvm::ConstantInt>(v);
+}
+
 //////////////////////////////////////////////////////////////////////////////////////////
 
 bool DtoIsTemplateInstance(Dsymbol* s)
@@ -1431,7 +1460,7 @@
     llvm::Value* cond = gIR->ir->CreateICmpEQ(gIR->ir->CreateLoad(gflag,"tmp"),DtoConstBool(false));
     gIR->ir->CreateCondBr(cond, initbb, endinitbb);
     gIR->scope() = IRScope(initbb,endinitbb);
-    DValue* ie = DtoInitializer(init, NULL);
+    DValue* ie = DtoInitializer(init);
     if (!ie->inPlace()) {
         DValue* dst = new DVarValue(t, gvar, true);
         DtoAssign(dst, ie);