//===- OptimizationOptions.cpp --------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/OptimizationOptions.h>
#include <mcld/LinkerConfig.h>
#include <mcld/Support/CommandLine.h>
#include <mcld/Support/MsgHandling.h>
namespace {
bool ArgGCSections;
llvm::cl::opt<bool, true> ArgGCSectionsFlag("gc-sections",
llvm::cl::ZeroOrMore,
llvm::cl::location(ArgGCSections),
llvm::cl::desc("Enable garbage collection of unused input sections."),
llvm::cl::init(false));
llvm::cl::opt<bool, true, llvm::cl::FalseParser> ArgNoGCSectionsFlag("no-gc-sections",
llvm::cl::ZeroOrMore,
llvm::cl::location(ArgGCSections),
llvm::cl::desc("disable garbage collection of unused input sections."),
llvm::cl::init(false));
bool ArgPrintGCSections;
llvm::cl::opt<bool, true> ArgPrintGCSectionsFlag("print-gc-sections",
llvm::cl::ZeroOrMore,
llvm::cl::location(ArgPrintGCSections),
llvm::cl::desc("List all sections removed by garbage collection."),
llvm::cl::init(false));
llvm::cl::opt<bool, true, llvm::cl::FalseParser> ArgNoPrintGCSectionsFlag("no-print-gc-sections",
llvm::cl::ZeroOrMore,
llvm::cl::location(ArgPrintGCSections),
llvm::cl::desc("disable --print-gc-sections"),
llvm::cl::init(false));
bool ArgGenUnwindInfo;
llvm::cl::opt<bool, true, llvm::cl::FalseParser>
ArgNoGenUnwindInfoFlag("no-ld-generated-unwind-info",
llvm::cl::ZeroOrMore,
llvm::cl::location(ArgGenUnwindInfo),
llvm::cl::desc("Don't create unwind info for linker"
" generated sections to save size"),
llvm::cl::init(false),
llvm::cl::ValueDisallowed);
llvm::cl::opt<bool, true>
ArgGenUnwindInfoFlag("ld-generated-unwind-info",
llvm::cl::ZeroOrMore,
llvm::cl::location(ArgGenUnwindInfo),
llvm::cl::desc("Request creation of unwind info for linker"
" generated code sections like PLT."),
llvm::cl::init(true),
llvm::cl::ValueDisallowed);
llvm::cl::opt<mcld::GeneralOptions::ICF> ArgICF("icf",
llvm::cl::ZeroOrMore,
llvm::cl::desc("Identical Code Folding"),
llvm::cl::init(mcld::GeneralOptions::ICF_None),
llvm::cl::values(
clEnumValN(mcld::GeneralOptions::ICF_None, "none",
"do not perform cold folding"),
clEnumValN(mcld::GeneralOptions::ICF_All, "all",
"always preform cold folding"),
clEnumValN(mcld::GeneralOptions::ICF_Safe, "safe",
"Folds those whose pointers are definitely not taken."),
clEnumValEnd));
llvm::cl::opt<unsigned> ArgICFIterations("icf-iterations",
llvm::cl::desc("Number of iterations to do ICF."),
llvm::cl::init(2));
llvm::cl::opt<bool> ArgPrintICFSections("print-icf-sections",
llvm::cl::desc("Print the folded identical sections."),
llvm::cl::init(false));
llvm::cl::opt<char> ArgOptLevel("O",
llvm::cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
"(default = '-O2')"),
llvm::cl::Prefix,
llvm::cl::ZeroOrMore,
llvm::cl::init(' '));
llvm::cl::list<std::string> ArgPlugin("plugin",
llvm::cl::desc("Load a plugin library."),
llvm::cl::value_desc("plugin"));
llvm::cl::list<std::string> ArgPluginOpt("plugin-opt",
llvm::cl::desc("Pass an option to the plugin."),
llvm::cl::value_desc("option"));
} // anonymous namespace
using namespace mcld;
//===----------------------------------------------------------------------===//
// OptimizationOptions
//===----------------------------------------------------------------------===//
OptimizationOptions::OptimizationOptions()
: m_GCSections(ArgGCSections),
m_PrintGCSections(ArgPrintGCSections),
m_GenUnwindInfo(ArgGenUnwindInfo),
m_ICF(ArgICF),
m_ICFIterations(ArgICFIterations),
m_PrintICFSections(ArgPrintICFSections),
m_OptLevel(ArgOptLevel),
m_Plugin(ArgPlugin),
m_PluginOpt(ArgPluginOpt) {
}
bool OptimizationOptions::parse(LinkerConfig& pConfig)
{
// set --gc-sections
if (m_GCSections)
pConfig.options().setGCSections();
// set --print-gc-sections
if (m_PrintGCSections)
pConfig.options().setPrintGCSections();
// set --ld-generated-unwind-info (or not)
pConfig.options().setGenUnwindInfo(m_GenUnwindInfo);
// set --icf [mode]
pConfig.options().setICFMode(m_ICF);
pConfig.options().setICFIterations(m_ICFIterations);
pConfig.options().setPrintICFSections(m_PrintICFSections);
return true;
}