summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2016-04-17 19:40:20 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2016-04-17 19:40:20 +0000
commit0fdaf8c9c263857a775f58aa3aac7a94d70f8b5f (patch)
treea1413225a4b97dd486cda5cc84f438b87911aec0
parentcaa11696535d1e03ce6be057c514f672498157e8 (diff)
downloadbcm5719-llvm-0fdaf8c9c263857a775f58aa3aac7a94d70f8b5f.tar.gz
bcm5719-llvm-0fdaf8c9c263857a775f58aa3aac7a94d70f8b5f.zip
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
-rw-r--r--llvm/lib/Linker/IRMover.cpp2
-rw-r--r--llvm/lib/Transforms/Utils/ValueMapper.cpp9
2 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp
index 272dfcf6dc4..02fe58d2cc5 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<GlobalVariable>(New)) {
- if (V->hasInitializer())
+ if (V->hasInitializer() || V->hasAppendingLinkage())
return;
} else {
auto *A = cast<GlobalAlias>(New);
diff --git a/llvm/lib/Transforms/Utils/ValueMapper.cpp b/llvm/lib/Transforms/Utils/ValueMapper.cpp
index 84dcb42a749..8ab6626202c 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<GlobalValue *> 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<Constant *> 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;
OpenPOWER on IntegriCloud