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