diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-11-29 03:21:30 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-11-29 03:21:30 +0000 |
commit | 9f30fac4d88ccd30deaf8faca3e711c6346e7f33 (patch) | |
tree | e42975f1ffde981e5fab0a02da668dc8beb875d2 /llvm/lib/Linker/LinkModules.cpp | |
parent | da3beebad16104fb32573973a4089f8e5174ed40 (diff) | |
download | llvm-9f30fac4d88ccd30deaf8faca3e711c6346e7f33.zip llvm-9f30fac4d88ccd30deaf8faca3e711c6346e7f33.tar.gz llvm-9f30fac4d88ccd30deaf8faca3e711c6346e7f33.tar.bz2 |
Fix a crash when writing merged bitcode.
Playing with mutateType in here was making getValueType and getType
incompatible.
llvm-svn: 254240
Diffstat (limited to 'llvm/lib/Linker/LinkModules.cpp')
-rw-r--r-- | llvm/lib/Linker/LinkModules.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
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 @@ private: 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 @@ static void getArrayElements(const Constant *C, 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 @@ void ModuleLinker::linkAppendingVarInit(const AppendingVarInfo &AVI) { 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 @@ bool ModuleLinker::run() { if (linkGlobalValueProto(&GA)) return true; - for (const AppendingVarInfo &AppendingVar : AppendingVars) + for (AppendingVarInfo &AppendingVar : AppendingVars) linkAppendingVarInit(AppendingVar); for (const auto &Entry : DstM->getComdatSymbolTable()) { |