22 #define DEBUG_TYPE "internalize"
38 STATISTIC(NumAliases ,
"Number of aliases internalized");
39 STATISTIC(NumFunctions,
"Number of functions internalized");
40 STATISTIC(NumGlobals ,
"Number of global vars internalized");
46 cl::desc(
"A file containing list of symbol names to preserve"));
51 cl::desc(
"A list of symbol names to preserve"),
56 std::set<std::string> ExternalNames;
59 explicit InternalizePass();
61 void LoadFile(
const char *Filename);
62 virtual bool runOnModule(
Module &M);
73 "Internalize Global Symbols",
false,
false)
75 InternalizePass::InternalizePass()
87 itr != ExportList.
end(); itr++) {
88 ExternalNames.insert(*itr);
92 void InternalizePass::LoadFile(
const char *Filename) {
94 std::ifstream
In(Filename);
96 errs() <<
"WARNING: Internalize couldn't load file '" << Filename
97 <<
"'! Continuing as if it's empty.\n";
104 ExternalNames.insert(Symbol);
109 const std::set<std::string> &ExternalNames) {
123 if (ExternalNames.count(GV.
getName()))
129 bool InternalizePass::runOnModule(
Module &M) {
130 CallGraph *CG = getAnalysisIfAvailable<CallGraph>();
132 bool Changed =
false;
149 ExternalNames.insert(V->
getName());
158 I->setLinkage(GlobalValue::InternalLinkage);
162 ExternalNode->removeOneAbstractEdgeTo((*CG)[
I]);
166 DEBUG(
dbgs() <<
"Internalizing func " << I->getName() <<
"\n");
172 ExternalNames.insert(
"llvm.used");
173 ExternalNames.insert(
"llvm.compiler.used");
177 ExternalNames.insert(
"llvm.global_ctors");
178 ExternalNames.insert(
"llvm.global_dtors");
179 ExternalNames.insert(
"llvm.global.annotations");
184 ExternalNames.insert(
"__stack_chk_fail");
185 ExternalNames.insert(
"__stack_chk_guard");
195 I->setLinkage(GlobalValue::InternalLinkage);
198 DEBUG(
dbgs() <<
"Internalized gvar " << I->getName() <<
"\n");
207 I->setLinkage(GlobalValue::InternalLinkage);
210 DEBUG(
dbgs() <<
"Internalized alias " << I->getName() <<
"\n");
217 return new InternalizePass();
221 return new InternalizePass(ExportList);
AnalysisUsage & addPreserved()
static cl::list< std::string > APIList("internalize-public-api-list", cl::value_desc("list"), cl::desc("A list of symbol names to preserve"), cl::CommaSeparated)
static PassRegistry * getPassRegistry()
The main container class for the LLVM Intermediate Representation.
void initializeInternalizePassPass(PassRegistry &)
bool hasAvailableExternallyLinkage() const
StringRef getName() const
ID
LLVM Calling Convention Representation.
global_iterator global_begin()
INITIALIZE_PASS(InternalizePass,"internalize","Internalize Global Symbols", false, false) InternalizePass
STATISTIC(NumAliases,"Number of aliases internalized")
alias_iterator alias_end()
global_iterator global_end()
SmallPtrSetIterator - This implements a const_iterator for SmallPtrSet.
static cl::opt< std::string > APIFile("internalize-public-api-file", cl::value_desc("filename"), cl::desc("A file containing list of symbol names to preserve"))
alias_iterator alias_begin()
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
bool isDeclaration() const
ModulePass * createInternalizePass(ArrayRef< const char * > ExportList)
bool hasLocalLinkage() const
static bool shouldInternalize(const GlobalValue &GV, const std::set< std::string > &ExternalNames)
GlobalVariable * collectUsedGlobalVariables(Module &M, SmallPtrSet< GlobalValue *, 8 > &Set, bool CompilerUsed)
Given "llvm.used" or "llvm.compiler.used" as a global name, collect the initializer elements of that ...
CallGraphNode * getExternalCallingNode() const