Fix a crash when writing merged bitcode.
Playing with mutateType in here was making getValueType and getType
incompatible.
llvm-svn: 254240
diff --git a/llvm/lib/Linker/LinkModules.cpp b/llvm/lib/Linker/LinkModules.cpp
index afb39a1..4b1b9d2 100644
--- a/llvm/lib/Linker/LinkModules.cpp
+++ b/llvm/lib/Linker/LinkModules.cpp
@@ -537,7 +537,7 @@
bool linkGlobalValueProto(GlobalValue *GV);
bool linkModuleFlagsMetadata();
- void linkAppendingVarInit(const AppendingVarInfo &AVI);
+ void linkAppendingVarInit(AppendingVarInfo &AVI);
void linkGlobalInit(GlobalVariable &Dst, GlobalVariable &Src);
bool linkFunctionBody(Function &Dst, Function &Src);
@@ -1493,7 +1493,7 @@
Dest.push_back(C->getAggregateElement(i));
}
-void ModuleLinker::linkAppendingVarInit(const AppendingVarInfo &AVI) {
+void ModuleLinker::linkAppendingVarInit(AppendingVarInfo &AVI) {
// Merge the initializer.
SmallVector<Constant *, 16> DstElements;
getArrayElements(AVI.DstInit, DstElements);
@@ -1517,9 +1517,18 @@
DstElements.push_back(
MapValue(V, ValueMap, RF_MoveDistinctMDs, &TypeMap, &ValMaterializer));
}
- if (IsNewStructor) {
+ if (DstElements.size() != NewType->getNumElements()) {
NewType = ArrayType::get(NewType->getElementType(), DstElements.size());
- AVI.NewGV->mutateType(PointerType::get(NewType, 0));
+ GlobalVariable *Old = AVI.NewGV;
+ GlobalVariable *NG = new GlobalVariable(
+ *DstM, NewType, Old->isConstant(), Old->getLinkage(), /*init*/ nullptr,
+ /*name*/ "", Old, Old->getThreadLocalMode(),
+ Old->getType()->getAddressSpace());
+ copyGVAttributes(NG, Old);
+ AVI.NewGV->replaceAllUsesWith(
+ ConstantExpr::getBitCast(NG, AVI.NewGV->getType()));
+ AVI.NewGV->eraseFromParent();
+ AVI.NewGV = NG;
}
AVI.NewGV->setInitializer(ConstantArray::get(NewType, DstElements));
@@ -1909,7 +1918,7 @@
if (linkGlobalValueProto(&GA))
return true;
- for (const AppendingVarInfo &AppendingVar : AppendingVars)
+ for (AppendingVarInfo &AppendingVar : AppendingVars)
linkAppendingVarInit(AppendingVar);
for (const auto &Entry : DstM->getComdatSymbolTable()) {