comparison gen/tollvm.cpp @ 94:61615fa85940 trunk

[svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca"). Added support for array .sort and .reverse properties. Fixed some bugs with pointer arithmetic. Disabled some DMD AST optimizations that was messing things up, destroying valuable information. Added a KDevelop project file, this is what I use for coding LLVMDC now :) Other minor stuff.
author lindquist
date Mon, 12 Nov 2007 06:32:46 +0100
parents 08508eebbb3e
children ce7ed8f59b99
comparison
equal deleted inserted replaced
93:08508eebbb3e 94:61615fa85940
795 return _init; 795 return _init;
796 } 796 }
797 797
798 ////////////////////////////////////////////////////////////////////////////////////////// 798 //////////////////////////////////////////////////////////////////////////////////////////
799 799
800 DValue* DtoInitializer(Initializer* init, DValue* v) 800 DValue* DtoInitializer(Initializer* init)
801 { 801 {
802 if (ExpInitializer* ex = init->isExpInitializer()) 802 if (ExpInitializer* ex = init->isExpInitializer())
803 { 803 {
804 Logger::println("expression initializer"); 804 Logger::println("expression initializer");
805 assert(ex->exp); 805 assert(ex->exp);
806 if (v) gIR->exps.push_back(IRExp(NULL,ex->exp,v));
807 return ex->exp->toElem(gIR); 806 return ex->exp->toElem(gIR);
808 if (v) gIR->exps.pop_back();
809 } 807 }
810 else if (init->isVoidInitializer()) 808 else if (init->isVoidInitializer())
811 { 809 {
812 // do nothing 810 // do nothing
813 } 811 }
1048 return ret->getType() == ptr->getType() ? ret : new llvm::BitCastInst(ret,ptr->getType(),"tmp",gIR->scopebb()); 1046 return ret->getType() == ptr->getType() ? ret : new llvm::BitCastInst(ret,ptr->getType(),"tmp",gIR->scopebb());
1049 } 1047 }
1050 1048
1051 ////////////////////////////////////////////////////////////////////////////////////////// 1049 //////////////////////////////////////////////////////////////////////////////////////////
1052 1050
1053 void DtoAssert(llvm::Value* cond, llvm::Value* loc, llvm::Value* msg) 1051 void DtoAssert(llvm::Value* cond, Loc* loc, DValue* msg)
1054 { 1052 {
1055 assert(loc); 1053 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_assert");
1054 const llvm::FunctionType* fnt = fn->getFunctionType();
1055
1056 std::vector<llvm::Value*> llargs; 1056 std::vector<llvm::Value*> llargs;
1057 llargs.resize(3); 1057 llargs.resize(3);
1058 llargs[0] = cond ? DtoBoolean(cond) : llvm::ConstantInt::getFalse(); 1058 llargs[0] = cond ? DtoBoolean(cond) : llvm::ConstantInt::getFalse();
1059 llargs[1] = loc; 1059 llargs[1] = DtoConstUint(loc->linnum);
1060 llargs[2] = msg ? msg : llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty)); 1060 llargs[2] = msg ? msg->getRVal() : llvm::Constant::getNullValue(fnt->getParamType(2));
1061 1061
1062 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_assert");
1063 assert(fn); 1062 assert(fn);
1064 llvm::CallInst* call = new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); 1063 llvm::CallInst* call = new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb());
1065 call->setCallingConv(llvm::CallingConv::C); 1064 call->setCallingConv(llvm::CallingConv::C);
1066 } 1065 }
1067 1066
1299 } 1298 }
1300 else { 1299 else {
1301 llvm::Value* r = rhs->getRVal(); 1300 llvm::Value* r = rhs->getRVal();
1302 llvm::Value* l = lhs->getLVal(); 1301 llvm::Value* l = lhs->getLVal();
1303 Logger::cout() << "assign\nlhs: " << *l << "rhs: " << *r << '\n'; 1302 Logger::cout() << "assign\nlhs: " << *l << "rhs: " << *r << '\n';
1303 const llvm::Type* lit = l->getType()->getContainedType(0);
1304 if (r->getType() != lit) {
1305 r = DtoBitCast(r, lit);
1306 Logger::cout() << "really assign\nlhs: " << *l << "rhs: " << *r << '\n';
1307 }
1304 gIR->ir->CreateStore(r, l); 1308 gIR->ir->CreateStore(r, l);
1305 } 1309 }
1306 } 1310 }
1307 1311
1308 ////////////////////////////////////////////////////////////////////////////////////////// 1312 //////////////////////////////////////////////////////////////////////////////////////////
1402 llvm::Value* DtoBitCast(llvm::Value* v, const llvm::Type* t) 1406 llvm::Value* DtoBitCast(llvm::Value* v, const llvm::Type* t)
1403 { 1407 {
1404 return gIR->ir->CreateBitCast(v, t, "tmp"); 1408 return gIR->ir->CreateBitCast(v, t, "tmp");
1405 } 1409 }
1406 1410
1411 const llvm::PointerType* isaPointer(llvm::Value* v)
1412 {
1413 return llvm::dyn_cast<llvm::PointerType>(v->getType());
1414 }
1415
1416 const llvm::ArrayType* isaArray(llvm::Value* v)
1417 {
1418 return llvm::dyn_cast<llvm::ArrayType>(v->getType());
1419 }
1420
1421 const llvm::StructType* isaStruct(llvm::Value* v)
1422 {
1423 return llvm::dyn_cast<llvm::StructType>(v->getType());
1424 }
1425
1426 llvm::Constant* isaConstant(llvm::Value* v)
1427 {
1428 return llvm::dyn_cast<llvm::Constant>(v);
1429 }
1430
1431 llvm::ConstantInt* isaConstantInt(llvm::Value* v)
1432 {
1433 return llvm::dyn_cast<llvm::ConstantInt>(v);
1434 }
1435
1407 ////////////////////////////////////////////////////////////////////////////////////////// 1436 //////////////////////////////////////////////////////////////////////////////////////////
1408 1437
1409 bool DtoIsTemplateInstance(Dsymbol* s) 1438 bool DtoIsTemplateInstance(Dsymbol* s)
1410 { 1439 {
1411 if (!s) return false; 1440 if (!s) return false;
1429 llvm::BasicBlock* initbb = new llvm::BasicBlock("ifnotinit",gIR->topfunc(),oldend); 1458 llvm::BasicBlock* initbb = new llvm::BasicBlock("ifnotinit",gIR->topfunc(),oldend);
1430 llvm::BasicBlock* endinitbb = new llvm::BasicBlock("ifnotinitend",gIR->topfunc(),oldend); 1459 llvm::BasicBlock* endinitbb = new llvm::BasicBlock("ifnotinitend",gIR->topfunc(),oldend);
1431 llvm::Value* cond = gIR->ir->CreateICmpEQ(gIR->ir->CreateLoad(gflag,"tmp"),DtoConstBool(false)); 1460 llvm::Value* cond = gIR->ir->CreateICmpEQ(gIR->ir->CreateLoad(gflag,"tmp"),DtoConstBool(false));
1432 gIR->ir->CreateCondBr(cond, initbb, endinitbb); 1461 gIR->ir->CreateCondBr(cond, initbb, endinitbb);
1433 gIR->scope() = IRScope(initbb,endinitbb); 1462 gIR->scope() = IRScope(initbb,endinitbb);
1434 DValue* ie = DtoInitializer(init, NULL); 1463 DValue* ie = DtoInitializer(init);
1435 if (!ie->inPlace()) { 1464 if (!ie->inPlace()) {
1436 DValue* dst = new DVarValue(t, gvar, true); 1465 DValue* dst = new DVarValue(t, gvar, true);
1437 DtoAssign(dst, ie); 1466 DtoAssign(dst, ie);
1438 } 1467 }
1439 gIR->ir->CreateStore(DtoConstBool(true), gflag); 1468 gIR->ir->CreateStore(DtoConstBool(true), gflag);