Update mclinker to 176d79dc69b439b23ce7101ef8c3250057119664.

Change-Id: Ibae073aefc7838fce46875a6bf6ce7b7e18eced8
Date:   Mon Mar 4 22:29:06 2013 +0100
diff --git a/tools/llvm-mcld/llvm-mcld.cpp b/tools/llvm-mcld/llvm-mcld.cpp
index fc0b99f..8daf65f 100644
--- a/tools/llvm-mcld/llvm-mcld.cpp
+++ b/tools/llvm-mcld/llvm-mcld.cpp
@@ -461,6 +461,66 @@
       "surround result strings only if the output is a tty"),
     clEnumValEnd));
 
+static cl::opt<bool>
+ArgDiscardLocals("discard-locals",
+                 cl::desc("Delete all temporary local symbols."),
+                 cl::init(false));
+
+static cl::alias
+ArgDiscardLocalsAlias("X",
+                      cl::desc("alias for --discard-locals"),
+                      cl::aliasopt(ArgDiscardLocals));
+
+static cl::opt<bool>
+ArgDiscardAll("discard-all",
+              cl::desc("Delete all local symbols."),
+              cl::init(false));
+
+static cl::alias
+ArgDiscardAllAlias("x",
+                   cl::desc("alias for --discard-all"),
+                   cl::aliasopt(ArgDiscardAll));
+
+static cl::opt<bool>
+ArgStripDebug("strip-debug",
+              cl::desc("Omit debugger symbol information from the output file."),
+              cl::init(false));
+
+static cl::alias
+ArgStripDebugAlias("S",
+                   cl::desc("alias for --strip-debug"),
+                   cl::aliasopt(ArgStripDebug));
+
+static cl::opt<bool>
+ArgStripAll("strip-all",
+            cl::desc("Omit all symbol information from the output file."),
+            cl::init(false));
+
+static cl::alias
+ArgStripAllAlias("s",
+                 cl::desc("alias for --strip-all"),
+                 cl::aliasopt(ArgStripAll));
+
+static cl::opt<bool>
+ArgNMagic("nmagic",
+          cl::desc("Do not page align data"),
+          cl::init(false));
+
+static cl::alias
+ArgNMagicAlias("n",
+               cl::desc("alias for --nmagic"),
+               cl::aliasopt(ArgNMagic));
+
+static cl::opt<bool>
+ArgOMagic("omagic",
+          cl::desc("Do not page align data, do not make text readonly"),
+          cl::init(false));
+
+static cl::alias
+ArgOMagicAlias("N",
+               cl::desc("alias for --omagic"),
+               cl::aliasopt(ArgOMagic));
+
 /// @{
 /// @name FIXME: begin of unsupported options
 /// @}
@@ -484,6 +544,7 @@
 
 static cl::opt<icf::Mode>
 ArgICF("icf",
+       cl::ZeroOrMore,
        cl::desc("Identical Code Folding"),
        cl::init(icf::None),
        cl::values(
@@ -502,56 +563,6 @@
           cl::init(false));
 
 static cl::opt<bool>
-ArgDiscardLocals("discard-locals",
-                 cl::desc("Delete all temporary local symbols."),
-                 cl::init(false));
-
-static cl::alias
-ArgDiscardLocalsAlias("X",
-                      cl::desc("alias for --discard-locals"),
-                      cl::aliasopt(ArgDiscardLocals));
-
-static cl::opt<bool>
-ArgDiscardAll("discard-all",
-              cl::desc("Delete all local symbols."),
-              cl::init(false));
-
-static cl::alias
-ArgDiscardAllAlias("x",
-                   cl::desc("alias for --discard-all"),
-                   cl::aliasopt(ArgDiscardAll));
-
-static cl::opt<bool>
-ArgNMagic("nmagic",
-          cl::desc("Do not page align data"),
-          cl::init(false));
-
-static cl::alias
-ArgNMagicAlias("n",
-               cl::desc("alias for --nmagic"),
-               cl::aliasopt(ArgNMagic));
-
-static cl::opt<bool>
-ArgOMagic("omagic",
-          cl::desc("Do not page align data, do not make text readonly"),
-          cl::init(false));
-
-static cl::alias
-ArgOMagicAlias("N",
-               cl::desc("alias for --omagic"),
-               cl::aliasopt(ArgOMagic));
-
-static cl::opt<bool>
-ArgStripDebug("strip-debug",
-              cl::desc("Omit debugger symbol information from the output file."),
-              cl::init(false));
-
-static cl::alias
-ArgStripDebugAlias("S",
-                   cl::desc("alias for --strip-debug"),
-                   cl::aliasopt(ArgStripDebug));
-
-static cl::opt<bool>
 ArgExportDynamic("export-dynamic",
                  cl::desc("Export all dynamic symbols"),
                  cl::init(false));
@@ -566,13 +577,9 @@
              cl::desc("Set GNU linker emulation"),
              cl::value_desc("emulation"));
 
-static cl::opt<std::string>
-ArgRuntimePath("rpath",
-               cl::desc("Add a directory to the runtime library search path"),
-               cl::value_desc("dir"));
-
-static cl::opt<std::string>
+static cl::list<std::string, bool, llvm::cl::SearchDirParser>
 ArgRuntimePathLink("rpath-link",
+                   cl::ZeroOrMore,
                    cl::desc("Add a directory to the link time library search path"),
                    cl::value_desc("dir"));
 
@@ -603,25 +610,108 @@
                  cl::value_desc("Version script"));
 
 static cl::opt<bool>
-ArgNoStdLib("nostdlib",
-            cl::desc("Only search lib dirs explicitly specified on cmdline"),
-            cl::init(false));
-
-static cl::opt<bool>
 ArgWarnCommon("warn-common",
               cl::desc("warn common symbol"),
               cl::init(false));
 
+static cl::opt<mcld::GeneralOptions::HashStyle>
+ArgHashStyle("hash-style", cl::init(mcld::GeneralOptions::SystemV),
+  cl::desc("Set the type of linker's hash table(s)."),
+  cl::values(
+       clEnumValN(mcld::GeneralOptions::SystemV, "sysv",
+                 "classic ELF .hash section"),
+       clEnumValN(mcld::GeneralOptions::GNU, "gnu",
+                 "new style GNU .gnu.hash section"),
+       clEnumValN(mcld::GeneralOptions::Both, "both",
+                 "both the classic ELF and new style GNU hash tables"),
+       clEnumValEnd));
+
+static cl::opt<std::string>
+ArgFilter("F",
+          cl::desc("Filter for shared object symbol table"),
+          cl::value_desc("name"));
+
+static cl::alias
+ArgFilterAlias("filter",
+               cl::desc("alias for -F"),
+               cl::aliasopt(ArgFilterAlias));
+
+static cl::list<std::string>
+ArgAuxiliary("f",
+             cl::ZeroOrMore,
+             cl::desc("Auxiliary filter for shared object symbol table"),
+             cl::value_desc("name"));
+
+static cl::alias
+ArgAuxiliaryAlias("auxiliary",
+                  cl::desc("alias for -f"),
+                  cl::aliasopt(ArgAuxiliary));
+
 static cl::opt<bool>
-ArgFatalWarnings("fatal-warnings",
-              cl::desc("turn all warnings into errors"),
-              cl::init(false));
+ArgEB("EB",
+      cl::desc("Link big-endian objects. This affects the default output format."),
+      cl::init(false));
+
+static cl::opt<bool>
+ArgEL("EL",
+      cl::desc("Link little-endian objects. This affects the default output format."),
+      cl::init(false));
 
 /// @{
 /// @name FIXME: end of unsupported options
 /// @}
 
 static cl::opt<bool>
+ArgNoStdlib("nostdlib",
+            cl::desc("Only search lib dirs explicitly specified on cmdline"),
+            cl::init(false));
+
+static cl::list<std::string, bool, llvm::cl::SearchDirParser>
+ArgRuntimePath("rpath",
+               cl::ZeroOrMore,
+               cl::desc("Add a directory to the runtime library search path"),
+               cl::value_desc("dir"));
+
+static cl::alias
+ArgRuntimePathAlias("R",
+                    cl::desc("alias for --rpath"),
+                    cl::aliasopt(ArgRuntimePath), cl::Prefix);
+
+static cl::opt<bool>
+ArgEnableNewDTags("enable-new-dtags",
+                  cl::desc("Enable use of DT_RUNPATH and DT_FLAGS"),
+                  cl::init(false));
+
+class FalseParser : public cl::parser<bool> {
+  const char *ArgStr;
+public:
+
+  // parse - Return true on error.
+  bool parse(cl::Option &O, StringRef ArgName, StringRef Arg, bool &Val) {
+    if (cl::parser<bool>::parse(O, ArgName, Arg, Val))
+      return false;
+    Val = false;
+    return false;
+  }
+};
+
+static bool ArgFatalWarnings;
+
+static cl::opt<bool, true, FalseParser>
+ArgNoFatalWarnings("no-fatal-warnings",
+              cl::location(ArgFatalWarnings),
+              cl::desc("do not turn warnings into errors"),
+              cl::init(false),
+              cl::ValueDisallowed);
+
+static cl::opt<bool, true>
+ArgFatalWarnings_("fatal-warnings",
+              cl::location(ArgFatalWarnings),
+              cl::desc("turn all warnings into errors"),
+              cl::init(false),
+              cl::ValueDisallowed);
+
+static cl::opt<bool>
 ArgWarnSharedTextrel("warn-shared-textrel",
                      cl::desc("Warn if adding DT_TEXTREL in a shared object."),
                      cl::init(false));
@@ -895,8 +985,15 @@
   // set up soname
   pConfig.options().setSOName(ArgSOName);
 
+  // add all rpath entries
+  cl::list<std::string>::iterator rp;
+  cl::list<std::string>::iterator rpEnd = ArgRuntimePath.end();
+  for (rp = ArgRuntimePath.begin(); rp != rpEnd; ++rp) {
+    pConfig.options().getRpathList().push_back(*rp);
+  }
+
   // --fatal-warnings
-  pConfig.options().setFatalWarnings(ArgFatalWarnings);
+  // pConfig.options().setFatalWarnings(ArgFatalWarnings);
 
   // -shared or -pie
   if (true == ArgShared || true == ArgPIE) {
@@ -952,10 +1049,22 @@
   pConfig.options().setEhFrameHdr(ArgEhFrameHdr);
   pConfig.options().setNMagic(ArgNMagic);
   pConfig.options().setOMagic(ArgOMagic);
-  pConfig.options().setStripDebug(ArgStripDebug);
+  pConfig.options().setStripDebug(ArgStripDebug || ArgStripAll);
   pConfig.options().setExportDynamic(ArgExportDynamic);
   pConfig.options().setWarnSharedTextrel(ArgWarnSharedTextrel);
   pConfig.options().setDefineCommon(ArgDefineCommon);
+  pConfig.options().setNewDTags(ArgEnableNewDTags);
+  pConfig.options().setHashStyle(ArgHashStyle);
+  pConfig.options().setNoStdlib(ArgNoStdlib);
+
+  if (ArgStripAll)
+    pConfig.options().setStripSymbols(mcld::GeneralOptions::StripAllSymbols);
+  else if (ArgDiscardAll)
+    pConfig.options().setStripSymbols(mcld::GeneralOptions::StripLocals);
+  else if (ArgDiscardLocals)
+    pConfig.options().setStripSymbols(mcld::GeneralOptions::StripTemporaries);
+  else
+    pConfig.options().setStripSymbols(mcld::GeneralOptions::KeepAllSymbols);
 
   // set up rename map, for --wrap
   cl::list<std::string>::iterator wname;
@@ -1034,14 +1143,6 @@
     mcld::warning(mcld::diag::warn_unsupported_option) << ArgFIXCA8.ArgStr;
   }
 
-  if (ArgDiscardLocals) {
-    mcld::warning(mcld::diag::warn_unsupported_option) << ArgDiscardLocals.ArgStr;
-  }
-
-  if (ArgDiscardAll) {
-    mcld::warning(mcld::diag::warn_unsupported_option) << ArgDiscardAll.ArgStr;
-  }
-
   // add address mappings
   // -Ttext
   if (-1U != ArgTextSegAddr) {
@@ -1079,6 +1180,14 @@
     addr_mapping->setValue(address);
   }
 
+  // set up filter/aux filter for shared object
+  pConfig.options().setFilter(ArgFilter);
+
+  cl::list<std::string>::iterator aux;
+  cl::list<std::string>::iterator auxEnd = ArgAuxiliary.end();
+  for (aux = ArgAuxiliary.begin(); aux != auxEnd; ++aux)
+    pConfig.options().getAuxiliaryList().push_back(*aux);
+
   return true;
 }