Mercurial > projects > ldc
comparison gen/toobj.cpp @ 184:f5ca6bbbf1d7 trunk
[svn r200] Fixed: removed use of std.intrinsic.
Fixed: module info could potentially be masked by a previous reference, resulting in linking failure.
author | lindquist |
---|---|
date | Wed, 07 May 2008 22:01:59 +0200 |
parents | db9890b3fb64 |
children | 9d44ec83acd1 |
comparison
equal
deleted
inserted
replaced
183:3cdf4b0c75a1 | 184:f5ca6bbbf1d7 |
---|---|
187 name.append(gIR->dmodule->mangle()); | 187 name.append(gIR->dmodule->mangle()); |
188 name.append("6__ctorZ"); | 188 name.append("6__ctorZ"); |
189 | 189 |
190 std::vector<const llvm::Type*> argsTy; | 190 std::vector<const llvm::Type*> argsTy; |
191 const llvm::FunctionType* fnTy = llvm::FunctionType::get(llvm::Type::VoidTy,argsTy,false); | 191 const llvm::FunctionType* fnTy = llvm::FunctionType::get(llvm::Type::VoidTy,argsTy,false); |
192 assert(gIR->module->getFunction(name) == NULL); | |
192 llvm::Function* fn = new llvm::Function(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module); | 193 llvm::Function* fn = new llvm::Function(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module); |
193 fn->setCallingConv(llvm::CallingConv::Fast); | 194 fn->setCallingConv(llvm::CallingConv::Fast); |
194 | 195 |
195 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); | 196 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); |
196 LLVMBuilder builder(bb); | 197 LLVMBuilder builder(bb); |
220 name.append(gIR->dmodule->mangle()); | 221 name.append(gIR->dmodule->mangle()); |
221 name.append("6__dtorZ"); | 222 name.append("6__dtorZ"); |
222 | 223 |
223 std::vector<const llvm::Type*> argsTy; | 224 std::vector<const llvm::Type*> argsTy; |
224 const llvm::FunctionType* fnTy = llvm::FunctionType::get(llvm::Type::VoidTy,argsTy,false); | 225 const llvm::FunctionType* fnTy = llvm::FunctionType::get(llvm::Type::VoidTy,argsTy,false); |
226 assert(gIR->module->getFunction(name) == NULL); | |
225 llvm::Function* fn = new llvm::Function(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module); | 227 llvm::Function* fn = new llvm::Function(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module); |
226 fn->setCallingConv(llvm::CallingConv::Fast); | 228 fn->setCallingConv(llvm::CallingConv::Fast); |
227 | 229 |
228 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); | 230 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); |
229 LLVMBuilder builder(bb); | 231 LLVMBuilder builder(bb); |
253 name.append(gIR->dmodule->mangle()); | 255 name.append(gIR->dmodule->mangle()); |
254 name.append("10__unittestZ"); | 256 name.append("10__unittestZ"); |
255 | 257 |
256 std::vector<const llvm::Type*> argsTy; | 258 std::vector<const llvm::Type*> argsTy; |
257 const llvm::FunctionType* fnTy = llvm::FunctionType::get(llvm::Type::VoidTy,argsTy,false); | 259 const llvm::FunctionType* fnTy = llvm::FunctionType::get(llvm::Type::VoidTy,argsTy,false); |
260 assert(gIR->module->getFunction(name) == NULL); | |
258 llvm::Function* fn = new llvm::Function(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module); | 261 llvm::Function* fn = new llvm::Function(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module); |
259 fn->setCallingConv(llvm::CallingConv::Fast); | 262 fn->setCallingConv(llvm::CallingConv::Fast); |
260 | 263 |
261 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); | 264 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); |
262 LLVMBuilder builder(bb); | 265 LLVMBuilder builder(bb); |
381 const llvm::ArrayType* classArrTy = llvm::ArrayType::get(getPtrToType(classinfoTy), classInits.size()); | 384 const llvm::ArrayType* classArrTy = llvm::ArrayType::get(getPtrToType(classinfoTy), classInits.size()); |
382 c = llvm::ConstantArray::get(classArrTy, classInits); | 385 c = llvm::ConstantArray::get(classArrTy, classInits); |
383 std::string m_name("_D"); | 386 std::string m_name("_D"); |
384 m_name.append(mangle()); | 387 m_name.append(mangle()); |
385 m_name.append("9__classesZ"); | 388 m_name.append("9__classesZ"); |
389 assert(gIR->module->getGlobalVariable(m_name) == NULL); | |
386 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(classArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); | 390 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(classArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); |
387 c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(classArrTy->getElementType())); | 391 c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(classArrTy->getElementType())); |
388 c = DtoConstSlice(DtoConstSize_t(classInits.size()), c); | 392 c = DtoConstSlice(DtoConstSize_t(classInits.size()), c); |
389 } | 393 } |
390 else | 394 else |
436 MIname.append(mangle()); | 440 MIname.append(mangle()); |
437 MIname.append("8__ModuleZ"); | 441 MIname.append("8__ModuleZ"); |
438 | 442 |
439 // declare | 443 // declare |
440 // flags will be modified at runtime so can't make it constant | 444 // flags will be modified at runtime so can't make it constant |
441 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(moduleinfoTy, false, llvm::GlobalValue::ExternalLinkage, constMI, MIname, gIR->module); | 445 |
446 llvm::GlobalVariable* gvar = gIR->module->getGlobalVariable(MIname); | |
447 if (!gvar) gvar = new llvm::GlobalVariable(moduleinfoTy, false, llvm::GlobalValue::ExternalLinkage, NULL, MIname, gIR->module); | |
448 gvar->setInitializer(constMI); | |
442 | 449 |
443 // declare the appending array | 450 // declare the appending array |
444 const llvm::ArrayType* appendArrTy = llvm::ArrayType::get(getPtrToType(llvm::Type::Int8Ty), 1); | 451 const llvm::ArrayType* appendArrTy = llvm::ArrayType::get(getPtrToType(llvm::Type::Int8Ty), 1); |
445 std::vector<llvm::Constant*> appendInits; | 452 std::vector<llvm::Constant*> appendInits; |
446 appendInits.push_back(llvm::ConstantExpr::getBitCast(gvar, getPtrToType(llvm::Type::Int8Ty))); | 453 appendInits.push_back(llvm::ConstantExpr::getBitCast(gvar, getPtrToType(llvm::Type::Int8Ty))); |