You've already forked linux-packaging-mono
acceptance-tests
data
debian
docs
external
Newtonsoft.Json
api-doc-tools
api-snapshot
aspnetwebstack
bdwgc
binary-reference-assemblies
bockbuild
boringssl
cecil
cecil-legacy
corefx
corert
helix-binaries
ikdasm
ikvm
illinker-test-assets
linker
llvm-project
clang
clang-tools-extra
compiler-rt
libcxx
libcxxabi
libunwind
lld
lldb
llvm
bindings
cmake
docs
examples
include
lib
Analysis
AsmParser
BinaryFormat
Bitcode
CodeGen
DebugInfo
Demangle
ExecutionEngine
FuzzMutate
Fuzzer
IR
IRReader
LTO
LineEditor
Linker
MC
Object
ObjectYAML
Option
Passes
ProfileData
Support
TableGen
Target
Testing
ToolDrivers
Transforms
Coroutines
Hello
IPO
AlwaysInliner.cpp
ArgumentPromotion.cpp
BarrierNoopPass.cpp
CMakeLists.txt
CalledValuePropagation.cpp
ConstantMerge.cpp
CrossDSOCFI.cpp
DeadArgumentElimination.cpp
ElimAvailExtern.cpp
ExtractGV.cpp
ForceFunctionAttrs.cpp
FunctionAttrs.cpp
FunctionImport.cpp
GlobalDCE.cpp
GlobalOpt.cpp.REMOVED.git-id
GlobalSplit.cpp
IPConstantPropagation.cpp
IPO.cpp
InferFunctionAttrs.cpp
InlineSimple.cpp
Inliner.cpp
Internalize.cpp
LLVMBuild.txt
LoopExtractor.cpp
LowerTypeTests.cpp
MergeFunctions.cpp
PartialInlining.cpp
PassManagerBuilder.cpp
PruneEH.cpp
SampleProfile.cpp
StripDeadPrototypes.cpp
StripSymbols.cpp
ThinLTOBitcodeWriter.cpp
WholeProgramDevirt.cpp
InstCombine
Instrumentation
ObjCARC
Scalar
Utils
Vectorize
CMakeLists.txt
LLVMBuild.txt
WindowsManifest
XRay
CMakeLists.txt
LLVMBuild.txt
projects
resources
runtimes
scripts
test
tools
unittests
utils
.arcconfig
.clang-format
.clang-tidy
.gitattributes
.gitignore
CMakeLists.txt
CODE_OWNERS.TXT
CREDITS.TXT
LICENSE.TXT
LLVMBuild.txt
README.txt
RELEASE_TESTERS.TXT
configure
llvm.spec.in
openmp
polly
nuget-buildtasks
nunit-lite
roslyn-binaries
rx
xunit-binaries
how-to-bump-roslyn-binaries.md
ikvm-native
llvm
m4
man
mcs
mk
mono
msvc
netcore
po
runtime
samples
scripts
support
tools
COPYING.LIB
LICENSE
Makefile.am
Makefile.in
NEWS
README.md
acinclude.m4
aclocal.m4
autogen.sh
code_of_conduct.md
compile
config.guess
config.h.in
config.rpath
config.sub
configure.REMOVED.git-id
configure.ac.REMOVED.git-id
depcomp
install-sh
ltmain.sh.REMOVED.git-id
missing
mkinstalldirs
mono-uninstalled.pc.in
test-driver
winconfig.h
103 lines
3.1 KiB
C++
103 lines
3.1 KiB
C++
![]() |
//===- ElimAvailExtern.cpp - DCE unreachable internal functions -----------===//
|
||
|
//
|
||
|
// The LLVM Compiler Infrastructure
|
||
|
//
|
||
|
// This file is distributed under the University of Illinois Open Source
|
||
|
// License. See LICENSE.TXT for details.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
//
|
||
|
// This transform is designed to eliminate available external global
|
||
|
// definitions from the program, turning them into declarations.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
|
||
|
#include "llvm/Transforms/IPO/ElimAvailExtern.h"
|
||
|
#include "llvm/ADT/Statistic.h"
|
||
|
#include "llvm/IR/Constant.h"
|
||
|
#include "llvm/IR/Function.h"
|
||
|
#include "llvm/IR/GlobalValue.h"
|
||
|
#include "llvm/IR/GlobalVariable.h"
|
||
|
#include "llvm/IR/Module.h"
|
||
|
#include "llvm/Pass.h"
|
||
|
#include "llvm/Transforms/IPO.h"
|
||
|
#include "llvm/Transforms/Utils/GlobalStatus.h"
|
||
|
|
||
|
using namespace llvm;
|
||
|
|
||
|
#define DEBUG_TYPE "elim-avail-extern"
|
||
|
|
||
|
STATISTIC(NumFunctions, "Number of functions removed");
|
||
|
STATISTIC(NumVariables, "Number of global variables removed");
|
||
|
|
||
|
static bool eliminateAvailableExternally(Module &M) {
|
||
|
bool Changed = false;
|
||
|
|
||
|
// Drop initializers of available externally global variables.
|
||
|
for (GlobalVariable &GV : M.globals()) {
|
||
|
if (!GV.hasAvailableExternallyLinkage())
|
||
|
continue;
|
||
|
if (GV.hasInitializer()) {
|
||
|
Constant *Init = GV.getInitializer();
|
||
|
GV.setInitializer(nullptr);
|
||
|
if (isSafeToDestroyConstant(Init))
|
||
|
Init->destroyConstant();
|
||
|
}
|
||
|
GV.removeDeadConstantUsers();
|
||
|
GV.setLinkage(GlobalValue::ExternalLinkage);
|
||
|
NumVariables++;
|
||
|
Changed = true;
|
||
|
}
|
||
|
|
||
|
// Drop the bodies of available externally functions.
|
||
|
for (Function &F : M) {
|
||
|
if (!F.hasAvailableExternallyLinkage())
|
||
|
continue;
|
||
|
if (!F.isDeclaration())
|
||
|
// This will set the linkage to external
|
||
|
F.deleteBody();
|
||
|
F.removeDeadConstantUsers();
|
||
|
NumFunctions++;
|
||
|
Changed = true;
|
||
|
}
|
||
|
|
||
|
return Changed;
|
||
|
}
|
||
|
|
||
|
PreservedAnalyses
|
||
|
EliminateAvailableExternallyPass::run(Module &M, ModuleAnalysisManager &) {
|
||
|
if (!eliminateAvailableExternally(M))
|
||
|
return PreservedAnalyses::all();
|
||
|
return PreservedAnalyses::none();
|
||
|
}
|
||
|
|
||
|
namespace {
|
||
|
|
||
|
struct EliminateAvailableExternallyLegacyPass : public ModulePass {
|
||
|
static char ID; // Pass identification, replacement for typeid
|
||
|
|
||
|
EliminateAvailableExternallyLegacyPass() : ModulePass(ID) {
|
||
|
initializeEliminateAvailableExternallyLegacyPassPass(
|
||
|
*PassRegistry::getPassRegistry());
|
||
|
}
|
||
|
|
||
|
// run - Do the EliminateAvailableExternally pass on the specified module,
|
||
|
// optionally updating the specified callgraph to reflect the changes.
|
||
|
bool runOnModule(Module &M) override {
|
||
|
if (skipModule(M))
|
||
|
return false;
|
||
|
return eliminateAvailableExternally(M);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
} // end anonymous namespace
|
||
|
|
||
|
char EliminateAvailableExternallyLegacyPass::ID = 0;
|
||
|
|
||
|
INITIALIZE_PASS(EliminateAvailableExternallyLegacyPass, "elim-avail-extern",
|
||
|
"Eliminate Available Externally Globals", false, false)
|
||
|
|
||
|
ModulePass *llvm::createEliminateAvailableExternallyPass() {
|
||
|
return new EliminateAvailableExternallyLegacyPass();
|
||
|
}
|