1dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner//===-- Internalize.cpp - Mark functions internal -------------------------===//
2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
9dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner//
10e5551ed9cec1ae777c4e4b8852a1d7842c2e1c3dRafael Espindola// This pass loops over all of the functions and variables in the input module.
11e5551ed9cec1ae777c4e4b8852a1d7842c2e1c3dRafael Espindola// If the function or variable is not in the list of external names given to
12e5551ed9cec1ae777c4e4b8852a1d7842c2e1c3dRafael Espindola// the pass it is marked as internal.
13dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner//
147e667c56cf7e27ff521ceb86518beab32bfb630dRafael Espindola// This transformation would not be legal in a regular compilation, but it gets
157e667c56cf7e27ff521ceb86518beab32bfb630dRafael Espindola// extra information from the linker about what is safe.
16713cab059ebb67c2f51d8da9d8e57be2b1dcd9c2Rafael Espindola//
177e667c56cf7e27ff521ceb86518beab32bfb630dRafael Espindola// For example: Internalizing a function with external linkage. Only if we are
187e667c56cf7e27ff521ceb86518beab32bfb630dRafael Espindola// told it is only used from within this module, it is safe to do it.
19713cab059ebb67c2f51d8da9d8e57be2b1dcd9c2Rafael Espindola//
20dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner//===----------------------------------------------------------------------===//
21dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner
22568ddabc8f9015baf2d42cc425618412972f1b92Chris Lattner#include "llvm/Transforms/IPO.h"
234ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola#include "llvm/ADT/SmallPtrSet.h"
24d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/Statistic.h"
25d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Analysis/CallGraph.h"
260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h"
27d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Pass.h"
28551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h"
29551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/Debug.h"
30ce63ffb52f249b62cdf2d250c128007b13f27e71Daniel Dunbar#include "llvm/Support/raw_ostream.h"
31713cab059ebb67c2f51d8da9d8e57be2b1dcd9c2Rafael Espindola#include "llvm/Transforms/Utils/GlobalStatus.h"
324ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola#include "llvm/Transforms/Utils/ModuleUtils.h"
33c7a2c7f0c9900c6658bc567211d695f0593484c2Chris Lattner#include <fstream>
34c7a2c7f0c9900c6658bc567211d695f0593484c2Chris Lattner#include <set>
351e2385b941242f2f96398dc62767420622856149Chris Lattnerusing namespace llvm;
36d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "internalize"
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
3927a53009efcf1b0334dc17c3d54382798686ff59Duncan SandsSTATISTIC(NumAliases  , "Number of aliases internalized");
4086453c52ba02e743d29c08456e51006500041456Chris LattnerSTATISTIC(NumFunctions, "Number of functions internalized");
4186453c52ba02e743d29c08456e51006500041456Chris LattnerSTATISTIC(NumGlobals  , "Number of global vars internalized");
4286453c52ba02e743d29c08456e51006500041456Chris Lattner
43844731a7f1909f55935e3514c9e713a62d67662eDan Gohman// APIFile - A file which contains a list of symbols that should not be marked
44844731a7f1909f55935e3514c9e713a62d67662eDan Gohman// external.
45844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic cl::opt<std::string>
46844731a7f1909f55935e3514c9e713a62d67662eDan GohmanAPIFile("internalize-public-api-file", cl::value_desc("filename"),
47844731a7f1909f55935e3514c9e713a62d67662eDan Gohman        cl::desc("A file containing list of symbol names to preserve"));
482345d71853e75fd56a8ca66d40bf36eba0a9edb6Chris Lattner
49844731a7f1909f55935e3514c9e713a62d67662eDan Gohman// APIList - A list of symbols that should not be marked internal.
50844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic cl::list<std::string>
51844731a7f1909f55935e3514c9e713a62d67662eDan GohmanAPIList("internalize-public-api-list", cl::value_desc("list"),
52844731a7f1909f55935e3514c9e713a62d67662eDan Gohman        cl::desc("A list of symbol names to preserve"),
53844731a7f1909f55935e3514c9e713a62d67662eDan Gohman        cl::CommaSeparated);
54fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
55844731a7f1909f55935e3514c9e713a62d67662eDan Gohmannamespace {
566726b6d75a8b679068a58cb954ba97cf9d1690baNick Lewycky  class InternalizePass : public ModulePass {
57c7a2c7f0c9900c6658bc567211d695f0593484c2Chris Lattner    std::set<std::string> ExternalNames;
58c7a2c7f0c9900c6658bc567211d695f0593484c2Chris Lattner  public:
59ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky    static char ID; // Pass identification, replacement for typeid
60e5551ed9cec1ae777c4e4b8852a1d7842c2e1c3dRafael Espindola    explicit InternalizePass();
617e667c56cf7e27ff521ceb86518beab32bfb630dRafael Espindola    explicit InternalizePass(ArrayRef<const char *> ExportList);
624eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner    void LoadFile(const char *Filename);
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    bool runOnModule(Module &M) override;
640483d018c4f15f206a83364e498957127e74f431Nuno Lopes
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    void getAnalysisUsage(AnalysisUsage &AU) const override {
660483d018c4f15f206a83364e498957127e74f431Nuno Lopes      AU.setPreservesCFG();
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      AU.addPreserved<CallGraphWrapperPass>();
680483d018c4f15f206a83364e498957127e74f431Nuno Lopes    }
694eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner  };
704eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner} // end anonymous namespace
7193fbd733e778c2623436ed5a0b9cf7f394407b1aChris Lattner
72844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar InternalizePass::ID = 0;
73d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(InternalizePass, "internalize",
74ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                "Internalize Global Symbols", false, false)
75844731a7f1909f55935e3514c9e713a62d67662eDan Gohman
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesInternalizePass::InternalizePass() : ModulePass(ID) {
77081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeInternalizePassPass(*PassRegistry::getPassRegistry());
78ef3682a4fbfc3ff1a593adf95740ad8ab0d1d487Devang Patel  if (!APIFile.empty())           // If a filename is specified, use it.
794eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner    LoadFile(APIFile.c_str());
801d7df349ab7fa051ffe88589b06a1aa514f84a00Rafael Espindola  ExternalNames.insert(APIList.begin(), APIList.end());
814eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner}
82c7a2c7f0c9900c6658bc567211d695f0593484c2Chris Lattner
837e667c56cf7e27ff521ceb86518beab32bfb630dRafael EspindolaInternalizePass::InternalizePass(ArrayRef<const char *> ExportList)
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    : ModulePass(ID) {
85081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeInternalizePassPass(*PassRegistry::getPassRegistry());
86775079c227083be3fe22f6ae071d5b74a7ade745Rafael Espindola  for(ArrayRef<const char *>::const_iterator itr = ExportList.begin();
87775079c227083be3fe22f6ae071d5b74a7ade745Rafael Espindola        itr != ExportList.end(); itr++) {
88753d94a1c8fe02f64eb4f482d396712c68db1d84Devang Patel    ExternalNames.insert(*itr);
89753d94a1c8fe02f64eb4f482d396712c68db1d84Devang Patel  }
90753d94a1c8fe02f64eb4f482d396712c68db1d84Devang Patel}
91753d94a1c8fe02f64eb4f482d396712c68db1d84Devang Patel
924eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattnervoid InternalizePass::LoadFile(const char *Filename) {
934eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner  // Load the APIFile...
944eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner  std::ifstream In(Filename);
954eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner  if (!In.good()) {
964437ae213d5435390f0750213b53ec807c047f22Chris Lattner    errs() << "WARNING: Internalize couldn't load file '" << Filename
97ef3682a4fbfc3ff1a593adf95740ad8ab0d1d487Devang Patel         << "'! Continuing as if it's empty.\n";
98ef3682a4fbfc3ff1a593adf95740ad8ab0d1d487Devang Patel    return; // Just continue as if the file were empty
994eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner  }
1004eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner  while (In) {
1014eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner    std::string Symbol;
1024eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner    In >> Symbol;
1034eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner    if (!Symbol.empty())
1044eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner      ExternalNames.insert(Symbol);
1054eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner  }
1064eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner}
1074eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner
1080fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindolastatic bool shouldInternalize(const GlobalValue &GV,
1097e667c56cf7e27ff521ceb86518beab32bfb630dRafael Espindola                              const std::set<std::string> &ExternalNames) {
1100fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola  // Function must be defined here
1110fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola  if (GV.isDeclaration())
1120fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    return false;
1130fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola
1140fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola  // Available externally is really just a "declaration with a body".
1150fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola  if (GV.hasAvailableExternallyLinkage())
1160fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    return false;
1170fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Assume that dllexported symbols are referenced elsewhere
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (GV.hasDLLExportStorageClass())
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return false;
12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1220fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola  // Already has internal linkage
1230fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola  if (GV.hasLocalLinkage())
1240fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    return false;
1250fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola
1260fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola  // Marked to keep external?
1270fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola  if (ExternalNames.count(GV.getName()))
1280fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    return false;
1290fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola
1307e667c56cf7e27ff521ceb86518beab32bfb630dRafael Espindola  return true;
1310fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola}
1320fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola
1334eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattnerbool InternalizePass::runOnModule(Module &M) {
13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  CallGraphWrapperPass *CGPass = getAnalysisIfAvailable<CallGraphWrapperPass>();
135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  CallGraph *CG = CGPass ? &CGPass->getCallGraph() : nullptr;
136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  CallGraphNode *ExternalNode = CG ? CG->getExternalCallingNode() : nullptr;
1374eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner  bool Changed = false;
1382631ac3b5b4c2d7eaf8d1db178dc98071a708ad2Duncan Sands
1394ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola  SmallPtrSet<GlobalValue *, 8> Used;
1404ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola  collectUsedGlobalVariables(M, Used, false);
1414ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola
1424ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola  // We must assume that globals in llvm.used have a reference that not even
1434ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola  // the linker can see, so we don't internalize them.
1444ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola  // For llvm.compiler.used the situation is a bit fuzzy. The assembler and
1454ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola  // linker can drop those symbols. If this pass is running as part of LTO,
1464ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola  // one might think that it could just drop llvm.compiler.used. The problem
1474ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola  // is that even in LTO llvm doesn't see every reference. For example,
1484ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola  // we don't see references from function local inline assembly. To be
1494ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola  // conservative, we internalize symbols in llvm.compiler.used, but we
1504ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola  // keep llvm.compiler.used so that the symbol is not deleted by llvm.
1514ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola  for (SmallPtrSet<GlobalValue *, 8>::iterator I = Used.begin(), E = Used.end();
1524ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola       I != E; ++I) {
1534ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola    GlobalValue *V = *I;
1544ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola    ExternalNames.insert(V->getName());
1554ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola  }
1564ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindola
157ef3682a4fbfc3ff1a593adf95740ad8ab0d1d487Devang Patel  // Mark all functions not in the api as internal.
1580fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
1597e667c56cf7e27ff521ceb86518beab32bfb630dRafael Espindola    if (!shouldInternalize(*I, ExternalNames))
1600fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola      continue;
1610fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola
162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    I->setVisibility(GlobalValue::DefaultVisibility);
1630fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    I->setLinkage(GlobalValue::InternalLinkage);
1640fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola
1650fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    if (ExternalNode)
1660fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola      // Remove a callgraph edge from the external node to this function.
1670fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola      ExternalNode->removeOneAbstractEdgeTo((*CG)[I]);
1680fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola
1690fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    Changed = true;
1700fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    ++NumFunctions;
1710fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    DEBUG(dbgs() << "Internalizing func " << I->getName() << "\n");
1720fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola  }
1732631ac3b5b4c2d7eaf8d1db178dc98071a708ad2Duncan Sands
1744eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner  // Never internalize the llvm.used symbol.  It is used to implement
1754eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner  // attribute((used)).
176401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner  // FIXME: Shouldn't this just filter on llvm.metadata section??
1774eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner  ExternalNames.insert("llvm.used");
178401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner  ExternalNames.insert("llvm.compiler.used");
1792631ac3b5b4c2d7eaf8d1db178dc98071a708ad2Duncan Sands
18044c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey  // Never internalize anchors used by the machine module info, else the info
18144c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey  // won't find them.  (see MachineModuleInfo.)
1824e2288b9de2fc30d4b88b437c86594cd8ec332faChris Lattner  ExternalNames.insert("llvm.global_ctors");
1834e2288b9de2fc30d4b88b437c86594cd8ec332faChris Lattner  ExternalNames.insert("llvm.global_dtors");
184088b5913ef6f91fccc3c931653e16bfeb330c90bTanya Lattner  ExternalNames.insert("llvm.global.annotations");
1852631ac3b5b4c2d7eaf8d1db178dc98071a708ad2Duncan Sands
186aab3c0cb077f741af3447cc030c28bedd23b491cBill Wendling  // Never internalize symbols code-gen inserts.
187d275ff5d4c4f4f8bf9a77acd70605caa98c14246Bill Wendling  // FIXME: We should probably add this (and the __stack_chk_guard) via some
188d275ff5d4c4f4f8bf9a77acd70605caa98c14246Bill Wendling  // type of call-back in CodeGen.
189d275ff5d4c4f4f8bf9a77acd70605caa98c14246Bill Wendling  ExternalNames.insert("__stack_chk_fail");
190aab3c0cb077f741af3447cc030c28bedd23b491cBill Wendling  ExternalNames.insert("__stack_chk_guard");
191aab3c0cb077f741af3447cc030c28bedd23b491cBill Wendling
192ef3682a4fbfc3ff1a593adf95740ad8ab0d1d487Devang Patel  // Mark all global variables with initializers that are not in the api as
193ef3682a4fbfc3ff1a593adf95740ad8ab0d1d487Devang Patel  // internal as well.
1944eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner  for (Module::global_iterator I = M.global_begin(), E = M.global_end();
1950fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola       I != E; ++I) {
1967e667c56cf7e27ff521ceb86518beab32bfb630dRafael Espindola    if (!shouldInternalize(*I, ExternalNames))
1970fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola      continue;
1980fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola
199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    I->setVisibility(GlobalValue::DefaultVisibility);
2000fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    I->setLinkage(GlobalValue::InternalLinkage);
2010fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    Changed = true;
2020fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    ++NumGlobals;
2030fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    DEBUG(dbgs() << "Internalized gvar " << I->getName() << "\n");
2040fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola  }
2052631ac3b5b4c2d7eaf8d1db178dc98071a708ad2Duncan Sands
20627a53009efcf1b0334dc17c3d54382798686ff59Duncan Sands  // Mark all aliases that are not in the api as internal as well.
20727a53009efcf1b0334dc17c3d54382798686ff59Duncan Sands  for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end();
2080fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola       I != E; ++I) {
2097e667c56cf7e27ff521ceb86518beab32bfb630dRafael Espindola    if (!shouldInternalize(*I, ExternalNames))
2100fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola      continue;
2110fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola
212dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    I->setVisibility(GlobalValue::DefaultVisibility);
2130fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    I->setLinkage(GlobalValue::InternalLinkage);
2140fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    Changed = true;
2150fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    ++NumAliases;
2160fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola    DEBUG(dbgs() << "Internalized alias " << I->getName() << "\n");
2170fb771667eb2f8a5cd623ce0ee3775b4d1416576Rafael Espindola  }
21827a53009efcf1b0334dc17c3d54382798686ff59Duncan Sands
2194eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner  return Changed;
2204eb40df1a839c08bca6dcab90ba1a4831e5ef52dChris Lattner}
221f629309f74cf1a64aa7fd1cd5784fd7db9a8f59eChris Lattner
22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesModulePass *llvm::createInternalizePass() { return new InternalizePass(); }
223753d94a1c8fe02f64eb4f482d396712c68db1d84Devang Patel
2247e667c56cf7e27ff521ceb86518beab32bfb630dRafael EspindolaModulePass *llvm::createInternalizePass(ArrayRef<const char *> ExportList) {
2257e667c56cf7e27ff521ceb86518beab32bfb630dRafael Espindola  return new InternalizePass(ExportList);
226753d94a1c8fe02f64eb4f482d396712c68db1d84Devang Patel}
227