forked from OSchip/llvm-project
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
This commit is contained in:
parent
b0c4bb74a8
commit
d3704f67ad
|
@ -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;
|
||||
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);
|
||||
|
||||
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();
|
||||
}
|
||||
for (GlobalValue *GV : V)
|
||||
if (!convertToDeclaration(*GV))
|
||||
GV->eraseFromParent();
|
||||
}
|
||||
|
||||
void forEachVirtualFunction(Constant *C, function_ref<void(Function *)> Fn) {
|
||||
|
|
Loading…
Reference in New Issue