From 0fdaf8c9c263857a775f58aa3aac7a94d70f8b5f Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Sun, 17 Apr 2016 19:40:20 +0000 Subject: [PATCH] Linker: Don't double-schedule appending variables Add an assertion to ValueMapper that prevents double-scheduling of GlobalValues to remap, and fix the one place it happened. There are tons of tests that fail with this assertion in place and without the code change, so I'm not adding another. Although it looks related, r266563 was, indeed, removing dead code. AFAICT, this cross-file double-scheduling started in r266510 when the cross-file recursion was removed. llvm-svn: 266569 --- llvm/lib/Linker/IRMover.cpp | 2 +- llvm/lib/Transforms/Utils/ValueMapper.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp index 272dfcf..02fe58d2 100644 --- a/llvm/lib/Linker/IRMover.cpp +++ b/llvm/lib/Linker/IRMover.cpp @@ -540,7 +540,7 @@ void IRLinker::materializeInitFor(GlobalValue *New, GlobalValue *Old, if (!F->isDeclaration()) return; } else if (auto *V = dyn_cast(New)) { - if (V->hasInitializer()) + if (V->hasInitializer() || V->hasAppendingLinkage()) return; } else { auto *A = cast(New); diff --git a/llvm/lib/Transforms/Utils/ValueMapper.cpp b/llvm/lib/Transforms/Utils/ValueMapper.cpp index 84dcb42..8ab6626 100644 --- a/llvm/lib/Transforms/Utils/ValueMapper.cpp +++ b/llvm/lib/Transforms/Utils/ValueMapper.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Transforms/Utils/ValueMapper.h" +#include "llvm/ADT/DenseSet.h" #include "llvm/IR/CallSite.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DebugInfoMetadata.h" @@ -99,6 +100,10 @@ class MDNodeMapper; class Mapper { friend class MDNodeMapper; +#ifndef NDEBUG + DenseSet AlreadyScheduled; +#endif + RemapFlags Flags; ValueMapTypeRemapper *TypeMapper; unsigned CurrentMCID = 0; @@ -965,6 +970,7 @@ void Mapper::mapAppendingVariable(GlobalVariable &GV, Constant *InitPrefix, void Mapper::scheduleMapGlobalInitializer(GlobalVariable &GV, Constant &Init, unsigned MCID) { + assert(AlreadyScheduled.insert(&GV).second && "Should not reschedule"); assert(MCID < MCs.size() && "Invalid mapping context"); WorklistEntry WE; @@ -980,6 +986,7 @@ void Mapper::scheduleMapAppendingVariable(GlobalVariable &GV, bool IsOldCtorDtor, ArrayRef NewMembers, unsigned MCID) { + assert(AlreadyScheduled.insert(&GV).second && "Should not reschedule"); assert(MCID < MCs.size() && "Invalid mapping context"); WorklistEntry WE; @@ -995,6 +1002,7 @@ void Mapper::scheduleMapAppendingVariable(GlobalVariable &GV, void Mapper::scheduleMapGlobalAliasee(GlobalAlias &GA, Constant &Aliasee, unsigned MCID) { + assert(AlreadyScheduled.insert(&GA).second && "Should not reschedule"); assert(MCID < MCs.size() && "Invalid mapping context"); WorklistEntry WE; @@ -1006,6 +1014,7 @@ void Mapper::scheduleMapGlobalAliasee(GlobalAlias &GA, Constant &Aliasee, } void Mapper::scheduleRemapFunction(Function &F, unsigned MCID) { + assert(AlreadyScheduled.insert(&F).second && "Should not reschedule"); assert(MCID < MCs.size() && "Invalid mapping context"); WorklistEntry WE; -- 2.7.4