Revert "Reapply "LTO: add API to set strategy for -internalize""

This reverts commit r199244.

Conflicts:
	include/llvm-c/lto.h
	include/llvm/LTO/LTOCodeGenerator.h
	lib/LTO/LTOCodeGenerator.cpp

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205471 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith
2014-04-02 22:05:57 +00:00
parent 172e0ca8c5
commit 3845c071a7
6 changed files with 17 additions and 86 deletions

View File

@@ -82,15 +82,6 @@ typedef enum {
LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC = 2 LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC = 2
} lto_codegen_model; } lto_codegen_model;
/**
* \since LTO_API_VERSION=6
*/
typedef enum {
LTO_INTERNALIZE_FULL = 0,
LTO_INTERNALIZE_NONE = 1,
LTO_INTERNALIZE_HIDDEN = 2
} lto_internalize_strategy;
/** opaque reference to a loaded object module */ /** opaque reference to a loaded object module */
typedef struct LTOModule* lto_module_t; typedef struct LTOModule* lto_module_t;
@@ -402,16 +393,6 @@ extern void
lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args, lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args,
int nargs); int nargs);
/**
* Sets the strategy to use during internalize. Default strategy is
* LTO_INTERNALIZE_FULL.
*
* \since LTO_API_VERSION=6
*/
extern void
lto_codegen_set_internalize_strategy(lto_code_gen_t cg,
lto_internalize_strategy);
/** /**
* Tells LTO optimization passes that this symbol must be preserved * Tells LTO optimization passes that this symbol must be preserved
* because it is referenced by native code or a command line option. * because it is referenced by native code or a command line option.

View File

@@ -71,7 +71,6 @@ struct LTOCodeGenerator {
void setTargetOptions(llvm::TargetOptions options); void setTargetOptions(llvm::TargetOptions options);
void setDebugInfo(lto_debug_model); void setDebugInfo(lto_debug_model);
void setCodePICModel(lto_codegen_model); void setCodePICModel(lto_codegen_model);
void setInternalizeStrategy(lto_internalize_strategy);
void setCpu(const char *mCpu) { MCpu = mCpu; } void setCpu(const char *mCpu) { MCpu = mCpu; }
@@ -118,14 +117,6 @@ struct LTOCodeGenerator {
void setDiagnosticHandler(lto_diagnostic_handler_t, void *); void setDiagnosticHandler(lto_diagnostic_handler_t, void *);
bool shouldInternalize() const {
return InternalizeStrategy != LTO_INTERNALIZE_NONE;
}
bool shouldOnlyInternalizeHidden() const {
return InternalizeStrategy == LTO_INTERNALIZE_HIDDEN;
}
private: private:
void initializeLTOPasses(); void initializeLTOPasses();
@@ -154,7 +145,6 @@ private:
bool EmitDwarfDebugInfo; bool EmitDwarfDebugInfo;
bool ScopeRestrictionsDone; bool ScopeRestrictionsDone;
lto_codegen_model CodeModel; lto_codegen_model CodeModel;
lto_internalize_strategy InternalizeStrategy;
StringSet MustPreserveSymbols; StringSet MustPreserveSymbols;
StringSet AsmUndefinedRefs; StringSet AsmUndefinedRefs;
llvm::MemoryBuffer *NativeObjectFile; llvm::MemoryBuffer *NativeObjectFile;

View File

@@ -112,19 +112,14 @@ Pass *createPruneEHPass();
//// ////
/// The symbols in \p ExportList are never internalized. /// The symbols in \p ExportList are never internalized.
/// ///
/// When OnlyHidden=true, only symbols with hidden visibility are internalized.
///
/// The symbol in DSOList are internalized if it is safe to drop them from /// The symbol in DSOList are internalized if it is safe to drop them from
/// the symbol table. /// the symbol table.
/// ///
/// Note that commandline options that are used with the above function are not /// Note that commandline options that are used with the above function are not
/// used now! /// used now!
ModulePass *createInternalizePass(ArrayRef<const char *> ExportList, ModulePass *createInternalizePass(ArrayRef<const char *> ExportList);
bool OnlyHidden = false);
/// createInternalizePass - Same as above, but with an empty exportList. /// createInternalizePass - Same as above, but with an empty exportList.
ModulePass *createInternalizePass(bool OnlyHidden = false); ModulePass *createInternalizePass();
/// createInternalizePass - Resolve ambiguity when passed a const char *.
ModulePass *createInternalizePass(const char *SingleExport);
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
/// createDeadArgEliminationPass - This pass removes arguments from functions /// createDeadArgEliminationPass - This pass removes arguments from functions

View File

@@ -65,8 +65,7 @@ const char* LTOCodeGenerator::getVersionString() {
LTOCodeGenerator::LTOCodeGenerator() LTOCodeGenerator::LTOCodeGenerator()
: Context(getGlobalContext()), Linker(new Module("ld-temp.o", Context)), : Context(getGlobalContext()), Linker(new Module("ld-temp.o", Context)),
TargetMach(NULL), EmitDwarfDebugInfo(false), ScopeRestrictionsDone(false), TargetMach(NULL), EmitDwarfDebugInfo(false), ScopeRestrictionsDone(false),
CodeModel(LTO_CODEGEN_PIC_MODEL_DYNAMIC), CodeModel(LTO_CODEGEN_PIC_MODEL_DYNAMIC), NativeObjectFile(NULL),
InternalizeStrategy(LTO_INTERNALIZE_FULL), NativeObjectFile(NULL),
DiagHandler(NULL), DiagContext(NULL) { DiagHandler(NULL), DiagContext(NULL) {
initializeLTOPasses(); initializeLTOPasses();
} }
@@ -169,18 +168,6 @@ void LTOCodeGenerator::setCodePICModel(lto_codegen_model model) {
llvm_unreachable("Unknown PIC model!"); llvm_unreachable("Unknown PIC model!");
} }
void
LTOCodeGenerator::setInternalizeStrategy(lto_internalize_strategy Strategy) {
switch (Strategy) {
case LTO_INTERNALIZE_FULL:
case LTO_INTERNALIZE_NONE:
case LTO_INTERNALIZE_HIDDEN:
InternalizeStrategy = Strategy;
return;
}
llvm_unreachable("Unknown internalize strategy!");
}
bool LTOCodeGenerator::writeMergedModules(const char *path, bool LTOCodeGenerator::writeMergedModules(const char *path,
std::string &errMsg) { std::string &errMsg) {
if (!determineTarget(errMsg)) if (!determineTarget(errMsg))
@@ -402,7 +389,7 @@ static void accumulateAndSortLibcalls(std::vector<StringRef> &Libcalls,
} }
void LTOCodeGenerator::applyScopeRestrictions() { void LTOCodeGenerator::applyScopeRestrictions() {
if (ScopeRestrictionsDone || !shouldInternalize()) if (ScopeRestrictionsDone)
return; return;
Module *mergedModule = Linker.getModule(); Module *mergedModule = Linker.getModule();
@@ -454,8 +441,7 @@ void LTOCodeGenerator::applyScopeRestrictions() {
LLVMCompilerUsed->setSection("llvm.metadata"); LLVMCompilerUsed->setSection("llvm.metadata");
} }
passes.add( passes.add(createInternalizePass(MustPreserveList));
createInternalizePass(MustPreserveList, shouldOnlyInternalizeHidden()));
// apply scope restrictions // apply scope restrictions
passes.run(*mergedModule); passes.run(*mergedModule);

View File

@@ -54,11 +54,10 @@ APIList("internalize-public-api-list", cl::value_desc("list"),
namespace { namespace {
class InternalizePass : public ModulePass { class InternalizePass : public ModulePass {
std::set<std::string> ExternalNames; std::set<std::string> ExternalNames;
bool OnlyHidden;
public: public:
static char ID; // Pass identification, replacement for typeid static char ID; // Pass identification, replacement for typeid
explicit InternalizePass(bool OnlyHidden = false); explicit InternalizePass();
explicit InternalizePass(ArrayRef<const char *> ExportList, bool OnlyHidden); explicit InternalizePass(ArrayRef<const char *> ExportList);
void LoadFile(const char *Filename); void LoadFile(const char *Filename);
bool runOnModule(Module &M) override; bool runOnModule(Module &M) override;
@@ -73,17 +72,15 @@ char InternalizePass::ID = 0;
INITIALIZE_PASS(InternalizePass, "internalize", INITIALIZE_PASS(InternalizePass, "internalize",
"Internalize Global Symbols", false, false) "Internalize Global Symbols", false, false)
InternalizePass::InternalizePass(bool OnlyHidden) InternalizePass::InternalizePass() : ModulePass(ID) {
: ModulePass(ID), OnlyHidden(OnlyHidden) {
initializeInternalizePassPass(*PassRegistry::getPassRegistry()); initializeInternalizePassPass(*PassRegistry::getPassRegistry());
if (!APIFile.empty()) // If a filename is specified, use it. if (!APIFile.empty()) // If a filename is specified, use it.
LoadFile(APIFile.c_str()); LoadFile(APIFile.c_str());
ExternalNames.insert(APIList.begin(), APIList.end()); ExternalNames.insert(APIList.begin(), APIList.end());
} }
InternalizePass::InternalizePass(ArrayRef<const char *> ExportList, InternalizePass::InternalizePass(ArrayRef<const char *> ExportList)
bool OnlyHidden) : ModulePass(ID) {
: ModulePass(ID), OnlyHidden(OnlyHidden) {
initializeInternalizePassPass(*PassRegistry::getPassRegistry()); initializeInternalizePassPass(*PassRegistry::getPassRegistry());
for(ArrayRef<const char *>::const_iterator itr = ExportList.begin(); for(ArrayRef<const char *>::const_iterator itr = ExportList.begin();
itr != ExportList.end(); itr++) { itr != ExportList.end(); itr++) {
@@ -108,11 +105,7 @@ void InternalizePass::LoadFile(const char *Filename) {
} }
static bool shouldInternalize(const GlobalValue &GV, static bool shouldInternalize(const GlobalValue &GV,
const std::set<std::string> &ExternalNames, const std::set<std::string> &ExternalNames) {
bool OnlyHidden) {
if (OnlyHidden && !GV.hasHiddenVisibility())
return false;
// Function must be defined here // Function must be defined here
if (GV.isDeclaration()) if (GV.isDeclaration())
return false; return false;
@@ -162,7 +155,7 @@ bool InternalizePass::runOnModule(Module &M) {
// Mark all functions not in the api as internal. // Mark all functions not in the api as internal.
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
if (!shouldInternalize(*I, ExternalNames, OnlyHidden)) if (!shouldInternalize(*I, ExternalNames))
continue; continue;
I->setLinkage(GlobalValue::InternalLinkage); I->setLinkage(GlobalValue::InternalLinkage);
@@ -198,7 +191,7 @@ bool InternalizePass::runOnModule(Module &M) {
// internal as well. // internal as well.
for (Module::global_iterator I = M.global_begin(), E = M.global_end(); for (Module::global_iterator I = M.global_begin(), E = M.global_end();
I != E; ++I) { I != E; ++I) {
if (!shouldInternalize(*I, ExternalNames, OnlyHidden)) if (!shouldInternalize(*I, ExternalNames))
continue; continue;
I->setLinkage(GlobalValue::InternalLinkage); I->setLinkage(GlobalValue::InternalLinkage);
@@ -210,7 +203,7 @@ bool InternalizePass::runOnModule(Module &M) {
// Mark all aliases that are not in the api as internal as well. // Mark all aliases that are not in the api as internal as well.
for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end(); for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end();
I != E; ++I) { I != E; ++I) {
if (!shouldInternalize(*I, ExternalNames, OnlyHidden)) if (!shouldInternalize(*I, ExternalNames))
continue; continue;
I->setLinkage(GlobalValue::InternalLinkage); I->setLinkage(GlobalValue::InternalLinkage);
@@ -222,15 +215,8 @@ bool InternalizePass::runOnModule(Module &M) {
return Changed; return Changed;
} }
ModulePass *llvm::createInternalizePass(bool OnlyHidden) { ModulePass *llvm::createInternalizePass() { return new InternalizePass(); }
return new InternalizePass(OnlyHidden);
}
ModulePass *llvm::createInternalizePass(ArrayRef<const char *> ExportList, ModulePass *llvm::createInternalizePass(ArrayRef<const char *> ExportList) {
bool OnlyHidden) { return new InternalizePass(ExportList);
return new InternalizePass(ExportList, OnlyHidden);
}
ModulePass *llvm::createInternalizePass(const char *SingleExport) {
return createInternalizePass(ArrayRef<const char *>(SingleExport));
} }

View File

@@ -264,13 +264,6 @@ void lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args,
// In here only for backwards compatibility. We use MC now. // In here only for backwards compatibility. We use MC now.
} }
/// lto_codegen_set_internalize_strategy - Sets the strategy to use during
/// internalize.
void lto_codegen_set_internalize_strategy(lto_code_gen_t cg,
lto_internalize_strategy strategy) {
cg->setInternalizeStrategy(strategy);
}
/// lto_codegen_add_must_preserve_symbol - Adds to a list of all global symbols /// lto_codegen_add_must_preserve_symbol - Adds to a list of all global symbols
/// that must exist in the final generated code. If a function is not listed /// that must exist in the final generated code. If a function is not listed
/// there, it might be inlined into every usage and optimized away. /// there, it might be inlined into every usage and optimized away.