mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-19 04:29:21 +00:00
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
This commit is contained in:
parent
e36ae664b9
commit
a6a2bdd0e0
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user