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