Mercurial > projects > ldc
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); |