Mercurial > projects > ldc
diff gen/tollvm.cpp @ 177:cea8dcfa76df trunk
[svn r193] Fixed: abstract classes implementing interfaces now output proper Interface info arrays. (null vtables).
Did a little renaming of delegate utils.
author | lindquist |
---|---|
date | Wed, 07 May 2008 04:45:51 +0200 |
parents | db9890b3fb64 |
children | 3aed08fb64f4 |
line wrap: on
line diff
--- a/gen/tollvm.cpp Wed May 07 00:58:36 2008 +0200 +++ b/gen/tollvm.cpp Wed May 07 04:45:51 2008 +0200 @@ -278,7 +278,7 @@ ////////////////////////////////////////////////////////////////////////////////////////// -llvm::Value* DtoNullDelegate(llvm::Value* v) +llvm::Value* DtoDelegateToNull(llvm::Value* v) { assert(gIR); d_uns64 n = (global.params.is64bit) ? 16 : 8; @@ -327,17 +327,31 @@ ////////////////////////////////////////////////////////////////////////////////////////// -llvm::Value* DtoCompareDelegate(TOK op, llvm::Value* lhs, llvm::Value* rhs) +llvm::Value* DtoDelegateCompare(TOK op, llvm::Value* lhs, llvm::Value* rhs) { - llvm::ICmpInst::Predicate pred = (op == TOKequal) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE; - llvm::Value* l = gIR->ir->CreateLoad(DtoGEPi(lhs,0,0,"tmp"),"tmp"); - llvm::Value* r = gIR->ir->CreateLoad(DtoGEPi(rhs,0,0,"tmp"),"tmp"); - llvm::Value* b1 = gIR->ir->CreateICmp(pred,l,r,"tmp"); - l = gIR->ir->CreateLoad(DtoGEPi(lhs,0,1,"tmp"),"tmp"); - r = gIR->ir->CreateLoad(DtoGEPi(rhs,0,1,"tmp"),"tmp"); - llvm::Value* b2 = gIR->ir->CreateICmp(pred,l,r,"tmp"); + Logger::println("Doing delegate compare"); + llvm::ICmpInst::Predicate pred = (op == TOKequal || op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE; + llvm::Value *b1, *b2; + if (rhs == NULL) + { + llvm::Value* l = gIR->ir->CreateLoad(DtoGEPi(lhs,0,0,"tmp"),"tmp"); + llvm::Value* r = llvm::Constant::getNullValue(l->getType()); + b1 = gIR->ir->CreateICmp(pred,l,r,"tmp"); + l = gIR->ir->CreateLoad(DtoGEPi(lhs,0,1,"tmp"),"tmp"); + r = llvm::Constant::getNullValue(l->getType()); + b2 = gIR->ir->CreateICmp(pred,l,r,"tmp"); + } + else + { + llvm::Value* l = gIR->ir->CreateLoad(DtoGEPi(lhs,0,0,"tmp"),"tmp"); + llvm::Value* r = gIR->ir->CreateLoad(DtoGEPi(rhs,0,0,"tmp"),"tmp"); + b1 = gIR->ir->CreateICmp(pred,l,r,"tmp"); + l = gIR->ir->CreateLoad(DtoGEPi(lhs,0,1,"tmp"),"tmp"); + r = gIR->ir->CreateLoad(DtoGEPi(rhs,0,1,"tmp"),"tmp"); + b2 = gIR->ir->CreateICmp(pred,l,r,"tmp"); + } llvm::Value* b = gIR->ir->CreateAnd(b1,b2,"tmp"); - if (op == TOKnotequal) + if (op == TOKnotequal || op == TOKnotidentity) return gIR->ir->CreateNot(b,"tmp"); return b; } @@ -949,7 +963,7 @@ } else if (t->ty == Tdelegate) { if (rhs->isNull()) - DtoNullDelegate(lhs->getLVal()); + DtoDelegateToNull(lhs->getLVal()); else if (!rhs->inPlace()) { llvm::Value* l = lhs->getLVal(); llvm::Value* r = rhs->getRVal();