Index: lib/CodeGen/CodeGenModule.cpp
===================================================================
--- lib/CodeGen/CodeGenModule.cpp	(revision 48734)
+++ lib/CodeGen/CodeGenModule.cpp	(working copy)
@@ -71,47 +77,50 @@
 }
 
 void CodeGenModule::EmitGlobalCtors() {
-  // Get the type of @llvm.global_ctors
-  std::vector<const llvm::Type*> CtorFields;
-  CtorFields.push_back(llvm::IntegerType::get(32));
-  // Constructor function type
-  std::vector<const llvm::Type*> VoidArgs;
-  llvm::FunctionType* CtorFuncTy = llvm::FunctionType::get(
-    llvm::Type::VoidTy,
-    VoidArgs,
-    false);
-  // i32, function type pair
-  const llvm::Type *FPType = llvm::PointerType::getUnqual(CtorFuncTy);
-  llvm::StructType* CtorStructTy = 
-  llvm::StructType::get(llvm::Type::Int32Ty, FPType, NULL);
-  // Array of fields
-  llvm::ArrayType* GlobalCtorsTy = 
-    llvm::ArrayType::get(CtorStructTy, GlobalCtors.size());
-  
-  // Define the global variable
-  llvm::GlobalVariable *GlobalCtorsVal =
-    new llvm::GlobalVariable(GlobalCtorsTy, false,
-                             llvm::GlobalValue::AppendingLinkage,
-                             (llvm::Constant*)0, "llvm.global_ctors",
-                             &TheModule);
+  if (!GlobalCtors.empty()) {
+    // Get the type of @llvm.global_ctors
+    std::vector<const llvm::Type*> CtorFields;
+    CtorFields.push_back(llvm::IntegerType::get(32));
+    // Constructor function type
+    std::vector<const llvm::Type*> VoidArgs;
+    llvm::FunctionType* CtorFuncTy = llvm::FunctionType::get(
+      llvm::Type::VoidTy,
+      VoidArgs,
+      false);
+    // i32, function type pair
+    CtorFields.push_back(llvm::PointerType::getUnqual(CtorFuncTy));
+    llvm::StructType* CtorStructTy = llvm::StructType::get(CtorFields, false);
+    // Array of fields
+    llvm::ArrayType* GlobalCtorsTy = llvm::ArrayType::get(CtorStructTy,
+        GlobalCtors.size());
+    
+    const std::string GlobalCtorsVar = std::string("llvm.global_ctors");
+    // Define the global variable
+    llvm::GlobalVariable *GlobalCtorsVal = new llvm::GlobalVariable(
+      GlobalCtorsTy,
+      false,
+      llvm::GlobalValue::AppendingLinkage,
+      (llvm::Constant*)0, 
+      GlobalCtorsVar,
+      &TheModule);
 
-  // Populate the array
-  std::vector<llvm::Constant*> CtorValues;
-  llvm::Constant *MagicNumber = 
-    llvm::ConstantInt::get(llvm::Type::Int32Ty, 65535, false);
-  std::vector<llvm::Constant*> StructValues;
-  for (std::vector<llvm::Constant*>::iterator I = GlobalCtors.begin(), 
-       E = GlobalCtors.end(); I != E; ++I) {
-    StructValues.clear();
-    StructValues.push_back(MagicNumber);
-    StructValues.push_back(*I);
+    // Populate the array
+    std::vector<llvm::Constant*> CtorValues;
+    llvm::Constant *MagicNumber = llvm::ConstantInt::get(llvm::IntegerType::Int32Ty,
+        65535,
+        false);
+    for (std::vector<llvm::Constant*>::iterator I = GlobalCtors.begin(), 
+        E = GlobalCtors.end(); I != E; ++I) {
+      std::vector<llvm::Constant*> StructValues;
+      StructValues.push_back(MagicNumber);
+      StructValues.push_back(*I);
 
-    CtorValues.push_back(llvm::ConstantStruct::get(CtorStructTy, StructValues));
+      llvm::Constant* CtorEntry = llvm::ConstantStruct::get(CtorStructTy, StructValues);
+      CtorValues.push_back(CtorEntry);
+    }
+    llvm::Constant* CtorArray = llvm::ConstantArray::get(GlobalCtorsTy, CtorValues);
+    GlobalCtorsVal->setInitializer(CtorArray);
   }
-  
-  GlobalCtorsVal->setInitializer(llvm::ConstantArray::get(GlobalCtorsTy,
-                                                          CtorValues));
-
 }
 
 /// ReplaceMapValuesWith - This is a really slow and bad function that
