Add a disgusting hack to work around a libstdc++ issue. This code should
authorChris Lattner <sabre@nondot.org>
Wed, 8 Dec 2004 03:28:51 +0000 (03:28 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 8 Dec 2004 03:28:51 +0000 (03:28 +0000)
be removed when PR400 is resolved.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18610 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Linker/LinkModules.cpp

index d58acbec81c0ab11d36cb442e98c8de804b09231..02d2c186df00949bdd7a0b9cd4262d007e520907 100644 (file)
@@ -425,6 +425,20 @@ static bool GetLinkageResult(GlobalValue *Dest, GlobalValue *Src,
   return false;
 }
 
+// Gross hack, see call sites.
+static void CoutHack(GlobalVariable *GV1, GlobalVariable *GV2) {
+  const Type *GV1Ty = GV1->getType()->getElementType();
+  const Type *GV2Ty = GV2->getType()->getElementType();
+
+  if (GV1->isExternal() && isa<StructType>(GV1Ty) &&
+      GV2->hasInitializer() && GV2->hasExternalLinkage() && 
+      GV2->getInitializer()->isNullValue() && isa<ArrayType>(GV2Ty) &&
+      cast<ArrayType>(GV2Ty)->getElementType() == Type::SByteTy) {
+    GV1->setInitializer(Constant::getNullValue(GV1Ty));
+    GV2->setInitializer(0);
+  }
+}
+
 // LinkGlobals - Loop through the global variables in the src module and merge
 // them into the dest module.
 static bool LinkGlobals(Module *Dest, Module *Src,
@@ -459,6 +473,15 @@ static bool LinkGlobals(Module *Dest, Module *Src,
     assert(SGV->hasInitializer() || SGV->hasExternalLinkage() &&
            "Global must either be external or have an initializer!");
 
+    // This is a gross hack to handle cin/cout until PR400 is implemented.  If
+    // we are linking an external struct against a zero-initialized array of
+    // sbytes, move the initializer from the array to the struct so we keep the
+    // struct type.
+    if (DGV) {
+      CoutHack(DGV, SGV);
+      CoutHack(SGV, DGV);
+    }
+
     GlobalValue::LinkageTypes NewLinkage;
     bool LinkFromSrc;
     if (GetLinkageResult(DGV, SGV, NewLinkage, LinkFromSrc, Err))