aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-12-08 03:28:51 +0000
committerChris Lattner <sabre@nondot.org>2004-12-08 03:28:51 +0000
commita6a2bdd0e023192b8fb31679dbde6bbb1b584547 (patch)
tree689fffc560c6161ae7ecdf95d7f94bf03b4493f2
parente36ae664b9edeaf24f30dc6df6ac7816977df49c (diff)
downloadexternal_llvm-a6a2bdd0e023192b8fb31679dbde6bbb1b584547.zip
external_llvm-a6a2bdd0e023192b8fb31679dbde6bbb1b584547.tar.gz
external_llvm-a6a2bdd0e023192b8fb31679dbde6bbb1b584547.tar.bz2
Add a disgusting hack to work around a libstdc++ issue. This code should
be removed when PR400 is resolved. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18610 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Linker/LinkModules.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp
index d58acbe..02d2c18 100644
--- a/lib/Linker/LinkModules.cpp
+++ b/lib/Linker/LinkModules.cpp
@@ -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))