summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2016-04-20 14:39:45 +0000
committerTeresa Johnson <tejohnson@google.com>2016-04-20 14:39:45 +0000
commitb35cc691ea93d9408f76736170359fd7ce604b53 (patch)
tree61d2c9ebba7b2a675bdc47ff212be9e44ef4df89 /llvm/lib/Transforms/Utils
parent6eda85ac1fd9aed299eceed5a014c38a8d89da07 (diff)
downloadbcm5719-llvm-b35cc691ea93d9408f76736170359fd7ce604b53.tar.gz
bcm5719-llvm-b35cc691ea93d9408f76736170359fd7ce604b53.zip
[ThinLTO] Prevent importing of "llvm.used" values
Summary: This patch prevents importing from (and therefore exporting from) any module with a "llvm.used" local value. Local values need to be promoted and renamed when importing, and their presense on the llvm.used variable indicates that there are opaque uses that won't see the rename. One such example is a use in inline assembly. See also the discussion at: http://lists.llvm.org/pipermail/llvm-dev/2016-April/098047.html As part of this, move collectUsedGlobalVariables out of Transforms/Utils and into IR/Module so that it can be used more widely. There are several other places in LLVM that used copies of this code that can be cleaned up as a follow on NFC patch. Reviewers: joker.eph Subscribers: pcc, llvm-commits, joker.eph Differential Revision: http://reviews.llvm.org/D18986 llvm-svn: 266877
Diffstat (limited to 'llvm/lib/Transforms/Utils')
-rw-r--r--llvm/lib/Transforms/Utils/FunctionImportUtils.cpp20
-rw-r--r--llvm/lib/Transforms/Utils/ModuleUtils.cpp17
2 files changed, 20 insertions, 17 deletions
diff --git a/llvm/lib/Transforms/Utils/FunctionImportUtils.cpp b/llvm/lib/Transforms/Utils/FunctionImportUtils.cpp
index c0628b3bd49..f1d12bce06c 100644
--- a/llvm/lib/Transforms/Utils/FunctionImportUtils.cpp
+++ b/llvm/lib/Transforms/Utils/FunctionImportUtils.cpp
@@ -206,6 +206,26 @@ void FunctionImportGlobalProcessing::processGlobalForThinLTO(GlobalValue &GV) {
}
void FunctionImportGlobalProcessing::processGlobalsForThinLTO() {
+ // We cannot currently promote or rename anything that is in llvm.used,
+ // since any such value may have a use that won't see the new name.
+ // Specifically, any uses within inline assembly are not visible to the
+ // compiler. Prevent changing any such values on the exporting side,
+ // since we would already have guarded against an import from this module by
+ // suppressing its index generation. See comments on what is required
+ // in order to implement a finer grained solution in
+ // ModuleSummaryIndexBuilder::ModuleSummaryIndexBuilder().
+ SmallPtrSet<GlobalValue *, 8> Used;
+ collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false);
+ for (GlobalValue *V : Used) {
+ if (!V->hasLocalLinkage())
+ continue;
+ // We would have blocked importing from this module by suppressing index
+ // generation.
+ assert(!isPerformingImport() &&
+ "Should have blocked importing from module with local used");
+ return;
+ }
+
for (GlobalVariable &GV : M.globals())
processGlobalForThinLTO(GV);
for (Function &SF : M)
diff --git a/llvm/lib/Transforms/Utils/ModuleUtils.cpp b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
index 4d73a6bf037..eb918851862 100644
--- a/llvm/lib/Transforms/Utils/ModuleUtils.cpp
+++ b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "llvm/Transforms/Utils/ModuleUtils.h"
-#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
@@ -90,22 +89,6 @@ void llvm::appendToGlobalDtors(Module &M, Function *F, int Priority, Constant *D
appendToGlobalArray("llvm.global_dtors", M, F, Priority, Data);
}
-GlobalVariable *
-llvm::collectUsedGlobalVariables(Module &M, SmallPtrSetImpl<GlobalValue *> &Set,
- bool CompilerUsed) {
- const char *Name = CompilerUsed ? "llvm.compiler.used" : "llvm.used";
- GlobalVariable *GV = M.getGlobalVariable(Name);
- if (!GV || !GV->hasInitializer())
- return GV;
-
- const ConstantArray *Init = cast<ConstantArray>(GV->getInitializer());
- for (Value *Op : Init->operands()) {
- GlobalValue *G = cast<GlobalValue>(Op->stripPointerCastsNoFollowAliases());
- Set.insert(G);
- }
- return GV;
-}
-
Function *llvm::checkSanitizerInterfaceFunction(Constant *FuncOrBitcast) {
if (isa<Function>(FuncOrBitcast))
return cast<Function>(FuncOrBitcast);
OpenPOWER on IntegriCloud