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