//===- 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; }