Main.cpp revision cfcb22478ca64c308df58f9abe6fa2dedb213c16
12bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar//===- Main.cpp -----------------------------------------------------------===// 22bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar// 32bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar// The MCLinker Project 42bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar// 52bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 62bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar// License. See LICENSE.TXT for details. 72bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar// 82bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar//===----------------------------------------------------------------------===// 92bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/Environment.h> 102bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/IRBuilder.h> 112bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/Linker.h> 122bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/LinkerConfig.h> 132bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/LinkerScript.h> 142bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/Module.h> 152bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/ADT/StringEntry.h> 162bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/MC/InputAction.h> 172bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/MC/CommandAction.h> 182bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/MC/FileAction.h> 192bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/MC/ZOption.h> 202bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/Support/raw_ostream.h> 212bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/Support/MsgHandling.h> 222bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/Support/Path.h> 232bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/Support/SystemUtils.h> 242bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <mcld/Support/TargetRegistry.h> 252bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 262bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <llvm/ADT/ArrayRef.h> 272bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <llvm/ADT/SmallVector.h> 282bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <llvm/ADT/STLExtras.h> 292bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <llvm/ADT/StringRef.h> 302bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <llvm/ADT/StringSwitch.h> 312bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <llvm/Option/Arg.h> 322bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <llvm/Option/ArgList.h> 332bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <llvm/Option/OptTable.h> 342bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <llvm/Option/Option.h> 352bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <llvm/Support/ManagedStatic.h> 362bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <llvm/Support/Process.h> 372bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <llvm/Support/Signals.h> 382bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 392bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <cassert> 402bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <cstdlib> 412bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <string> 422bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 432bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#if defined(HAVE_UNISTD_H) 442bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <unistd.h> 452bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#endif 462bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 472bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#if defined(_MSC_VER) || defined(__MINGW32__) 482bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <io.h> 492bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#ifndef STDIN_FILENO 502bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#define STDIN_FILENO 0 512bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#endif 522bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#ifndef STDOUT_FILENO 532bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#define STDOUT_FILENO 1 542bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#endif 552bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#ifndef STDERR_FILENO 562bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#define STDERR_FILENO 2 572bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#endif 582bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#endif 592bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 602bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainarnamespace { 612bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 622bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainarclass Driver { 632bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar private: 642bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar enum Option { 652bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // This is not an option. 662bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar kOpt_INVALID = 0, 672bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ 682bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar HELPTEXT, METAVAR) \ 692bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar kOpt_ ## ID, 702bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include "Options.inc" // NOLINT 712bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#undef OPTION 722bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar kOpt_LastOption 732bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar }; 742bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 752bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar class OptTable : public llvm::opt::OptTable { 762bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar private: 772bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#define PREFIX(NAME, VALUE) \ 782bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar static const char* const NAME[]; 792bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include "Options.inc" // NOLINT 802bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#undef PREFIX 812bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar static const llvm::opt::OptTable::Info InfoTable[]; 822bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 832bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar public: 842bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar OptTable(); 852bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar }; 862bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 872bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar private: 88cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines explicit Driver(const char* prog_name) 892bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar : prog_name_(prog_name), 902bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar module_(script_), 912bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar ir_builder_(module_, config_) { 922bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return; 932bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 942bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 952bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar public: 962bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar static std::unique_ptr<Driver> Create(llvm::ArrayRef<const char*> argv); 972bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 982bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar bool Run(); 992bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1002bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar private: 101cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines bool TranslateArguments(llvm::opt::InputArgList& args); 1022bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1032bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar private: 1042bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar const char* prog_name_; 1052bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1062bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::LinkerScript script_; 1072bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1082bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::LinkerConfig config_; 1092bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1102bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::Module module_; 1112bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1122bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::IRBuilder ir_builder_; 1132bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1142bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::Linker linker_; 1152bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1162bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar private: 1172bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar DISALLOW_COPY_AND_ASSIGN(Driver); 1182bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar}; 1192bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1202bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#define PREFIX(NAME, VALUE) \ 1212bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar const char* const Driver::OptTable::NAME[] = VALUE; 1222bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include "Options.inc" // NOLINT 1232bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#undef PREFIX 1242bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1252bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainarconst llvm::opt::OptTable::Info Driver::OptTable::InfoTable[] = { 1262bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ 1272bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar HELPTEXT, METAVAR) \ 1282bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar { PREFIX, NAME, HELPTEXT, METAVAR, kOpt_ ## ID, \ 1292bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::opt::Option::KIND ## Class, PARAM, FLAGS, kOpt_ ## GROUP, \ 1302bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar kOpt_ ## ALIAS, ALIASARGS }, 131cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines#include "Options.inc" // NOLINT 1322bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#undef OPTION 1332bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar}; 1342bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1352bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga NainarDriver::OptTable::OptTable() 136cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines : llvm::opt::OptTable(InfoTable) { } 1372bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1382bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainarinline bool ShouldColorize() { 1392bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar const char* term = getenv("TERM"); 1402bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return term && (0 != strcmp(term, "dumb")); 1412bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar} 1422bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1432bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar/// ParseProgName - Parse program name 1442bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar/// This function simplifies cross-compiling by reading triple from the program 1452bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar/// name. For example, if the program name is `arm-linux-eabi-ld.mcld', we can 1462bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar/// get the triple is arm-linux-eabi by the program name. 1472bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainarinline std::string ParseProgName(const char* prog_name) { 1482bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar static const char* suffixes[] = {"ld", "ld.mcld"}; 1492bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1502bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::string name(mcld::sys::fs::Path(prog_name).stem().native()); 1512bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1522bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar for (size_t i = 0; i < sizeof(suffixes) / sizeof(suffixes[0]); ++i) { 1532bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (name == suffixes[i]) 1542bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return std::string(); 1552bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 1562bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1572bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef prog_name_ref(prog_name); 1582bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef prefix; 1592bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1602bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar for (size_t i = 0; i < sizeof(suffixes) / sizeof(suffixes[0]); ++i) { 1612bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (!prog_name_ref.endswith(suffixes[i])) 1622bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar continue; 1632bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1642bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef::size_type last_component = 1652bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar prog_name_ref.rfind('-', prog_name_ref.size() - strlen(suffixes[i])); 1662bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (last_component == llvm::StringRef::npos) 1672bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar continue; 1682bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef prefix = prog_name_ref.slice(0, last_component); 1692bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::string ignored_error; 1702bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (!mcld::TargetRegistry::lookupTarget(prefix, ignored_error)) 1712bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar continue; 1722bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return prefix.str(); 1732bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 1742bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return std::string(); 1752bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar} 1762bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1772bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainarinline void ParseEmulation(llvm::Triple& triple, const char* emulation) { 1782bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::Triple emu_triple = 1792bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringSwitch<llvm::Triple>(emulation) 1802bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("aarch64linux", llvm::Triple("aarch64", "", "linux", "gnu")) 1812bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("armelf_linux_eabi", llvm::Triple("arm", "", "linux", "gnu")) 1822bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("elf_i386", llvm::Triple("i386", "", "", "gnu")) 1832bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("elf_x86_64", llvm::Triple("x86_64", "", "", "gnu")) 1842bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("elf32_x86_64", llvm::Triple("x86_64", "", "", "gnux32")) 1852bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("elf_i386_fbsd", llvm::Triple("i386", "", "freebsd", "gnu")) 1862bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("elf_x86_64_fbsd", llvm::Triple("x86_64", "", "freebsd", "gnu")) 1872bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("elf32ltsmip", llvm::Triple("mipsel", "", "", "gnu")) 1882bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("elf64ltsmip", llvm::Triple("mips64el", "", "", "gnu")) 1892bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Default(llvm::Triple()); 1902bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1912bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (emu_triple.getArch() == llvm::Triple::UnknownArch && 1922bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar emu_triple.getOS() == llvm::Triple::UnknownOS && 1932bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar emu_triple.getEnvironment() == llvm::Triple::UnknownEnvironment) 1942bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::error(mcld::diag::err_invalid_emulation) << emulation << "\n"; 1952bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1962bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (emu_triple.getArch() != llvm::Triple::UnknownArch) 1972bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar triple.setArch(emu_triple.getArch()); 1982bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1992bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (emu_triple.getOS() != llvm::Triple::UnknownOS) 2002bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar triple.setOS(emu_triple.getOS()); 2012bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 2022bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (emu_triple.getEnvironment() != llvm::Triple::UnknownEnvironment) 2032bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar triple.setEnvironment(emu_triple.getEnvironment()); 2042bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar} 2052bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 2062bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar/// Configure the output filename. 2072bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainarinline bool ConfigureOutputName(llvm::StringRef output_name, 2082bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::Module& module, 2092bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::LinkerConfig& config) { 2102bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::string output(output_name.str()); 2112bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (output.empty()) { 2122bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (config.targets().triple().getOS() == llvm::Triple::Win32) { 2132bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar output.assign("_out"); 2142bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar switch (config.codeGenType()) { 2152bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case mcld::LinkerConfig::Object: { 2162bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar output += ".obj"; 2172bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 2182bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 2192bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case mcld::LinkerConfig::DynObj: { 2202bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar output += ".dll"; 2212bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 2222bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 2232bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case mcld::LinkerConfig::Exec: { 2242bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar output += ".exe"; 2252bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 2262bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 2272bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case mcld::LinkerConfig::External: 2282bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 2292bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar default: { 2302bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 2312bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 2322bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 2332bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } // switch (config.codeGenType()) 2342bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } else { 2352bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar output.assign("a.out"); 2362bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 2372bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } // if (output.empty()) 2382bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 2392bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar module.setName(output); 2402bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return true; 2412bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar} 2422bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 2432bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainarbool InitializeInputs(mcld::IRBuilder& ir_builder, 2442bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::vector<std::unique_ptr<mcld::InputAction>>& input_actions) { 2452bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar for (auto& action : input_actions) { 2462bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar assert(action != nullptr); 2472bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action->activate(ir_builder.getInputBuilder()); 2482bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 2492bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 2502bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (ir_builder.getInputBuilder().isInGroup()) { 2512bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::fatal(mcld::diag::fatal_forbid_nest_group); 2522bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 2532bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 2542bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 2552bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return true; 2562bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar} 2572bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 258cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hinesbool Driver::TranslateArguments(llvm::opt::InputArgList& args) { 2592bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 2602bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Preference 2612bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 2622bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 2632bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --color=mode 264cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_Color)) { 2652bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar bool res = llvm::StringSwitch<bool>(arg->getValue()) 2662bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("never", false) 2672bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("always", true) 2682bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("auto", ShouldColorize() && 2692bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::sys::Process::FileDescriptorIsDisplayed( 2702bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar STDOUT_FILENO)) 2712bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Default(false); 2722bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setColor(res); 2732bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::outs().setColor(res); 2742bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs().setColor(res); 2752bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 2762bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 2772bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --trace 278cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.options().setTrace(args.hasArg(kOpt_Trace)); 2792bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 2802bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --verbose=level 281cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_Verbose)) { 2822bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 2832bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar int level; 2842bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (value.getAsInteger(0, level)) { 2852bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Invalid value for" << arg->getOption().getPrefixedName() 2862bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar << ": " << arg->getValue(); 2872bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 2882bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 2892bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setVerbose(level); 2902bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 2912bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 2922bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --error-limit NUMBER 293cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_ErrorLimit)) { 2942bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 2952bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar int num; 2962bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (value.getAsInteger(0, num) || (num < 0)) { 2972bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Invalid value for" << arg->getOption().getPrefixedName() 2982bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar << ": " << arg->getValue(); 2992bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 3002bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 3012bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setMaxErrorNum(num); 3022bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 3032bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 3042bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --warning-limit NUMBER 305cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_WarningLimit)) { 3062bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 3072bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar int num; 3082bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (value.getAsInteger(0, num) || (num < 0)) { 3092bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Invalid value for" << arg->getOption().getPrefixedName() 3102bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar << ": " << arg->getValue(); 3112bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 3122bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 3132bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setMaxWarnNum(num); 3142bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 3152bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 3162bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --warn-shared-textrel 317cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.options().setWarnSharedTextrel(args.hasArg(kOpt_WarnSharedTextrel)); 3182bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 3192bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 3202bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Target 3212bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 3222bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::Triple triple; 323cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_Triple)) { 3242bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // 1. Use the triple from command. 3252bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -mtriple=value 3262bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar triple.setTriple(arg->getValue()); 3272bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } else { 3282bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::string prog_triple = ParseProgName(prog_name_); 3292bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (!prog_triple.empty()) { 3302bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // 2. Use the triple from the program name prefix. 3312bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar triple.setTriple(prog_triple); 3322bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } else { 3332bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // 3. Use the default target triple. 3342bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar triple.setTriple(mcld::sys::getDefaultTargetTriple()); 3352bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 3362bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 3372bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 3382bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // If a specific emulation was requested, apply it now. 339cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_Emulation)) { 3402bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -m emulation 3412bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar ParseEmulation(triple, arg->getValue()); 342cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines } else if (llvm::opt::Arg* arg = args.getLastArg(kOpt_Arch)) { 3432bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -march=value 3442bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.targets().setArch(arg->getValue()); 3452bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 3462bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 347cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_CPU)) { 3482bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.targets().setTargetCPU(arg->getValue()); 3492bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 3502bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 3512bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.targets().setTriple(triple); 3522bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 3532bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --gpsize=value 354cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_GPSize)) { 3552bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 3562bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar int size; 3572bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (value.getAsInteger(0, size) || (size< 0)) { 3582bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Invalid value for" << arg->getOption().getPrefixedName() 3592bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar << ": " << arg->getValue() << "\n"; 3602bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 3612bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 362cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.targets().setGPSize(size); 3632bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 3642bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 365cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines // --stub-group-size=value 366cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_StubGroupSize)) { 367cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines llvm::StringRef value = arg->getValue(); 368cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines int size; 369cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (value.getAsInteger(0, size) || (size< 0)) { 370cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines mcld::errs() << "Invalid value for" << arg->getOption().getPrefixedName() 371cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines << ": " << arg->getValue() << "\n"; 372cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines return false; 373cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines } 374cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.targets().setStubGroupSize(size); 375cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines } 376cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines 377cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines // --fix-cortex-a53-835769 378cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.targets().setFixCA53Erratum835769( 379cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines args.hasArg(kOpt_FixCA53Erratum835769)); 380cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines 381cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines // --fix-cortex-a53-843419 382cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.targets().setFixCA53Erratum843419( 383cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines args.hasArg(kOpt_FixCA53Erratum843419)); 384cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines 3852bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 3862bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Dynamic 3872bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 3882bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 3892bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --entry=entry 390cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_Entry)) { 3912bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar script_.setEntry(arg->getValue()); 3922bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 3932bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 3942bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -Bsymbolic 395cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.options().setBsymbolic(args.hasArg(kOpt_Bsymbolic)); 3962bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 3972bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -Bgroup 398cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.options().setBgroup(args.hasArg(kOpt_Bgroup)); 3992bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 4002bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -soname=name 401cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_SOName)) { 4022bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setSOName(arg->getValue()); 4032bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 4042bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 4052bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --no-undefined 406cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (args.hasArg(kOpt_NoUndef)) { 4072bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setNoUndefined(true); 4082bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 4092bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 4102bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --allow-multiple-definition 411cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (args.hasArg(kOpt_AllowMulDefs)) { 4122bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setMulDefs(true); 4132bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 4142bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 4152bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -z options 416cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines for (llvm::opt::Arg* arg : args.filtered(kOpt_Z)) { 4172bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 4182bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::ZOption z_opt = 4192bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringSwitch<mcld::ZOption>(value) 4202bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("combreloc", mcld::ZOption(mcld::ZOption::CombReloc)) 4212bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("nocombreloc", mcld::ZOption(mcld::ZOption::NoCombReloc)) 4222bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("defs", mcld::ZOption(mcld::ZOption::Defs)) 4232bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("execstack", mcld::ZOption(mcld::ZOption::ExecStack)) 4242bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("noexecstack", mcld::ZOption(mcld::ZOption::NoExecStack)) 4252bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("initfirst", mcld::ZOption(mcld::ZOption::InitFirst)) 4262bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("interpose", mcld::ZOption(mcld::ZOption::InterPose)) 4272bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("loadfltr", mcld::ZOption(mcld::ZOption::LoadFltr)) 4282bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("muldefs", mcld::ZOption(mcld::ZOption::MulDefs)) 4292bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("nocopyreloc", mcld::ZOption(mcld::ZOption::NoCopyReloc)) 4302bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("nodefaultlib", mcld::ZOption(mcld::ZOption::NoDefaultLib)) 4312bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("nodelete", mcld::ZOption(mcld::ZOption::NoDelete)) 4322bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("nodlopen", mcld::ZOption(mcld::ZOption::NoDLOpen)) 4332bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("nodump", mcld::ZOption(mcld::ZOption::NoDump)) 4342bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("relro", mcld::ZOption(mcld::ZOption::Relro)) 4352bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("norelro", mcld::ZOption(mcld::ZOption::NoRelro)) 4362bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("lazy", mcld::ZOption(mcld::ZOption::Lazy)) 4372bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("now", mcld::ZOption(mcld::ZOption::Now)) 4382bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("origin", mcld::ZOption(mcld::ZOption::Origin)) 4392bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Default(mcld::ZOption()); 4402bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 4412bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (z_opt.kind() == mcld::ZOption::Unknown) { 4422bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (value.startswith("common-page-size=")) { 4432bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -z common-page-size=value 4442bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar z_opt.setKind(mcld::ZOption::CommPageSize); 4452bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar long long unsigned size = 0; 4462bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar value.drop_front(17).getAsInteger(0, size); 4472bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar z_opt.setPageSize(static_cast<uint64_t>(size)); 4482bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } else if (value.startswith("max-page-size=")) { 4492bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -z max-page-size=value 4502bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar z_opt.setKind(mcld::ZOption::MaxPageSize); 4512bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar long long unsigned size = 0; 4522bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar value.drop_front(14).getAsInteger(0, size); 4532bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar z_opt.setPageSize(static_cast<uint64_t>(size)); 4542bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 4552bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 4562bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().addZOption(z_opt); 4572bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 4582bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 4592bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --dynamic-linker=file 460cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_Dyld)) { 4612bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setDyld(arg->getValue()); 4622bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 4632bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 4642bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --enable-new-dtags 465cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.options().setNewDTags(args.hasArg(kOpt_EnableNewDTags)); 4662bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 4672bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --spare-dyanmic-tags COUNT 468cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_SpareDTags)) { 4692bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 4702bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar int num; 4712bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (value.getAsInteger(0, num) || (num < 0)) { 4722bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Invalid value for" << arg->getOption().getPrefixedName() 4732bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar << ": " << arg->getValue() << "\n"; 4742bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 4752bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 4762bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setNumSpareDTags(num); 4772bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 4782bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 4792bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 4802bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Output 4812bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 4822bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 4832bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Setup the codegen type. 484cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (args.hasArg(kOpt_Shared) || args.hasArg(kOpt_PIE)) { 4852bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -shared, -pie 4862bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.setCodeGenType(mcld::LinkerConfig::DynObj); 487cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines } else if (args.hasArg(kOpt_Relocatable)) { 4882bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -r 4892bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.setCodeGenType(mcld::LinkerConfig::Object); 490cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines } else if (llvm::opt::Arg* arg = args.getLastArg(kOpt_OutputFormat)) { 4912bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --oformat=value 4922bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 4932bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (value.equals("binary")) { 4942bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.setCodeGenType(mcld::LinkerConfig::Binary); 4952bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 4962bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } else { 4972bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.setCodeGenType(mcld::LinkerConfig::Exec); 4982bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 4992bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5002bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Setup the output filename. 5012bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef output_name; 502cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_Output)) { 5032bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar output_name = arg->getValue(); 5042bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 5052bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (!ConfigureOutputName(output_name, module_, config_)) { 5062bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::unreachable(mcld::diag::unrecognized_output_file) << module_.name(); 5072bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 5082bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } else { 509cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (!args.hasArg(kOpt_SOName)) { 5102bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setSOName(module_.name()); 5112bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 5122bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 5132bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5142bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --format=value 515cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_InputFormat)) { 5162bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 5172bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (value.equals("binary")) { 5182bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setBinaryInput(); 5192bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 5202bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 5212bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5222bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Setup debug info stripping. 523cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.options().setStripDebug(args.hasArg(kOpt_StripDebug) || 524cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines args.hasArg(kOpt_StripAll)); 5252bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5262bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Setup symbol stripping mode. 527cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (args.hasArg(kOpt_StripAll)) { 5282bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setStripSymbols( 5292bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::GeneralOptions::StripSymbolMode::StripAllSymbols); 530cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines } else if (args.hasArg(kOpt_DiscardAll)) { 5312bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setStripSymbols( 5322bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::GeneralOptions::StripSymbolMode::StripLocals); 533cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines } else if (args.hasArg(kOpt_DiscardLocals)) { 5342bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setStripSymbols( 5352bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::GeneralOptions::StripSymbolMode::StripTemporaries); 5362bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } else { 5372bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setStripSymbols( 5382bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::GeneralOptions::StripSymbolMode::KeepAllSymbols); 5392bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 5402bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5412bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --eh-frame-hdr 542cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.options().setEhFrameHdr(args.hasArg(kOpt_EHFrameHdr)); 5432bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5442bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -pie 545cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.options().setPIE(args.hasArg(kOpt_PIE)); 5462bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5472bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --nmagic 548cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.options().setNMagic(args.hasArg(kOpt_NMagic)); 5492bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5502bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --omagic 551cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.options().setOMagic(args.hasArg(kOpt_OMagic)); 5522bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5532bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --hash-style=style 554cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_HashStyle)) { 5552bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::GeneralOptions::HashStyle style = 5562bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringSwitch<mcld::GeneralOptions::HashStyle>(arg->getValue()) 5572bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("sysv", mcld::GeneralOptions::HashStyle::SystemV) 5582bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("gnu", mcld::GeneralOptions::HashStyle::GNU) 5592bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("both", mcld::GeneralOptions::HashStyle::Both) 5602bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Default(mcld::GeneralOptions::HashStyle::Unknown); 5612bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (style != mcld::GeneralOptions::HashStyle::Unknown) { 5622bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setHashStyle(style); 5632bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 5642bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 5652bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5662bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --[no]-export-dynamic 567cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_ExportDynamic, 5682bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar kOpt_NoExportDynamic)) { 5692bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (arg->getOption().matches(kOpt_ExportDynamic)) { 5702bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setExportDynamic(true); 5712bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } else { 5722bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setExportDynamic(false); 5732bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 5742bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 5752bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5762bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --no-warn-mismatch 577cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.options().setWarnMismatch(!args.hasArg(kOpt_NoWarnMismatch)); 5782bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5792bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --exclude-libs 580cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_ExcludeLibs)) { 5812bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 5822bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar do { 5832bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::pair<llvm::StringRef, llvm::StringRef> res = value.split(','); 5842bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().excludeLIBS().insert(res.first.str()); 5852bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar value = res.second; 5862bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } while (!value.empty()); 5872bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 5882bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5892bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 5902bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Search Path 5912bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 5922bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 5932bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --sysroot 594cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_Sysroot)) { 5952bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::sys::fs::Path path(arg->getValue()); 5962bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (mcld::sys::fs::exists(path) && mcld::sys::fs::is_directory(path)) { 5972bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar script_.setSysroot(path); 5982bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 5992bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 6002bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6012bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -L searchdir 602cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines for (llvm::opt::Arg* arg : args.filtered(kOpt_LibraryPath)) { 603cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (!script_.directories().insert(arg->getValue())) 604cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines mcld::warning(mcld::diag::warn_cannot_open_search_dir) << arg->getValue(); 6052bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 6062bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6072bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -nostdlib 608cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.options().setNoStdlib(args.hasArg(kOpt_NoStdlib)); 6092bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6102bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -rpath=path 611cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines for (llvm::opt::Arg* arg : args.filtered(kOpt_RPath)) { 6122bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().getRpathList().push_back(arg->getValue()); 6132bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 6142bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6152bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 6162bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Symbol 6172bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 6182bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6192bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -d/-dc/-dp 620cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines config_.options().setDefineCommon(args.hasArg(kOpt_DefineCommon)); 6212bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6222bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -u symbol 623cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines for (llvm::opt::Arg* arg : args.filtered(kOpt_Undefined)) { 6242bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().getUndefSymList().push_back(arg->getValue()); 6252bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 6262bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6272bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 6282bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Script 6292bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 6302bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6312bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --wrap=symbol 632cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines for (llvm::opt::Arg* arg : args.filtered(kOpt_Wrap)) { 6332bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar bool exist = false; 6342bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar const char* symbol = arg->getValue(); 6352bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // symbol -> __wrap_symbol 6362bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::StringEntry<llvm::StringRef>* to_wrap = 6372bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar script_.renameMap().insert(symbol, exist); 6382bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6392bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::string to_wrap_str; 6402bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar to_wrap_str.append("__wrap_") 6412bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .append(symbol); 6422bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar to_wrap->setValue(to_wrap_str); 6432bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6442bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (exist) 6452bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::warning(mcld::diag::rewrap) << symbol << to_wrap_str; 6462bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6472bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // __real_symbol -> symbol 6482bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::string from_real_str; 6492bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar to_wrap_str.append("__real_") 6502bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .append(symbol); 6512bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::StringEntry<llvm::StringRef>* from_real = 6522bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar script_.renameMap().insert(from_real_str, exist); 6532bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar from_real->setValue(symbol); 6542bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6552bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (exist) 6562bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::warning(mcld::diag::rewrap) << symbol << from_real_str; 6572bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 6582bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6592bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --portalbe=symbol 660cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines for (llvm::opt::Arg* arg : args.filtered(kOpt_Portable)) { 6612bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar bool exist = false; 6622bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar const char* symbol = arg->getValue(); 6632bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // symbol -> symbol_portable 6642bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::StringEntry<llvm::StringRef>* to_wrap = 6652bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar script_.renameMap().insert(symbol, exist); 6662bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6672bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::string to_wrap_str; 6682bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar to_wrap_str.append(symbol) 6692bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .append("_portable"); 6702bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar to_wrap->setValue(to_wrap_str); 6712bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6722bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (exist) 6732bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::warning(mcld::diag::rewrap) << symbol << to_wrap_str; 6742bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6752bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // __real_symbol -> symbol 6762bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::string from_real_str; 6772bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar to_wrap_str.append("__real_") 6782bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .append(symbol); 6792bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::StringEntry<llvm::StringRef>* from_real = 6802bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar script_.renameMap().insert(from_real_str, exist); 6812bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar from_real->setValue(symbol); 6822bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6832bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (exist) 6842bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::warning(mcld::diag::rewrap) << symbol << from_real_str; 6852bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 6862bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6872bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --section-start=section=addr 688cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines for (llvm::opt::Arg* arg : args.filtered(kOpt_SectionStart)) { 6892bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 6902bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar const size_t pos = value.find('='); 6912bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar uint64_t addr = 0; 6922bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar value.substr(pos + 1).getAsInteger(0, addr); 6932bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar bool exist = false; 6942bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::StringEntry<uint64_t>* mapping = 6952bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar script_.addressMap().insert(value.substr(0, pos), exist); 6962bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mapping->setValue(addr); 6972bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 6982bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 6992bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -Tbss=value 700cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_Tbss)) { 7012bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 7022bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar uint64_t addr = 0; 7032bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (value.getAsInteger(0, addr)) { 7042bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Invalid value for" << arg->getOption().getPrefixedName() 7052bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar << ": " << arg->getValue() << "\n"; 7062bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 7072bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7082bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar bool exist = false; 7092bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::StringEntry<uint64_t>* mapping = 7102bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar script_.addressMap().insert(".bss", exist); 7112bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mapping->setValue(addr); 7122bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7132bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 7142bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -Tdata=value 715cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_Tdata)) { 7162bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 7172bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar uint64_t addr = 0; 7182bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (value.getAsInteger(0, addr)) { 7192bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Invalid value for" << arg->getOption().getPrefixedName() 7202bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar << ": " << arg->getValue() << "\n"; 7212bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 7222bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7232bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar bool exist = false; 7242bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::StringEntry<uint64_t>* mapping = 7252bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar script_.addressMap().insert(".data", exist); 7262bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mapping->setValue(addr); 7272bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7282bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 7292bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -Ttext=value 730cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_Ttext)) { 7312bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 7322bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar uint64_t addr = 0; 7332bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (value.getAsInteger(0, addr)) { 7342bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Invalid value for" << arg->getOption().getPrefixedName() 7352bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar << ": " << arg->getValue() << "\n"; 7362bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 7372bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7382bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar bool exist = false; 7392bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::StringEntry<uint64_t>* mapping = 7402bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar script_.addressMap().insert(".text", exist); 7412bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mapping->setValue(addr); 7422bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7432bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 7442bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 7452bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Optimization 7462bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 7472bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 7482bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --[no-]gc-sections 749cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_GCSections, 7502bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar kOpt_NoGCSections)) { 7512bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (arg->getOption().matches(kOpt_GCSections)) { 7522bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setGCSections(true); 7532bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } else { 7542bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setGCSections(false); 7552bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7562bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7572bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 7582bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --[no-]print-gc-sections 759cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_PrintGCSections, 7602bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar kOpt_NoPrintGCSections)) { 7612bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (arg->getOption().matches(kOpt_PrintGCSections)) { 7622bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setPrintGCSections(true); 7632bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } else { 7642bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setPrintGCSections(false); 7652bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7662bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7672bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 7682bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --[no-]ld-generated-unwind-info 769cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_LDGeneratedUnwindInfo, 7702bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar kOpt_NoLDGeneratedUnwindInfo)) { 7712bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (arg->getOption().matches(kOpt_LDGeneratedUnwindInfo)) { 7722bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setGenUnwindInfo(true); 7732bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } else { 7742bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setGenUnwindInfo(false); 7752bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7762bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7772bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 7782bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --icf=mode 779cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_ICF)) { 7802bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::GeneralOptions::ICF mode = 7812bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringSwitch<mcld::GeneralOptions::ICF>(arg->getValue()) 7822bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("none", mcld::GeneralOptions::ICF::None) 7832bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("all", mcld::GeneralOptions::ICF::All) 7842bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Case("safe", mcld::GeneralOptions::ICF::Safe) 7852bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .Default(mcld::GeneralOptions::ICF::Unknown); 7862bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (mode == mcld::GeneralOptions::ICF::Unknown) { 7872bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Invalid value for" << arg->getOption().getPrefixedName() 7882bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar << ": " << arg->getValue() << "\n"; 7892bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 7902bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7912bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setICFMode(mode); 7922bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 7932bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 7942bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --icf-iterations 795cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_ICFIters)) { 7962bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar llvm::StringRef value = arg->getValue(); 7972bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar int num; 7982bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (value.getAsInteger(0, num) || (num < 0)) { 7992bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Invalid value for" << arg->getOption().getPrefixedName() 8002bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar << ": " << arg->getValue() << "\n"; 8012bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 8022bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 8032bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setICFIterations(num); 8042bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 8052bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8062bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --[no-]print-icf-sections 807cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (llvm::opt::Arg* arg = args.getLastArg(kOpt_PrintICFSections, 8082bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar kOpt_NoPrintICFSections)) { 8092bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (arg->getOption().matches(kOpt_PrintICFSections)) { 8102bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setPrintICFSections(true); 8112bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } else { 8122bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().setPrintICFSections(false); 8132bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 8142bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 8152bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8162bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 8172bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Positional 8182bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar //===--------------------------------------------------------------------===// 8192bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8202bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // # of regular objects, script, and namespec. 8212bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar size_t input_num = 0; 8222bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar typedef std::unique_ptr<mcld::InputAction> Action; 8232bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8242bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::vector<Action> actions; 8252bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar Action action; 8262bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.reserve(32); 8272bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 828cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines for (llvm::opt::Arg* arg : args) { 8292bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar const unsigned index = arg->getIndex(); 8302bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8312bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar switch (arg->getOption().getID()) { 8322bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -T script 8332bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_Script: { 8342bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar const char* value = arg->getValue(); 8352bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar config_.options().getScriptList().push_back(value); 8362bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8372bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // FIXME: Let index of script file be 0. 8382bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::ScriptAction( 8392bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 0x0, value, mcld::ScriptFile::LDScript, script_.directories())); 8402bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 8412bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8422bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::ContextAction(0x0)); 8432bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 8442bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8452bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::MemoryAreaAction(0x0, 8462bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::FileHandle::ReadOnly)); 8472bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 8482bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8492bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar ++input_num; 8502bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 8512bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 8522bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8532bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --defsym=symbol=expr 8542bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_DefSym: { 8552bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::string expr; 8562bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar expr.append(arg->getValue()) 8572bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar .append(";"); 8582bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar script_.defsyms().push_back(std::move(expr)); 8592bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::DefSymAction(index, script_.defsyms().back())); 8602bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 8612bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 8622bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 8632bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8642bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -l namespec 8652bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_Namespec: { 8662bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::NamespecAction( 8672bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar index, arg->getValue(), script_.directories())); 8682bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 8692bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8702bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::ContextAction(index)); 8712bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 8722bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8732bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::MemoryAreaAction(index, 8742bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::FileHandle::ReadOnly)); 8752bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 8762bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8772bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar ++input_num; 8782bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 8792bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 8802bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8812bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --whole-archive 8822bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_WholeArchive: { 8832bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::WholeArchiveAction(index)); 8842bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 8852bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 8862bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 8872bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8882bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --no-whole-archive 8892bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_NoWholeArchive: { 8902bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::NoWholeArchiveAction(index)); 8912bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 8922bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 8932bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 8942bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 8952bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --as-needed 8962bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_AsNeeded: { 8972bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::AsNeededAction(index)); 8982bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 8992bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 9002bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 9012bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9022bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --no-as-needed 9032bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_NoAsNeeded: { 9042bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::NoAsNeededAction(index)); 9052bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 9062bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 9072bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 9082bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9092bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --add-needed 9102bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // FIXME: This is deprecated. Should be --copy-dt-needed-entries. 9112bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_AddNeeded: 9122bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_CopyDTNeeded: { 9132bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::AddNeededAction(index)); 9142bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 9152bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 9162bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 9172bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9182bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --no-add-needed 9192bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // FIXME: This is deprecated. Should be --no-copy-dt-needed-entries. 9202bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_NoAddNeeded: 9212bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_NoCopyDTNeeded: { 9222bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::AddNeededAction(index)); 9232bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 9242bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 9252bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 9262bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9272bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -Bdynamic 9282bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_Bdynamic: { 9292bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::BDynamicAction(index)); 9302bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 9312bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 9322bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 9332bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9342bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // -Bstatic 9352bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_Bstatic: { 9362bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::BStaticAction(index)); 9372bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 9382bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 9392bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 9402bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9412bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --start-group 9422bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_StartGroup: { 9432bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::StartGroupAction(index)); 9442bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 9452bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 9462bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 9472bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9482bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // --end-group 9492bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_EndGroup: { 9502bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::EndGroupAction(index)); 9512bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 9522bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 9532bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 9542bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9552bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar case kOpt_INPUT: { 9562bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::InputFileAction(index, arg->getValue())); 9572bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 9582bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9592bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::ContextAction(index)); 9602bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 9612bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9622bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar action.reset(new mcld::MemoryAreaAction(index, 9632bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::FileHandle::ReadOnly)); 9642bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.push_back(std::move(action)); 9652bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9662bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar ++input_num; 9672bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 9682bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 9692bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9702bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar default: 9712bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar break; 9722bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 9732bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 9742bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9752bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (input_num == 0) { 9762bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::fatal(mcld::diag::err_no_inputs); 9772bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 9782bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 9792bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9802bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Stable sort 9812bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::stable_sort(actions.begin(), 9822bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar actions.end(), 9832bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar [] (const Action& X, const Action& Y) { 9842bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return X->position() < Y->position(); 9852bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar }); 9862bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 9872bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (!InitializeInputs(ir_builder_, actions)) { 9882bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Failed to initialize input tree!\n"; 9892bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 9902bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 9912bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 992cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines 993cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines //===--------------------------------------------------------------------===// 994cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines // Unknown 995cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines //===--------------------------------------------------------------------===// 996cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines std::vector<std::string> unknown_args = args.getAllArgValues(kOpt_UNKNOWN); 997cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines for (std::string arg : unknown_args) 998cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines mcld::warning(mcld::diag::warn_unsupported_option) << arg; 999cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines 10002bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return true; 10012bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar} 10022bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1003cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hinesstd::unique_ptr<Driver> Driver::Create(llvm::ArrayRef<const char*> argv) { 1004cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines // Parse command line options. 1005cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines OptTable opt_table; 10062bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar unsigned missing_arg_idx; 10072bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar unsigned missing_arg_count; 1008cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines llvm::opt::InputArgList args = 1009cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines opt_table.ParseArgs(argv.slice(1), missing_arg_idx, missing_arg_count); 10102bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (missing_arg_count > 0) { 1011cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines mcld::errs() << "Argument to '" << args.getArgString(missing_arg_idx) 10122bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar << "' is missing (expected " << missing_arg_count 10132bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar << ((missing_arg_count > 1) ? " values" : " value") << ")\n"; 10142bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return nullptr; 10152bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 10162bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 1017cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines std::unique_ptr<Driver> result(new Driver(argv[0])); 10182bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 10192bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Return quickly if -help is specified. 1020cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (args.hasArg(kOpt_Help)) { 10212bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar opt_table.PrintHelp(mcld::outs(), argv[0], "MCLinker", 10222bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar /* FlagsToInclude */0, /* FlagsToExclude */0); 10232bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return nullptr; 10242bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 10252bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 10262bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Print version information if requested. 1027cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (args.hasArg(kOpt_Version)) { 10282bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::outs() << result->config_.options().getVersionString() << "\n"; 10292bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 10302bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 10312bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // Setup instance from arguments. 1032cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines if (!result->TranslateArguments(args)) { 10332bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return nullptr; 10342bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 10352bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 10362bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return result; 10372bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar} 10382bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 10392bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainarbool Driver::Run() { 10402bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::Initialize(); 10412bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 10422bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (!linker_.emulate(script_, config_)) { 10432bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Failed to emulate target!\n"; 10442bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 10452bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 10462bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 10472bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (!linker_.link(module_, ir_builder_)) { 10482bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Failed to link objects!\n"; 10492bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 10502bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 10512bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 10522bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if (!linker_.emit(module_, module_.name())) { 10532bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::errs() << "Failed to emit output!\n"; 10542bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return false; 10552bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 10562bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 10572bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar mcld::Finalize(); 10582bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return true; 10592bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar} 10602bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 10612bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar} // anonymous namespace 10622bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 10632bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainarint main(int argc, char** argv) { 10642bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar std::unique_ptr<Driver> driver = 10652bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar Driver::Create(llvm::makeArrayRef(argv, argc)); 10662bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar 10672bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar if ((driver == nullptr) || !driver->Run()) { 10682bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return EXIT_FAILURE; 10692bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } else { 10702bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar return EXIT_SUCCESS; 10712bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar } 10722bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar} 1073