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