Mercurial > projects > ldc
comparison 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 |
comparison
equal
deleted
inserted
replaced
176:a074a5ff709c | 177:cea8dcfa76df |
---|---|
276 return _func; | 276 return _func; |
277 } | 277 } |
278 | 278 |
279 ////////////////////////////////////////////////////////////////////////////////////////// | 279 ////////////////////////////////////////////////////////////////////////////////////////// |
280 | 280 |
281 llvm::Value* DtoNullDelegate(llvm::Value* v) | 281 llvm::Value* DtoDelegateToNull(llvm::Value* v) |
282 { | 282 { |
283 assert(gIR); | 283 assert(gIR); |
284 d_uns64 n = (global.params.is64bit) ? 16 : 8; | 284 d_uns64 n = (global.params.is64bit) ? 16 : 8; |
285 | 285 |
286 const llvm::Type* i8p_ty = getPtrToType(llvm::Type::Int8Ty); | 286 const llvm::Type* i8p_ty = getPtrToType(llvm::Type::Int8Ty); |
325 return new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); | 325 return new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); |
326 } | 326 } |
327 | 327 |
328 ////////////////////////////////////////////////////////////////////////////////////////// | 328 ////////////////////////////////////////////////////////////////////////////////////////// |
329 | 329 |
330 llvm::Value* DtoCompareDelegate(TOK op, llvm::Value* lhs, llvm::Value* rhs) | 330 llvm::Value* DtoDelegateCompare(TOK op, llvm::Value* lhs, llvm::Value* rhs) |
331 { | 331 { |
332 llvm::ICmpInst::Predicate pred = (op == TOKequal) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE; | 332 Logger::println("Doing delegate compare"); |
333 llvm::Value* l = gIR->ir->CreateLoad(DtoGEPi(lhs,0,0,"tmp"),"tmp"); | 333 llvm::ICmpInst::Predicate pred = (op == TOKequal || op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE; |
334 llvm::Value* r = gIR->ir->CreateLoad(DtoGEPi(rhs,0,0,"tmp"),"tmp"); | 334 llvm::Value *b1, *b2; |
335 llvm::Value* b1 = gIR->ir->CreateICmp(pred,l,r,"tmp"); | 335 if (rhs == NULL) |
336 l = gIR->ir->CreateLoad(DtoGEPi(lhs,0,1,"tmp"),"tmp"); | 336 { |
337 r = gIR->ir->CreateLoad(DtoGEPi(rhs,0,1,"tmp"),"tmp"); | 337 llvm::Value* l = gIR->ir->CreateLoad(DtoGEPi(lhs,0,0,"tmp"),"tmp"); |
338 llvm::Value* b2 = gIR->ir->CreateICmp(pred,l,r,"tmp"); | 338 llvm::Value* r = llvm::Constant::getNullValue(l->getType()); |
339 b1 = gIR->ir->CreateICmp(pred,l,r,"tmp"); | |
340 l = gIR->ir->CreateLoad(DtoGEPi(lhs,0,1,"tmp"),"tmp"); | |
341 r = llvm::Constant::getNullValue(l->getType()); | |
342 b2 = gIR->ir->CreateICmp(pred,l,r,"tmp"); | |
343 } | |
344 else | |
345 { | |
346 llvm::Value* l = gIR->ir->CreateLoad(DtoGEPi(lhs,0,0,"tmp"),"tmp"); | |
347 llvm::Value* r = gIR->ir->CreateLoad(DtoGEPi(rhs,0,0,"tmp"),"tmp"); | |
348 b1 = gIR->ir->CreateICmp(pred,l,r,"tmp"); | |
349 l = gIR->ir->CreateLoad(DtoGEPi(lhs,0,1,"tmp"),"tmp"); | |
350 r = gIR->ir->CreateLoad(DtoGEPi(rhs,0,1,"tmp"),"tmp"); | |
351 b2 = gIR->ir->CreateICmp(pred,l,r,"tmp"); | |
352 } | |
339 llvm::Value* b = gIR->ir->CreateAnd(b1,b2,"tmp"); | 353 llvm::Value* b = gIR->ir->CreateAnd(b1,b2,"tmp"); |
340 if (op == TOKnotequal) | 354 if (op == TOKnotequal || op == TOKnotidentity) |
341 return gIR->ir->CreateNot(b,"tmp"); | 355 return gIR->ir->CreateNot(b,"tmp"); |
342 return b; | 356 return b; |
343 } | 357 } |
344 | 358 |
345 ////////////////////////////////////////////////////////////////////////////////////////// | 359 ////////////////////////////////////////////////////////////////////////////////////////// |
947 DtoArrayInit(lhs->getLVal(), rhs->getRVal()); | 961 DtoArrayInit(lhs->getLVal(), rhs->getRVal()); |
948 } | 962 } |
949 } | 963 } |
950 else if (t->ty == Tdelegate) { | 964 else if (t->ty == Tdelegate) { |
951 if (rhs->isNull()) | 965 if (rhs->isNull()) |
952 DtoNullDelegate(lhs->getLVal()); | 966 DtoDelegateToNull(lhs->getLVal()); |
953 else if (!rhs->inPlace()) { | 967 else if (!rhs->inPlace()) { |
954 llvm::Value* l = lhs->getLVal(); | 968 llvm::Value* l = lhs->getLVal(); |
955 llvm::Value* r = rhs->getRVal(); | 969 llvm::Value* r = rhs->getRVal(); |
956 Logger::cout() << "assign\nlhs: " << *l << "rhs: " << *r << '\n'; | 970 Logger::cout() << "assign\nlhs: " << *l << "rhs: " << *r << '\n'; |
957 DtoDelegateCopy(l, r); | 971 DtoDelegateCopy(l, r); |