[ThinLTO] - Simplify code in ThinLTOBitcodeWriter.

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: 324455
This commit is contained in:
George Rimar 2018-02-07 08:32:35 +00:00
parent 2f70693e08
commit 5f133dc99b
1 changed files with 11 additions and 37 deletions

View File

@ -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,45 +170,18 @@ 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()) {
static void
filterModule(Module *M,
function_ref<bool(const GlobalValue *)> ShouldKeepDefinition) {
auto I = M->global_values().begin();
auto E = M->global_values().end();
while (I != E) {
GlobalValue &GV = *I++;
if (ShouldKeepDefinition(&GV))
continue;
GV.setInitializer(nullptr);
GV.setLinkage(GlobalValue::ExternalLinkage);
GV.setComdat(nullptr);
GV.clearMetadata();
if (convertToDeclaration(GV))
continue;
GV.eraseFromParent();
}
}