diff options
author | George Rimar <grimar@accesssoftek.com> | 2018-02-08 07:23:24 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2018-02-08 07:23:24 +0000 |
commit | d3704f67adb6f6eb67c9a84e0092e9a89b5864c7 (patch) | |
tree | ee52067a186771110e16da985dda940afe9184eb /llvm/lib/Transforms | |
parent | b0c4bb74a8b56ef4086cfc74c56ec24b947a9bfc (diff) | |
download | bcm5719-llvm-d3704f67adb6f6eb67c9a84e0092e9a89b5864c7.tar.gz bcm5719-llvm-d3704f67adb6f6eb67c9a84e0092e9a89b5864c7.zip |
Recommit r324455 "[ThinLTO] - Simplify code in ThinLTOBitcodeWriter."
With fix: reimplemented.
Original commit message:
Recently introduced convertToDeclaration is very similar
to code used in filterModule function.
Patch reuses it to reduce duplication.
Differential revision: https://reviews.llvm.org/D42971
llvm-svn: 324574
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp | 52 |
1 files changed, 12 insertions, 40 deletions
diff --git a/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp b/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp index d2ce97abdd4..7cc1e06964b 100644 --- a/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp +++ b/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp @@ -23,6 +23,7 @@ #include "llvm/Support/raw_ostream.h" #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/IPO/FunctionAttrs.h" +#include "llvm/Transforms/IPO/FunctionImport.h" #include "llvm/Transforms/Utils/Cloning.h" #include "llvm/Transforms/Utils/ModuleUtils.h" using namespace llvm; @@ -169,46 +170,17 @@ void simplifyExternals(Module &M) { } } -void filterModule( - Module *M, function_ref<bool(const GlobalValue *)> ShouldKeepDefinition) { - for (Module::alias_iterator I = M->alias_begin(), E = M->alias_end(); - I != E;) { - GlobalAlias *GA = &*I++; - if (ShouldKeepDefinition(GA)) - continue; - - GlobalObject *GO; - if (GA->getValueType()->isFunctionTy()) - GO = Function::Create(cast<FunctionType>(GA->getValueType()), - GlobalValue::ExternalLinkage, "", M); - else - GO = new GlobalVariable( - *M, GA->getValueType(), false, GlobalValue::ExternalLinkage, - nullptr, "", nullptr, - GA->getThreadLocalMode(), GA->getType()->getAddressSpace()); - GO->takeName(GA); - GA->replaceAllUsesWith(GO); - GA->eraseFromParent(); - } - - for (Function &F : *M) { - if (ShouldKeepDefinition(&F)) - continue; - - F.deleteBody(); - F.setComdat(nullptr); - F.clearMetadata(); - } - - for (GlobalVariable &GV : M->globals()) { - if (ShouldKeepDefinition(&GV)) - continue; - - GV.setInitializer(nullptr); - GV.setLinkage(GlobalValue::ExternalLinkage); - GV.setComdat(nullptr); - GV.clearMetadata(); - } +static void +filterModule(Module *M, + function_ref<bool(const GlobalValue *)> ShouldKeepDefinition) { + std::vector<GlobalValue *> V; + for (GlobalValue &GV : M->global_values()) + if (!ShouldKeepDefinition(&GV)) + V.push_back(&GV); + + for (GlobalValue *GV : V) + if (!convertToDeclaration(*GV)) + GV->eraseFromParent(); } void forEachVirtualFunction(Constant *C, function_ref<void(Function *)> Fn) { |