diff 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
line wrap: on
line diff
--- a/gen/toobj.cpp	Wed May 07 20:22:42 2008 +0200
+++ b/gen/toobj.cpp	Wed May 07 22:01:59 2008 +0200
@@ -189,6 +189,7 @@
 
     std::vector<const llvm::Type*> argsTy;
     const llvm::FunctionType* fnTy = llvm::FunctionType::get(llvm::Type::VoidTy,argsTy,false);
+    assert(gIR->module->getFunction(name) == NULL);
     llvm::Function* fn = new llvm::Function(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module);
     fn->setCallingConv(llvm::CallingConv::Fast);
 
@@ -222,6 +223,7 @@
 
     std::vector<const llvm::Type*> argsTy;
     const llvm::FunctionType* fnTy = llvm::FunctionType::get(llvm::Type::VoidTy,argsTy,false);
+    assert(gIR->module->getFunction(name) == NULL);
     llvm::Function* fn = new llvm::Function(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module);
     fn->setCallingConv(llvm::CallingConv::Fast);
 
@@ -255,6 +257,7 @@
 
     std::vector<const llvm::Type*> argsTy;
     const llvm::FunctionType* fnTy = llvm::FunctionType::get(llvm::Type::VoidTy,argsTy,false);
+    assert(gIR->module->getFunction(name) == NULL);
     llvm::Function* fn = new llvm::Function(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module);
     fn->setCallingConv(llvm::CallingConv::Fast);
 
@@ -383,6 +386,7 @@
         std::string m_name("_D");
         m_name.append(mangle());
         m_name.append("9__classesZ");
+        assert(gIR->module->getGlobalVariable(m_name) == NULL);
         llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(classArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module);
         c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(classArrTy->getElementType()));
         c = DtoConstSlice(DtoConstSize_t(classInits.size()), c);
@@ -438,7 +442,10 @@
 
     // declare
     // flags will be modified at runtime so can't make it constant
-    llvm::GlobalVariable* gvar = new llvm::GlobalVariable(moduleinfoTy, false, llvm::GlobalValue::ExternalLinkage, constMI, MIname, gIR->module);
+
+    llvm::GlobalVariable* gvar = gIR->module->getGlobalVariable(MIname);
+    if (!gvar) gvar = new llvm::GlobalVariable(moduleinfoTy, false, llvm::GlobalValue::ExternalLinkage, NULL, MIname, gIR->module);
+    gvar->setInitializer(constMI);
 
     // declare the appending array
     const llvm::ArrayType* appendArrTy = llvm::ArrayType::get(getPtrToType(llvm::Type::Int8Ty), 1);