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);