# HG changeset patch # User lindquist # Date 1193541818 -3600 # Node ID 2b5a2eaa88bee2fd86d49c8cb070971ee7b80ab0 # Parent c4b3f5d2cd9bccc804bad918cc0114199da280db [svn r73] Identity expression for dynamic array and null was broken. diff -r c4b3f5d2cd9b -r 2b5a2eaa88be gen/arrays.c --- 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 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(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(t)); const llvm::ArrayType* at = llvm::cast(t); if (llvm::isa(at->getElementType())) { - c = LLVM_DtoConstantStaticArray(at->getElementType(), c); + c = LLVM_DtoConstStaticArray(at->getElementType(), c); } else { assert(at->getElementType() == c->getType()); diff -r c4b3f5d2cd9b -r 2b5a2eaa88be gen/arrays.h --- 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); diff -r c4b3f5d2cd9b -r 2b5a2eaa88be gen/toir.c --- 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(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(l->getType())); + } e->val = new llvm::ICmpInst(pred, l, r, "tmp", p->scopebb()); } e->type = elem::VAL; diff -r c4b3f5d2cd9b -r 2b5a2eaa88be gen/tollvm.c --- 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) ); diff -r c4b3f5d2cd9b -r 2b5a2eaa88be gen/toobj.c --- 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(_type)) { - _init = LLVM_DtoConstantStaticArray(_type, _init); + _init = LLVM_DtoConstStaticArray(_type, _init); } else { Logger::cout() << "Unexpected initializer type: " << *_type << '\n'; diff -r c4b3f5d2cd9b -r 2b5a2eaa88be gen/typinf.c --- 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); diff -r c4b3f5d2cd9b -r 2b5a2eaa88be test/bug37.d --- /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); +} diff -r c4b3f5d2cd9b -r 2b5a2eaa88be test/typeinfo3.d --- 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); } diff -r c4b3f5d2cd9b -r 2b5a2eaa88be test/typeinfo9.d --- /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); +}