changeset 69:2b5a2eaa88be trunk

[svn r73] Identity expression for dynamic array and null was broken.
author lindquist
date Sun, 28 Oct 2007 04:23:38 +0100
parents c4b3f5d2cd9b
children fb265a6efea1
files gen/arrays.c gen/arrays.h gen/toir.c gen/tollvm.c gen/toobj.c gen/typinf.c test/bug37.d test/typeinfo3.d test/typeinfo9.d
diffstat 9 files changed, 77 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/gen/arrays.c	Sun Oct 28 03:14:29 2007 +0100
+++ b/gen/arrays.c	Sun Oct 28 04:23:38 2007 +0100
@@ -409,7 +409,7 @@
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
-llvm::Constant* LLVM_DtoConstantSlice(llvm::Constant* dim, llvm::Constant* ptr)
+llvm::Constant* LLVM_DtoConstSlice(llvm::Constant* dim, llvm::Constant* ptr)
 {
     std::vector<const llvm::Type*> types;
     types.push_back(dim->getType());
@@ -622,31 +622,46 @@
 //////////////////////////////////////////////////////////////////////////////////////////
 llvm::Value* LLVM_DtoDynArrayIs(TOK op, llvm::Value* l, llvm::Value* r)
 {
-    assert(l->getType() == r->getType());
-
     llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE;
 
-    llvm::Value* ll = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,0, "tmp"),"tmp");
-    llvm::Value* rl = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,0, "tmp"),"tmp");
-    llvm::Value* b1 = gIR->ir->CreateICmp(pred,ll,rl,"tmp");
+    if (r == NULL) {
+        llvm::Value* ll = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,0, "tmp"),"tmp");
+        llvm::Value* rl = LLVM_DtoConstSize_t(0);
+        llvm::Value* b1 = gIR->ir->CreateICmp(pred,ll,rl,"tmp");
+
+        llvm::Value* lp = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,1, "tmp"),"tmp");
+        const llvm::PointerType* pty = llvm::cast<llvm::PointerType>(lp->getType());
+        llvm::Value* rp = llvm::ConstantPointerNull::get(pty);
+        llvm::Value* b2 = gIR->ir->CreateICmp(pred,lp,rp,"tmp");
 
-    llvm::Value* lp = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,1, "tmp"),"tmp");
-    llvm::Value* rp = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,1, "tmp"),"tmp");
-    llvm::Value* b2 = gIR->ir->CreateICmp(pred,lp,rp,"tmp");
+        llvm::Value* b = gIR->ir->CreateAnd(b1,b2,"tmp");
+        return b;
+    }
+    else {
+        assert(l->getType() == r->getType());
 
-    llvm::Value* b = gIR->ir->CreateAnd(b1,b2,"tmp");
-    return b;
+        llvm::Value* ll = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,0, "tmp"),"tmp");
+        llvm::Value* rl = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,0, "tmp"),"tmp");
+        llvm::Value* b1 = gIR->ir->CreateICmp(pred,ll,rl,"tmp");
+
+        llvm::Value* lp = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,1, "tmp"),"tmp");
+        llvm::Value* rp = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,1, "tmp"),"tmp");
+        llvm::Value* b2 = gIR->ir->CreateICmp(pred,lp,rp,"tmp");
+
+        llvm::Value* b = gIR->ir->CreateAnd(b1,b2,"tmp");
+        return b;
+    }
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
-llvm::Constant* LLVM_DtoConstantStaticArray(const llvm::Type* t, llvm::Constant* c)
+llvm::Constant* LLVM_DtoConstStaticArray(const llvm::Type* t, llvm::Constant* c)
 {
     assert(llvm::isa<llvm::ArrayType>(t));
     const llvm::ArrayType* at = llvm::cast<llvm::ArrayType>(t);
 
     if (llvm::isa<llvm::ArrayType>(at->getElementType()))
     {
-        c = LLVM_DtoConstantStaticArray(at->getElementType(), c);
+        c = LLVM_DtoConstStaticArray(at->getElementType(), c);
     }
     else {
         assert(at->getElementType() == c->getType());
--- a/gen/arrays.h	Sun Oct 28 03:14:29 2007 +0100
+++ b/gen/arrays.h	Sun Oct 28 04:23:38 2007 +0100
@@ -5,8 +5,8 @@
 const llvm::ArrayType* LLVM_DtoStaticArrayType(Type* t);
 
 llvm::Constant* LLVM_DtoConstArrayInitializer(ArrayInitializer* si);
-llvm::Constant* LLVM_DtoConstantSlice(llvm::Constant* dim, llvm::Constant* ptr);
-llvm::Constant* LLVM_DtoConstantStaticArray(const llvm::Type* t, llvm::Constant* c);
+llvm::Constant* LLVM_DtoConstSlice(llvm::Constant* dim, llvm::Constant* ptr);
+llvm::Constant* LLVM_DtoConstStaticArray(const llvm::Type* t, llvm::Constant* c);
 
 void LLVM_DtoArrayCopy(elem* dst, elem* src);
 void LLVM_DtoArrayInit(llvm::Value* l, llvm::Value* r);
--- a/gen/toir.c	Sun Oct 28 03:14:29 2007 +0100
+++ b/gen/toir.c	Sun Oct 28 04:23:38 2007 +0100
@@ -425,7 +425,7 @@
 
     if (t->ty == Tarray) {
         llvm::Constant* clen = llvm::ConstantInt::get(LLVM_DtoSize_t(),len,false);
-        return LLVM_DtoConstantSlice(clen, arrptr);
+        return LLVM_DtoConstSlice(clen, arrptr);
     }
 
     assert(0);
@@ -2539,20 +2539,24 @@
     elem* e = new elem;
 
     llvm::Value* l = u->getValue();
-    llvm::Value* r = 0;
-    if (v->type == elem::NUL)
-    r = llvm::ConstantPointerNull::get(llvm::cast<llvm::PointerType>(l->getType()));
-    else
-    r = v->getValue();
+    llvm::Value* r = v->getValue();
 
     Type* t1 = LLVM_DtoDType(e1->type);
 
     if (t1->ty == Tarray) {
-        assert(l->getType() == r->getType());
+        if (v->type == elem::NUL) {
+            r = NULL;
+        }
+        else {
+            assert(l->getType() == r->getType());
+        }
         e->val = LLVM_DtoDynArrayIs(op,l,r);
     }
     else {
         llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE;
+        if (t1->ty == Tpointer && v->type == elem::NUL && l->getType() != r->getType()) {
+            r = llvm::ConstantPointerNull::get(llvm::cast<llvm::PointerType>(l->getType()));
+        }
         e->val = new llvm::ICmpInst(pred, l, r, "tmp", p->scopebb());
     }
     e->type = elem::VAL;
--- a/gen/tollvm.c	Sun Oct 28 03:14:29 2007 +0100
+++ b/gen/tollvm.c	Sun Oct 28 04:23:38 2007 +0100
@@ -1392,7 +1392,7 @@
     llvm::GlobalVariable* gvar = new llvm::GlobalVariable(
         init->getType(), true,llvm::GlobalValue::InternalLinkage, init, "stringliteral", gIR->module);
     llvm::Constant* idxs[2] = { LLVM_DtoConstUint(0), LLVM_DtoConstUint(0) };
-    return LLVM_DtoConstantSlice(
+    return LLVM_DtoConstSlice(
         LLVM_DtoConstSize_t(s.length()),
         llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2)
     );
--- a/gen/toobj.c	Sun Oct 28 03:14:29 2007 +0100
+++ b/gen/toobj.c	Sun Oct 28 04:23:38 2007 +0100
@@ -547,7 +547,7 @@
                 // array single value init
                 else if (llvm::isa<llvm::ArrayType>(_type))
                 {
-                    _init = LLVM_DtoConstantStaticArray(_type, _init);
+                    _init = LLVM_DtoConstStaticArray(_type, _init);
                 }
                 else {
                     Logger::cout() << "Unexpected initializer type: " << *_type << '\n';
--- a/gen/typinf.c	Sun Oct 28 03:14:29 2007 +0100
+++ b/gen/typinf.c	Sun Oct 28 04:23:38 2007 +0100
@@ -312,9 +312,22 @@
     assert(sinits.back()->getType() == initZ->getOperand(2)->getType());
 
     // void[] init
-    //const llvm::PointerType* initpt = llvm::PointerType::get(llvm::Type::Int8Ty);
-    //sinits.push_back(LLVM_DtoConstantSlice(LLVM_DtoConstSize_t(0), llvm::ConstantPointerNull::get(initpt)));
-    sinits.push_back(initZ->getOperand(3));
+    const llvm::PointerType* initpt = llvm::PointerType::get(llvm::Type::Int8Ty);
+    if (tinfo->isZeroInit() || !sd->init) // 0 initializer, or the same as the base type
+    {
+        sinits.push_back(LLVM_DtoConstSlice(LLVM_DtoConstSize_t(0), llvm::ConstantPointerNull::get(initpt)));
+        //sinits.push_back(initZ->getOperand(3));
+    }
+    else
+    {
+        llvm::Constant* ci = LLVM_DtoConstInitializer(sd->basetype, sd->init);
+        std::string ciname(sd->mangle());
+        ciname.append("__init");
+        llvm::GlobalVariable* civar = new llvm::GlobalVariable(LLVM_DtoType(sd->basetype),true,llvm::GlobalValue::InternalLinkage,ci,ciname,gIR->module);
+        llvm::Constant* cicast = llvm::ConstantExpr::getBitCast(civar, initpt);
+        size_t cisize = gTargetData->getTypeSize(LLVM_DtoType(sd->basetype));
+        sinits.push_back(LLVM_DtoConstSlice(LLVM_DtoConstSize_t(cisize), cicast));
+    }
 
     // create the symbol
     llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/bug37.d	Sun Oct 28 04:23:38 2007 +0100
@@ -0,0 +1,7 @@
+module bug37;
+
+void main()
+{
+    char[] a = "hello";
+    assert(a !is null);
+}
--- a/test/typeinfo3.d	Sun Oct 28 03:14:29 2007 +0100
+++ b/test/typeinfo3.d	Sun Oct 28 04:23:38 2007 +0100
@@ -10,4 +10,5 @@
     assert(ti.toString() == "typeinfo3.int_t");
     assert(ti.next !is null);
     assert(ti.next.toString() == "int");
+    assert(ti.init is null);
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/typeinfo9.d	Sun Oct 28 04:23:38 2007 +0100
@@ -0,0 +1,10 @@
+module typeinfo9;
+
+typedef int int_t = 42;
+
+void main()
+{
+    auto i = typeid(int_t).init;
+    assert(i.length == int_t.sizeof);
+    assert(*cast(int_t*)i.ptr == 42);
+}