Mercurial > projects > ldc
diff gen/tollvm.cpp @ 205:9d44ec83acd1 trunk
[svn r221] Update: Switched to the 2.3 LLVM svn branch, http://llvm.org/svn/llvm-project/llvm/branches/release_23 .
Fixed: Implemented volatile statements. Uses the LLVM memory barrier intrinsic, closes #21 .
author | lindquist |
---|---|
date | Tue, 13 May 2008 17:58:11 +0200 |
parents | e881c9b1c738 |
children | e0b6040585b4 |
line wrap: on
line diff
--- a/gen/tollvm.cpp Tue May 13 16:16:50 2008 +0200 +++ b/gen/tollvm.cpp Tue May 13 17:58:11 2008 +0200 @@ -272,6 +272,38 @@ return gIR->llvm_DeclareMemCpy64; } +// llvm.memory.barrier +static llvm::Function* LLVM_DeclareMemBarrier() +{ + if (gIR->llvm_DeclareMemBarrier == 0) { + std::vector<const llvm::Type*> pvec; + pvec.push_back(llvm::Type::Int1Ty); + pvec.push_back(llvm::Type::Int1Ty); + pvec.push_back(llvm::Type::Int1Ty); + pvec.push_back(llvm::Type::Int1Ty); + pvec.push_back(llvm::Type::Int1Ty); + llvm::FunctionType* functype = llvm::FunctionType::get(llvm::Type::VoidTy, pvec, false); + gIR->llvm_DeclareMemBarrier = llvm::cast<llvm::Function>(gIR->module->getOrInsertFunction("llvm.memory.barrier", functype)); + assert(gIR->llvm_DeclareMemBarrier != NULL); + } + return gIR->llvm_DeclareMemBarrier; +} + +void DtoMemoryBarrier(bool ll, bool ls, bool sl, bool ss, bool device) +{ + llvm::Function* fn = LLVM_DeclareMemBarrier(); + assert(fn != NULL); + + llvm::SmallVector<llvm::Value*, 5> llargs; + llargs.push_back(DtoConstBool(ll)); + llargs.push_back(DtoConstBool(ls)); + llargs.push_back(DtoConstBool(sl)); + llargs.push_back(DtoConstBool(ss)); + llargs.push_back(DtoConstBool(device)); + + llvm::CallInst::Create(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); +} + ////////////////////////////////////////////////////////////////////////////////////////// llvm::Value* DtoDelegateToNull(llvm::Value* v) @@ -291,7 +323,7 @@ llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false); llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - llvm::Value* ret = new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); + llvm::Value* ret = llvm::CallInst::Create(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); return ret; } @@ -318,7 +350,7 @@ llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false); llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - return new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); + return llvm::CallInst::Create(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); } ////////////////////////////////////////////////////////////////////////////////////////// @@ -616,7 +648,7 @@ v[0] = i0; v[1] = i1; Logger::cout() << "DtoGEP: " << *ptr << ", " << *i0 << ", " << *i1 << '\n'; - return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb?bb:gIR->scopebb()); + return llvm::GetElementPtrInst::Create(ptr, v.begin(), v.end(), var, bb?bb:gIR->scopebb()); } ////////////////////////////////////////////////////////////////////////////////////////// @@ -633,14 +665,14 @@ dst[i] = llvm::ConstantInt::get(llvm::Type::Int32Ty, src[i], false); } //ostr << '\n';*/ - return new llvm::GetElementPtrInst(ptr, dst.begin(), dst.end(), var, bb?bb:gIR->scopebb()); + return llvm::GetElementPtrInst::Create(ptr, dst.begin(), dst.end(), var, bb?bb:gIR->scopebb()); } ////////////////////////////////////////////////////////////////////////////////////////// llvm::Value* DtoGEPi(llvm::Value* ptr, unsigned i, const std::string& var, llvm::BasicBlock* bb) { - return new llvm::GetElementPtrInst(ptr, llvm::ConstantInt::get(llvm::Type::Int32Ty, i, false), var, bb?bb:gIR->scopebb()); + return llvm::GetElementPtrInst::Create(ptr, llvm::ConstantInt::get(llvm::Type::Int32Ty, i, false), var, bb?bb:gIR->scopebb()); } ////////////////////////////////////////////////////////////////////////////////////////// @@ -650,7 +682,7 @@ std::vector<llvm::Value*> v(2); v[0] = llvm::ConstantInt::get(llvm::Type::Int32Ty, i0, false); v[1] = llvm::ConstantInt::get(llvm::Type::Int32Ty, i1, false); - return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb?bb:gIR->scopebb()); + return llvm::GetElementPtrInst::Create(ptr, v.begin(), v.end(), var, bb?bb:gIR->scopebb()); } ////////////////////////////////////////////////////////////////////////////////////////// @@ -704,7 +736,7 @@ // call llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, fname); - llvm::CallInst* call = new llvm::CallInst(fn, args.begin(), args.end(), "", gIR->scopebb()); + llvm::CallInst* call = llvm::CallInst::Create(fn, args.begin(), args.end(), "", gIR->scopebb()); } ////////////////////////////////////////////////////////////////////////////////////////// @@ -1234,9 +1266,9 @@ { TY ty = DtoDType(t)->ty; if (ty == Tfloat32 || ty == Timaginary32) - return llvm::ConstantFP::get(llvm::Type::FloatTy, llvm::APFloat(float(value))); + return llvm::ConstantFP::get(llvm::APFloat(float(value))); else if (ty == Tfloat64 || ty == Timaginary64 || ty == Tfloat80 || ty == Timaginary80) - return llvm::ConstantFP::get(llvm::Type::DoubleTy, llvm::APFloat(double(value))); + return llvm::ConstantFP::get(llvm::APFloat(double(value))); } @@ -1288,7 +1320,7 @@ llargs[2] = nbytes; llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); + llvm::CallInst::Create(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); } ////////////////////////////////////////////////////////////////////////////////////////// @@ -1317,19 +1349,22 @@ llargs[2] = nbytes; llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); + llvm::CallInst::Create(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); } ////////////////////////////////////////////////////////////////////////////////////////// llvm::Value* DtoLoad(llvm::Value* src) { - return gIR->ir->CreateLoad(src,"tmp"); + llvm::Value* ld = gIR->ir->CreateLoad(src,"tmp"); + //ld->setVolatile(gIR->func()->inVolatile); + return ld; } void DtoStore(llvm::Value* src, llvm::Value* dst) { - gIR->ir->CreateStore(src,dst); + llvm::Value* st = gIR->ir->CreateStore(src,dst); + //st->setVolatile(gIR->func()->inVolatile); } bool DtoCanLoad(llvm::Value* ptr) @@ -1460,8 +1495,8 @@ // check flag and do init if not already done llvm::BasicBlock* oldend = gIR->scopeend(); - llvm::BasicBlock* initbb = new llvm::BasicBlock("ifnotinit",gIR->topfunc(),oldend); - llvm::BasicBlock* endinitbb = new llvm::BasicBlock("ifnotinitend",gIR->topfunc(),oldend); + llvm::BasicBlock* initbb = llvm::BasicBlock::Create("ifnotinit",gIR->topfunc(),oldend); + llvm::BasicBlock* endinitbb = llvm::BasicBlock::Create("ifnotinitend",gIR->topfunc(),oldend); llvm::Value* cond = gIR->ir->CreateICmpEQ(gIR->ir->CreateLoad(gflag,"tmp"),DtoConstBool(false)); gIR->ir->CreateCondBr(cond, initbb, endinitbb); gIR->scope() = IRScope(initbb,endinitbb);