Don't internalize all but main by default.

This is mostly a cleanup, but it changes a fairly old behavior.

Every "real" LTO user was already disabling the silly internalize pass
and creating the internalize pass itself. The difference with this
patch is for "opt -std-link-opts" and the C api.

Now to get a usable behavior out of opt one doesn't need the funny
looking command line:

opt -internalize -disable-internalize -internalize-public-api-list=foo,bar -std-link-opts

llvm-svn: 214919
This commit is contained in:
Rafael Espindola 2014-08-05 20:10:38 +00:00
parent c03b6e7880
commit f9e52cf015
6 changed files with 7 additions and 35 deletions

View File

@ -144,8 +144,8 @@ public:
/// populateModulePassManager - This sets up the primary pass manager.
void populateModulePassManager(PassManagerBase &MPM);
void populateLTOPassManager(PassManagerBase &PM, bool Internalize,
bool RunInliner, bool DisableGVNLoadPRE = false);
void populateLTOPassManager(PassManagerBase &PM, bool RunInliner,
bool DisableGVNLoadPRE);
};
/// Registers a function for adding a standard set of passes. This should be

View File

@ -475,10 +475,8 @@ bool LTOCodeGenerator::generateObjectFile(raw_ostream &out,
// keeps only main if it exists and does nothing for libraries. Instead
// we create the pass ourselves with the symbol list provided by the linker.
if (!DisableOpt)
PassManagerBuilder().populateLTOPassManager(passes,
/*Internalize=*/false,
!DisableInline,
DisableGVNLoadPRE);
PassManagerBuilder().populateLTOPassManager(passes, !DisableInline,
DisableGVNLoadPRE);
// Make sure everything is still good.
passes.add(createVerifierPass());

View File

@ -284,18 +284,11 @@ void PassManagerBuilder::populateModulePassManager(PassManagerBase &MPM) {
}
void PassManagerBuilder::populateLTOPassManager(PassManagerBase &PM,
bool Internalize,
bool RunInliner,
bool DisableGVNLoadPRE) {
// Provide AliasAnalysis services for optimizations.
addInitialAliasAnalysisPasses(PM);
// Now that composite has been compiled, scan through the module, looking
// for a main function. If main is defined, mark all other functions
// internal.
if (Internalize)
PM.add(createInternalizePass("main"));
// Propagate constants at call sites into the functions they call. This
// opens opportunities for globalopt (and inlining) by substituting function
// pointers passed as arguments to direct uses of functions.
@ -461,5 +454,5 @@ void LLVMPassManagerBuilderPopulateLTOPassManager(LLVMPassManagerBuilderRef PMB,
LLVMBool RunInliner) {
PassManagerBuilder *Builder = unwrap(PMB);
PassManagerBase *LPM = unwrap(PM);
Builder->populateLTOPassManager(*LPM, Internalize != 0, RunInliner != 0);
Builder->populateLTOPassManager(*LPM, RunInliner != 0, false);
}

View File

@ -1,13 +0,0 @@
;RUN: opt -S -std-link-opts < %s | FileCheck %s
; Simple test to check that -std-link-opts keeps only the main function.
; CHECK-NOT: define
; CHECK: define void @main
; CHECK-NOT: define
define void @main() {
ret void
}
define void @foo() {
ret void
}

View File

@ -179,8 +179,7 @@ int main(int argc, char **argv) {
if (StandardLinkOpts) {
PassManagerBuilder Builder;
Builder.populateLTOPassManager(PM, /*Internalize=*/true,
/*RunInliner=*/true);
Builder.populateLTOPassManager(PM, /*RunInliner=*/true, false);
}
if (OptLevelO1 || OptLevelO2 || OptLevelO3) {

View File

@ -108,10 +108,6 @@ static cl::opt<bool>
DisableOptimizations("disable-opt",
cl::desc("Do not run any optimization passes"));
static cl::opt<bool>
DisableInternalize("disable-internalize",
cl::desc("Do not mark all symbols as internal"));
static cl::opt<bool>
StandardCompileOpts("std-compile-opts",
cl::desc("Include the standard compile time optimizations"));
@ -271,8 +267,7 @@ static void AddStandardLinkPasses(PassManagerBase &PM) {
if (DisableOptimizations) return;
PassManagerBuilder Builder;
Builder.populateLTOPassManager(PM, /*Internalize=*/ !DisableInternalize,
/*RunInliner=*/ !DisableInline);
Builder.populateLTOPassManager(PM, /*RunInliner=*/!DisableInline, false);
}
//===----------------------------------------------------------------------===//