vsk updated this revision to Diff 64023.
vsk added a comment.

- Addressed Paul's comment: added a release note about this.
- Rebased onto master to pick up an Xray change.


https://reviews.llvm.org/D22290

Files:
  docs/ReleaseNotes.rst
  include/clang/Driver/Driver.h
  include/clang/Driver/SanitizerArgs.h
  include/clang/Driver/Tool.h
  include/clang/Driver/ToolChain.h
  lib/Driver/Driver.cpp
  lib/Driver/SanitizerArgs.cpp
  lib/Driver/ToolChain.cpp
  lib/Driver/ToolChains.cpp
  lib/Driver/ToolChains.h
  lib/Driver/Tools.cpp
  lib/Driver/Tools.h

Index: lib/Driver/Tools.h
===================================================================
--- lib/Driver/Tools.h
+++ lib/Driver/Tools.h
@@ -60,7 +60,8 @@
                                const InputInfoList &Inputs,
                                const ToolChain *AuxToolChain) const;
 
-  void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
+  void AddAArch64TargetArgs(const llvm::Triple &EffectiveTriple,
+                            const llvm::opt::ArgList &Args,
                             llvm::opt::ArgStringList &CmdArgs) const;
   void AddARMTargetArgs(const llvm::Triple &Triple,
                         const llvm::opt::ArgList &Args,
@@ -115,6 +116,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -132,6 +134,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -159,6 +162,7 @@
   bool hasIntegratedAssembler() const override { return true; }
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 
@@ -218,6 +222,7 @@
                            llvm::opt::ArgStringList &CmdArgs) const;
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -233,6 +238,7 @@
                                    llvm::opt::ArgStringList &CmdArgs) const;
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -247,6 +253,7 @@
   bool hasIntegratedCPP() const override { return false; }
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -262,6 +269,7 @@
   bool hasIntegratedCPP() const override;
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -323,6 +331,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -362,6 +371,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -382,6 +392,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -394,6 +405,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -408,6 +420,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -421,6 +434,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -437,6 +451,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -450,6 +465,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -466,6 +482,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -479,6 +496,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -495,6 +513,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -508,6 +527,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -524,6 +544,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -537,6 +558,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -552,6 +574,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -565,6 +588,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -577,6 +601,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -590,6 +615,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -606,6 +632,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -619,6 +646,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -635,6 +663,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -648,6 +677,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -664,6 +694,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -677,6 +708,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -699,6 +731,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -715,6 +748,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 
@@ -736,6 +770,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -749,11 +784,13 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 
 private:
-  void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
+  void AddLibGCC(const llvm::Triple &EffectiveTriple,
+                 const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
 };
 } // end namespace MinGW
 
@@ -765,7 +802,9 @@
   Hard,
 };
 
-FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
+FloatABI getARMFloatABI(const ToolChain &TC,
+                        const llvm::Triple &EffectiveTriple,
+                        const llvm::opt::ArgList &Args);
 } // end namespace arm
 
 namespace ppc {
@@ -799,6 +838,7 @@
   bool hasIntegratedCPP() const override { return false; }
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -811,6 +851,7 @@
   bool isLinkJob() const override { return true; }
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -825,6 +866,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -839,6 +881,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -854,6 +897,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -866,6 +910,7 @@
 
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -883,6 +928,7 @@
   bool isLinkJob() const override { return true; }
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -897,8 +943,8 @@
   bool hasIntegratedCPP() const override { return false; }
 
   void ConstructJob(Compilation &C, const JobAction &JA,
-                    const InputInfo &Output,
-                    const InputInfoList &Inputs,
+                    const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -913,6 +959,7 @@
   void ConstructJob(Compilation &C, const JobAction &JA,
                     const InputInfo &Output,
                     const InputInfoList &Inputs,
+                    const llvm::Triple &EffectiveTriple,
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
@@ -931,6 +978,7 @@
 
    void ConstructJob(Compilation &C, const JobAction &JA,
                      const InputInfo &Output, const InputInfoList &Inputs,
+                     const llvm::Triple &EffectiveTriple,
                      const llvm::opt::ArgList &TCArgs,
                      const char *LinkingOutput) const override;
 };
@@ -947,6 +995,7 @@
 
    void ConstructJob(Compilation &C, const JobAction &JA,
                      const InputInfo &Output, const InputInfoList &Inputs,
+                     const llvm::Triple &EffectiveTriple,
                      const llvm::opt::ArgList &TCArgs,
                      const char *LinkingOutput) const override;
 };
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -742,10 +742,11 @@
 
 // Select the float ABI as determined by -msoft-float, -mhard-float, and
 // -mfloat-abi=.
-arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
+arm::FloatABI arm::getARMFloatABI(const ToolChain &TC,
+                                  const llvm::Triple &EffectiveTriple,
+                                  const ArgList &Args) {
   const Driver &D = TC.getDriver();
-  const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
-  auto SubArch = getARMSubArchVersionNumber(Triple);
+  auto SubArch = getARMSubArchVersionNumber(EffectiveTriple);
   arm::FloatABI ABI = FloatABI::Invalid;
   if (Arg *A =
           Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
@@ -768,23 +769,23 @@
 
     // It is incorrect to select hard float ABI on MachO platforms if the ABI is
     // "apcs-gnu".
-    if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
-        ABI == FloatABI::Hard) {
-      D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
-                                                       << Triple.getArchName();
+    if (EffectiveTriple.isOSBinFormatMachO() &&
+        !useAAPCSForMachO(EffectiveTriple) && ABI == FloatABI::Hard) {
+      D.Diag(diag::err_drv_unsupported_opt_for_target)
+          << A->getAsString(Args) << EffectiveTriple.getArchName();
     }
   }
 
   // If unspecified, choose the default based on the platform.
   if (ABI == FloatABI::Invalid) {
-    switch (Triple.getOS()) {
+    switch (EffectiveTriple.getOS()) {
     case llvm::Triple::Darwin:
     case llvm::Triple::MacOSX:
     case llvm::Triple::IOS:
     case llvm::Triple::TvOS: {
       // Darwin defaults to "softfp" for v6 and v7.
       ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
-      ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
+      ABI = EffectiveTriple.isWatchABI() ? FloatABI::Hard : ABI;
       break;
     }
     case llvm::Triple::WatchOS:
@@ -797,7 +798,7 @@
       break;
 
     case llvm::Triple::FreeBSD:
-      switch (Triple.getEnvironment()) {
+      switch (EffectiveTriple.getEnvironment()) {
       case llvm::Triple::GNUEABIHF:
         ABI = FloatABI::Hard;
         break;
@@ -809,7 +810,7 @@
       break;
 
     default:
-      switch (Triple.getEnvironment()) {
+      switch (EffectiveTriple.getEnvironment()) {
       case llvm::Triple::GNUEABIHF:
       case llvm::Triple::MuslEABIHF:
       case llvm::Triple::EABIHF:
@@ -826,14 +827,14 @@
         break;
       default:
         // Assume "soft", but warn the user we are guessing.
-        if (Triple.isOSBinFormatMachO() &&
-            Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
+        if (EffectiveTriple.isOSBinFormatMachO() &&
+            EffectiveTriple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
           ABI = FloatABI::Hard;
         else
           ABI = FloatABI::Soft;
 
-        if (Triple.getOS() != llvm::Triple::UnknownOS ||
-            !Triple.isOSBinFormatMachO())
+        if (EffectiveTriple.getOS() != llvm::Triple::UnknownOS ||
+            !EffectiveTriple.isOSBinFormatMachO())
           D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
         break;
       }
@@ -853,7 +854,7 @@
 
   bool KernelOrKext =
       Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
-  arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
+  arm::FloatABI ABI = arm::getARMFloatABI(TC, Triple, Args);
   const Arg *WaCPU = nullptr, *WaFPU = nullptr;
   const Arg *WaHDiv = nullptr, *WaArch = nullptr;
 
@@ -982,7 +983,7 @@
       Features.push_back("+long-calls");
   } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
              !Triple.isWatchOS()) {
-      Features.push_back("+long-calls");
+    Features.push_back("+long-calls");
   }
 
   // Kernel code has more strict alignment requirements.
@@ -996,7 +997,8 @@
         D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
       // v8M Baseline follows on from v6M, so doesn't support unaligned memory
       // access either.
-      else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
+      else if (Triple.getSubArch() ==
+               llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
         D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
     } else
       Features.push_back("+strict-align");
@@ -1082,7 +1084,7 @@
   CmdArgs.push_back(ABIName);
 
   // Determine floating point ABI from the options & target defaults.
-  arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
+  arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Triple, Args);
   if (ABI == arm::FloatABI::Soft) {
     // Floating point operations and argument passing are soft.
     // FIXME: This changes CPP defines, we need -target-soft-float.
@@ -1143,11 +1145,9 @@
   return "generic";
 }
 
-void Clang::AddAArch64TargetArgs(const ArgList &Args,
+void Clang::AddAArch64TargetArgs(const llvm::Triple &EffectiveTriple,
+                                 const ArgList &Args,
                                  ArgStringList &CmdArgs) const {
-  std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
-  llvm::Triple Triple(TripleStr);
-
   if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
       Args.hasArg(options::OPT_mkernel) ||
       Args.hasArg(options::OPT_fapple_kext))
@@ -1160,7 +1160,7 @@
   const char *ABIName = nullptr;
   if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
     ABIName = A->getValue();
-  else if (Triple.isOSDarwin())
+  else if (EffectiveTriple.isOSDarwin())
     ABIName = "darwinpcs";
   else
     ABIName = "aapcs";
@@ -1175,7 +1175,7 @@
       CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
     else
       CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
-  } else if (Triple.isAndroid()) {
+  } else if (EffectiveTriple.isAndroid()) {
     // Enabled A53 errata (835769) workaround by default on android
     CmdArgs.push_back("-backend-option");
     CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
@@ -2970,9 +2970,10 @@
 // This adds the static libclang_rt.builtins-arch.a directly to the command line
 // FIXME: Make sure we can also emit shared objects if they're requested
 // and available, check for possible errors, etc.
-static void addClangRT(const ToolChain &TC, const ArgList &Args,
-                       ArgStringList &CmdArgs) {
-  CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
+static void addClangRT(const ToolChain &TC, const llvm::Triple &EffectiveTriple,
+                       const ArgList &Args, ArgStringList &CmdArgs) {
+  CmdArgs.push_back(
+      TC.getCompilerRTArgString(EffectiveTriple, Args, "builtins"));
 }
 
 namespace {
@@ -3046,22 +3047,27 @@
   }
 }
 
-static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
-                                ArgStringList &CmdArgs, StringRef Sanitizer,
-                                bool IsShared, bool IsWhole) {
+static void addSanitizerRuntime(const ToolChain &TC,
+                                const llvm::Triple &EffectiveTriple,
+                                const ArgList &Args, ArgStringList &CmdArgs,
+                                StringRef Sanitizer, bool IsShared,
+                                bool IsWhole) {
   // Wrap any static runtimes that must be forced into executable in
   // whole-archive.
   if (IsWhole) CmdArgs.push_back("-whole-archive");
-  CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
-  if (IsWhole) CmdArgs.push_back("-no-whole-archive");
+  CmdArgs.push_back(
+      TC.getCompilerRTArgString(EffectiveTriple, Args, Sanitizer, IsShared));
+  if (IsWhole)
+    CmdArgs.push_back("-no-whole-archive");
 }
 
 // Tries to use a file with the list of dynamic symbols that need to be exported
 // from the runtime library. Returns true if the file was found.
-static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
-                                    ArgStringList &CmdArgs,
+static bool addSanitizerDynamicList(const ToolChain &TC,
+                                    const llvm::Triple &EffectiveTriple,
+                                    const ArgList &Args, ArgStringList &CmdArgs,
                                     StringRef Sanitizer) {
-  SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
+  SmallString<128> SanRT(TC.getCompilerRT(EffectiveTriple, Args, Sanitizer));
   if (llvm::sys::fs::exists(SanRT + ".syms")) {
     CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
     return true;
@@ -3150,25 +3156,28 @@
 
 // Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
 // C runtime, etc). Returns true if sanitizer system deps need to be linked in.
-static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
-                                 ArgStringList &CmdArgs) {
+static bool addSanitizerRuntimes(const ToolChain &TC,
+                                 const llvm::Triple &EffectiveTriple,
+                                 const ArgList &Args, ArgStringList &CmdArgs) {
   SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
       NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
   collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
                            NonWholeStaticRuntimes, HelperStaticRuntimes,
                            RequiredSymbols);
   for (auto RT : SharedRuntimes)
-    addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
+    addSanitizerRuntime(TC, EffectiveTriple, Args, CmdArgs, RT, true, false);
   for (auto RT : HelperStaticRuntimes)
-    addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
+    addSanitizerRuntime(TC, EffectiveTriple, Args, CmdArgs, RT, false, true);
   bool AddExportDynamic = false;
   for (auto RT : StaticRuntimes) {
-    addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
-    AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
+    addSanitizerRuntime(TC, EffectiveTriple, Args, CmdArgs, RT, false, true);
+    AddExportDynamic |=
+        !addSanitizerDynamicList(TC, EffectiveTriple, Args, CmdArgs, RT);
   }
   for (auto RT : NonWholeStaticRuntimes) {
-    addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
-    AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
+    addSanitizerRuntime(TC, EffectiveTriple, Args, CmdArgs, RT, false, false);
+    AddExportDynamic |=
+        !addSanitizerDynamicList(TC, EffectiveTriple, Args, CmdArgs, RT);
   }
   for (auto S : RequiredSymbols) {
     CmdArgs.push_back("-u");
@@ -3181,12 +3190,14 @@
   return !StaticRuntimes.empty();
 }
 
-static bool addXRayRuntime(const ToolChain &TC, const ArgList &Args,
-                           ArgStringList &CmdArgs) {
+static bool addXRayRuntime(const ToolChain &TC,
+                           const llvm::Triple &EffectiveTriple,
+                           const ArgList &Args, ArgStringList &CmdArgs) {
   if (Args.hasFlag(options::OPT_fxray_instrument,
                    options::OPT_fnoxray_instrument, false)) {
     CmdArgs.push_back("-whole-archive");
-    CmdArgs.push_back(TC.getCompilerRTArgString(Args, "xray", false));
+    CmdArgs.push_back(
+        TC.getCompilerRTArgString(EffectiveTriple, Args, "xray", false));
     CmdArgs.push_back("-no-whole-archive");
     return true;
   }
@@ -3777,9 +3788,9 @@
 
 void Clang::ConstructJob(Compilation &C, const JobAction &JA,
                          const InputInfo &Output, const InputInfoList &Inputs,
+                         const llvm::Triple &EffectiveTriple,
                          const ArgList &Args, const char *LinkingOutput) const {
-  std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
-  const llvm::Triple Triple(TripleStr);
+  std::string TripleStr = EffectiveTriple.str();
 
   bool KernelOrKext =
       Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
@@ -3832,13 +3843,14 @@
     CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
   }
 
-  if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
-                               Triple.getArch() == llvm::Triple::thumb)) {
-    unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
+  if (EffectiveTriple.isOSWindows() &&
+      (EffectiveTriple.getArch() == llvm::Triple::arm ||
+       EffectiveTriple.getArch() == llvm::Triple::thumb)) {
+    unsigned Offset = EffectiveTriple.getArch() == llvm::Triple::arm ? 4 : 6;
     unsigned Version;
-    Triple.getArchName().substr(Offset).getAsInteger(10, Version);
+    EffectiveTriple.getArchName().substr(Offset).getAsInteger(10, Version);
     if (Version < 7)
-      D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
+      D.Diag(diag::err_target_unsupported_arch) << EffectiveTriple.getArchName()
                                                 << TripleStr;
   }
 
@@ -4040,7 +4052,7 @@
   unsigned PICLevel;
   bool IsPIE;
   std::tie(RelocationModel, PICLevel, IsPIE) =
-      ParsePICArgs(getToolChain(), Triple, Args);
+      ParsePICArgs(getToolChain(), EffectiveTriple, Args);
 
   const char *RMName = RelocationModelName(RelocationModel);
   if (RMName) {
@@ -4139,8 +4151,7 @@
                    false))
     CmdArgs.push_back("-fstrict-enums");
   if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
-                   options::OPT_fno_strict_vtable_pointers,
-                   false))
+                   options::OPT_fno_strict_vtable_pointers, false))
     CmdArgs.push_back("-fstrict-vtable-pointers");
   if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
                     options::OPT_fno_optimize_sibling_calls))
@@ -4355,7 +4366,7 @@
   }
 
   // Add the target cpu
-  std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
+  std::string CPU = getCPUName(Args, EffectiveTriple, /*FromAs*/ false);
   if (!CPU.empty()) {
     CmdArgs.push_back("-target-cpu");
     CmdArgs.push_back(Args.MakeArgString(CPU));
@@ -4367,7 +4378,7 @@
   }
 
   // Add the target features
-  getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
+  getTargetFeatures(getToolChain(), EffectiveTriple, Args, CmdArgs, false);
 
   // Add target specific flags.
   switch (getToolChain().getArch()) {
@@ -4379,12 +4390,12 @@
   case llvm::Triple::thumb:
   case llvm::Triple::thumbeb:
     // Use the effective triple, which takes into account the deployment target.
-    AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
+    AddARMTargetArgs(EffectiveTriple, Args, CmdArgs, KernelOrKext);
     break;
 
   case llvm::Triple::aarch64:
   case llvm::Triple::aarch64_be:
-    AddAArch64TargetArgs(Args, CmdArgs);
+    AddAArch64TargetArgs(EffectiveTriple, Args, CmdArgs);
     break;
 
   case llvm::Triple::mips:
@@ -4505,8 +4516,8 @@
   }
 
   // If a debugger tuning argument appeared, remember it.
-  if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
-                               options::OPT_ggdbN_Group)) {
+  if (Arg *A =
+          Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
     if (A->getOption().matches(options::OPT_glldb))
       DebuggerTuning = llvm::DebuggerKind::LLDB;
     else if (A->getOption().matches(options::OPT_gsce))
@@ -4535,7 +4546,7 @@
 
   // PS4 defaults to no column info
   if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
-                   /*Default=*/ !IsPS4CPU))
+                   /*Default=*/!IsPS4CPU))
     CmdArgs.push_back("-dwarf-column-info");
 
   // FIXME: Move backend command line options to the module.
@@ -4589,9 +4600,10 @@
 
   // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
   // default.
-  bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
-                             Triple.getArch() == llvm::Triple::wasm32 ||
-                             Triple.getArch() == llvm::Triple::wasm64;
+  bool UseSeparateSections =
+      EffectiveTriple.getOS() == llvm::Triple::CloudABI ||
+      EffectiveTriple.getArch() == llvm::Triple::wasm32 ||
+      EffectiveTriple.getArch() == llvm::Triple::wasm64;
 
   if (Args.hasFlag(options::OPT_ffunction_sections,
                    options::OPT_fno_function_sections, UseSeparateSections)) {
@@ -4971,7 +4983,8 @@
   Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
   // Emulated TLS is enabled by default on Android, and can be enabled manually
   // with -femulated-tls.
-  bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
+  bool EmulatedTLSDefault = EffectiveTriple.isAndroid() ||
+                            EffectiveTriple.isWindowsCygwinEnvironment();
   if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
                    EmulatedTLSDefault))
     CmdArgs.push_back("-femulated-tls");
@@ -5012,7 +5025,7 @@
   }
 
   const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
-  Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
+  Sanitize.addArgs(getToolChain(), EffectiveTriple, Args, CmdArgs, InputType);
 
   // Report an error for -faltivec on anything other than PowerPC.
   if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
@@ -5154,9 +5167,9 @@
       CmdArgs.push_back("-backend-option");
       CmdArgs.push_back("-arm-no-restrict-it");
     }
-  } else if (Triple.isOSWindows() &&
-             (Triple.getArch() == llvm::Triple::arm ||
-              Triple.getArch() == llvm::Triple::thumb)) {
+  } else if (EffectiveTriple.isOSWindows() &&
+             (EffectiveTriple.getArch() == llvm::Triple::arm ||
+              EffectiveTriple.getArch() == llvm::Triple::thumb)) {
     // Windows on ARM expects restricted IT blocks
     CmdArgs.push_back("-backend-option");
     CmdArgs.push_back("-arm-restrict-it");
@@ -5509,7 +5522,7 @@
   if (Args.hasArg(options::OPT_fno_inline))
     CmdArgs.push_back("-fno-inline");
 
-  if (Arg* InlineArg = Args.getLastArg(options::OPT_finline_functions,
+  if (Arg *InlineArg = Args.getLastArg(options::OPT_finline_functions,
                                        options::OPT_finline_hint_functions,
                                        options::OPT_fno_inline_functions))
     InlineArg->render(Args, CmdArgs);
@@ -5571,7 +5584,6 @@
                      options::OPT_fno_objc_arc_exceptions,
                      /*default*/ types::isCXX(InputType)))
       CmdArgs.push_back("-fobjc-arc-exceptions");
-
   }
 
   // -fobjc-infer-related-result-type is the default, except in the Objective-C
@@ -5597,8 +5609,8 @@
 
   // Pass down -fobjc-weak or -fno-objc-weak if present.
   if (types::isObjC(InputType)) {
-    auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
-                                   options::OPT_fno_objc_weak);
+    auto WeakArg =
+        Args.getLastArg(options::OPT_fobjc_weak, options::OPT_fno_objc_weak);
     if (!WeakArg) {
       // nothing to do
     } else if (GCArg) {
@@ -5768,7 +5780,7 @@
       StringRef Value(A->getValue());
       if (Value != "always" && Value != "never" && Value != "auto")
         getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
-              << ("-fdiagnostics-color=" + Value).str();
+            << ("-fdiagnostics-color=" + Value).str();
     }
     A->claim();
   }
@@ -6425,16 +6437,15 @@
 
 void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
                            const InputInfo &Output, const InputInfoList &Inputs,
+                           const llvm::Triple &EffectiveTriple,
                            const ArgList &Args,
                            const char *LinkingOutput) const {
   ArgStringList CmdArgs;
 
   assert(Inputs.size() == 1 && "Unexpected number of inputs.");
   const InputInfo &Input = Inputs[0];
 
-  std::string TripleStr =
-      getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
-  const llvm::Triple Triple(TripleStr);
+  std::string TripleStr = EffectiveTriple.str();
 
   // Don't warn about "clang -w -c foo.s"
   Args.ClaimAllArgs(options::OPT_w);
@@ -6463,14 +6474,14 @@
   CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
 
   // Add the target cpu
-  std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
+  std::string CPU = getCPUName(Args, EffectiveTriple, /*FromAs*/ true);
   if (!CPU.empty()) {
     CmdArgs.push_back("-target-cpu");
     CmdArgs.push_back(Args.MakeArgString(CPU));
   }
 
   // Add the target features
-  getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
+  getTargetFeatures(getToolChain(), EffectiveTriple, Args, CmdArgs, true);
 
   // Ignore explicit -force_cpusubtype_ALL option.
   (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
@@ -6529,7 +6540,7 @@
   unsigned PICLevel;
   bool IsPIE;
   std::tie(RelocationModel, PICLevel, IsPIE) =
-      ParsePICArgs(getToolChain(), Triple, Args);
+      ParsePICArgs(getToolChain(), EffectiveTriple, Args);
 
   const char *RMName = RelocationModelName(RelocationModel);
   if (RMName) {
@@ -6607,7 +6618,9 @@
 
 void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
                                const InputInfo &Output,
-                               const InputInfoList &Inputs, const ArgList &Args,
+                               const InputInfoList &Inputs,
+                               const llvm::Triple &EffectiveTriple,
+                               const ArgList &Args,
                                const char *LinkingOutput) const {
   const Driver &D = getToolChain().getDriver();
   ArgStringList CmdArgs;
@@ -6774,6 +6787,7 @@
 void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                       const InputInfo &Output,
                                       const InputInfoList &Inputs,
+                                      const llvm::Triple &EffectiveTriple,
                                       const ArgList &Args,
                                       const char *LinkingOutput) const {
   claimNoWarnArgs(Args);
@@ -7017,6 +7031,7 @@
 void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                    const InputInfo &Output,
                                    const InputInfoList &Inputs,
+                                   const llvm::Triple &EffectiveTriple,
                                    const ArgList &Args,
                                    const char *LinkingOutput) const {
   auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
@@ -7034,6 +7049,7 @@
 void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                   const InputInfo &Output,
                                   const InputInfoList &Inputs,
+                                  const llvm::Triple &EffectiveTriple,
                                   const ArgList &Args,
                                   const char *LinkingOutput) const {
 
@@ -7062,6 +7078,7 @@
 void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                 const InputInfo &Output,
                                 const InputInfoList &Inputs,
+                                const llvm::Triple &EffectiveTriple,
                                 const ArgList &Args,
                                 const char *LinkingOutput) const {
 
@@ -7137,7 +7154,8 @@
     std::string CPU = llvm::sys::getHostCPUName();
     if (CPU != "generic") {
       // Translate the native cpu into the architecture suffix for that CPU.
-      StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
+      StringRef Suffix =
+          arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
       // If there is no valid architecture suffix for this CPU we don't know how
       // to handle it, so return no architecture.
       if (Suffix.empty())
@@ -7397,6 +7415,7 @@
 void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                     const InputInfo &Output,
                                     const InputInfoList &Inputs,
+                                    const llvm::Triple &EffectiveTriple,
                                     const ArgList &Args,
                                     const char *LinkingOutput) const {
   const ToolChain &ToolChain = getToolChain();
@@ -7465,6 +7484,7 @@
 void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                      const InputInfo &Output,
                                      const InputInfoList &Inputs,
+                                     const llvm::Triple &EffectiveTriple,
                                      const ArgList &Args,
                                      const char *LinkingOutput) const {
   ArgStringList CmdArgs;
@@ -7762,6 +7782,7 @@
 void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                   const InputInfo &Output,
                                   const InputInfoList &Inputs,
+                                  const llvm::Triple &EffectiveTriple,
                                   const ArgList &Args,
                                   const char *LinkingOutput) const {
   assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
@@ -7863,16 +7884,16 @@
   if (Args.hasArg(options::OPT_fnested_functions))
     CmdArgs.push_back("-allow_stack_execute");
 
-  getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
+  getMachOToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
 
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
     if (getToolChain().getDriver().CCCIsCXX())
       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
 
     // link_ssp spec is empty.
 
     // Let the tool chain choose which runtime library to link.
-    getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
+    getMachOToolChain().AddLinkRuntimeLibArgs(EffectiveTriple, Args, CmdArgs);
   }
 
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
@@ -7905,6 +7926,7 @@
 void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
                                 const InputInfo &Output,
                                 const InputInfoList &Inputs,
+                                const llvm::Triple &EffectiveTriple,
                                 const ArgList &Args,
                                 const char *LinkingOutput) const {
   ArgStringList CmdArgs;
@@ -7927,6 +7949,7 @@
 void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
                                     const InputInfo &Output,
                                     const InputInfoList &Inputs,
+                                    const llvm::Triple &EffectiveTriple,
                                     const ArgList &Args,
                                     const char *LinkingOutput) const {
   ArgStringList CmdArgs;
@@ -7947,6 +7970,7 @@
 void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
                                        const InputInfo &Output,
                                        const InputInfoList &Inputs,
+                                       const llvm::Triple &EffectiveTriple,
                                        const ArgList &Args,
                                        const char *LinkingOutput) const {
   ArgStringList CmdArgs;
@@ -7970,6 +7994,7 @@
 void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                       const InputInfo &Output,
                                       const InputInfoList &Inputs,
+                                      const llvm::Triple &EffectiveTriple,
                                       const ArgList &Args,
                                       const char *LinkingOutput) const {
   claimNoWarnArgs(Args);
@@ -7990,6 +8015,7 @@
 void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                    const InputInfo &Output,
                                    const InputInfoList &Inputs,
+                                   const llvm::Triple &EffectiveTriple,
                                    const ArgList &Args,
                                    const char *LinkingOutput) const {
   ArgStringList CmdArgs;
@@ -8059,15 +8085,16 @@
   }
   CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
 
-  getToolChain().addProfileRTLibs(Args, CmdArgs);
+  getToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
 
   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
 }
 
 void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                       const InputInfo &Output,
                                       const InputInfoList &Inputs,
+                                      const llvm::Triple &EffectiveTriple,
                                       const ArgList &Args,
                                       const char *LinkingOutput) const {
   claimNoWarnArgs(Args);
@@ -8139,6 +8166,7 @@
 void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                    const InputInfo &Output,
                                    const InputInfoList &Inputs,
+                                   const llvm::Triple &EffectiveTriple,
                                    const ArgList &Args,
                                    const char *LinkingOutput) const {
   const Driver &D = getToolChain().getDriver();
@@ -8261,6 +8289,7 @@
 void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                      const InputInfo &Output,
                                      const InputInfoList &Inputs,
+                                     const llvm::Triple &EffectiveTriple,
                                      const ArgList &Args,
                                      const char *LinkingOutput) const {
   claimNoWarnArgs(Args);
@@ -8281,6 +8310,7 @@
 void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                   const InputInfo &Output,
                                   const InputInfoList &Inputs,
+                                  const llvm::Triple &EffectiveTriple,
                                   const ArgList &Args,
                                   const char *LinkingOutput) const {
   const Driver &D = getToolChain().getDriver();
@@ -8390,6 +8420,7 @@
 void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                       const InputInfo &Output,
                                       const InputInfoList &Inputs,
+                                      const llvm::Triple &EffectiveTriple,
                                       const ArgList &Args,
                                       const char *LinkingOutput) const {
   claimNoWarnArgs(Args);
@@ -8439,7 +8470,8 @@
   case llvm::Triple::armeb:
   case llvm::Triple::thumb:
   case llvm::Triple::thumbeb: {
-    arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
+    arm::FloatABI ABI =
+        arm::getARMFloatABI(getToolChain(), EffectiveTriple, Args);
 
     if (ABI == arm::FloatABI::Hard)
       CmdArgs.push_back("-mfpu=vfp");
@@ -8483,6 +8515,7 @@
 void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                    const InputInfo &Output,
                                    const InputInfoList &Inputs,
+                                   const llvm::Triple &EffectiveTriple,
                                    const ArgList &Args,
                                    const char *LinkingOutput) const {
   const toolchains::FreeBSD &ToolChain =
@@ -8597,7 +8630,8 @@
   if (D.isUsingLTO())
     AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
 
-  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+  bool NeedsSanitizerDeps =
+      addSanitizerRuntimes(ToolChain, EffectiveTriple, Args, CmdArgs);
   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
 
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
@@ -8664,15 +8698,16 @@
     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
   }
 
-  ToolChain.addProfileRTLibs(Args, CmdArgs);
+  ToolChain.addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
 
   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
 }
 
 void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                      const InputInfo &Output,
                                      const InputInfoList &Inputs,
+                                     const llvm::Triple &EffectiveTriple,
                                      const ArgList &Args,
                                      const char *LinkingOutput) const {
   claimNoWarnArgs(Args);
@@ -8756,6 +8791,7 @@
 void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                   const InputInfo &Output,
                                   const InputInfoList &Inputs,
+                                  const llvm::Triple &EffectiveTriple,
                                   const ArgList &Args,
                                   const char *LinkingOutput) const {
   const Driver &D = getToolChain().getDriver();
@@ -8805,9 +8841,7 @@
     break;
   case llvm::Triple::armeb:
   case llvm::Triple::thumbeb:
-    arm::appendEBLinkFlags(
-        Args, CmdArgs,
-        llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
+    arm::appendEBLinkFlags(Args, CmdArgs, EffectiveTriple);
     CmdArgs.push_back("-m");
     switch (getToolChain().getTriple().getEnvironment()) {
     case llvm::Triple::EABI:
@@ -8958,29 +8992,27 @@
     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
   }
 
-  getToolChain().addProfileRTLibs(Args, CmdArgs);
+  getToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
 
   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
 }
 
 void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                        const InputInfo &Output,
                                        const InputInfoList &Inputs,
+                                       const llvm::Triple &EffectiveTriple,
                                        const ArgList &Args,
                                        const char *LinkingOutput) const {
   claimNoWarnArgs(Args);
 
-  std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
-  llvm::Triple Triple = llvm::Triple(TripleStr);
-
   ArgStringList CmdArgs;
 
   llvm::Reloc::Model RelocationModel;
   unsigned PICLevel;
   bool IsPIE;
   std::tie(RelocationModel, PICLevel, IsPIE) =
-      ParsePICArgs(getToolChain(), Triple, Args);
+      ParsePICArgs(getToolChain(), EffectiveTriple, Args);
 
   switch (getToolChain().getArch()) {
   default:
@@ -9043,7 +9075,7 @@
       break;
     }
 
-    switch (arm::getARMFloatABI(getToolChain(), Args)) {
+    switch (arm::getARMFloatABI(getToolChain(), EffectiveTriple, Args)) {
     case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
     case arm::FloatABI::Soft:
       CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
@@ -9218,6 +9250,7 @@
 }
 
 static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
+                           const llvm::Triple &EffectiveTriple,
                            ArgStringList &CmdArgs, const ArgList &Args) {
   // Make use of compiler-rt if --rtlib option is used
   ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
@@ -9229,7 +9262,7 @@
       llvm_unreachable("unsupported OS");
     case llvm::Triple::Win32:
     case llvm::Triple::Linux:
-      addClangRT(TC, Args, CmdArgs);
+      addClangRT(TC, EffectiveTriple, Args, CmdArgs);
       break;
     }
     break;
@@ -9301,15 +9334,13 @@
 void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                     const InputInfo &Output,
                                     const InputInfoList &Inputs,
+                                    const llvm::Triple &EffectiveTriple,
                                     const ArgList &Args,
                                     const char *LinkingOutput) const {
   const toolchains::Linux &ToolChain =
       static_cast<const toolchains::Linux &>(getToolChain());
   const Driver &D = ToolChain.getDriver();
 
-  std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
-  llvm::Triple Triple = llvm::Triple(TripleStr);
-
   const llvm::Triple::ArchType Arch = ToolChain.getArch();
   const bool isAndroid = ToolChain.getTriple().isAndroid();
   const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU();
@@ -9351,7 +9382,7 @@
     CmdArgs.push_back("-s");
 
   if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
-    arm::appendEBLinkFlags(Args, CmdArgs, Triple);
+    arm::appendEBLinkFlags(Args, CmdArgs, EffectiveTriple);
 
   for (const auto &Opt : ToolChain.ExtraOpts)
     CmdArgs.push_back(Opt.c_str());
@@ -9437,11 +9468,13 @@
   if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
     CmdArgs.push_back("--no-demangle");
 
-  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
-  bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
+  bool NeedsSanitizerDeps =
+      addSanitizerRuntimes(ToolChain, EffectiveTriple, Args, CmdArgs);
+  bool NeedsXRayDeps =
+      addXRayRuntime(ToolChain, EffectiveTriple, Args, CmdArgs);
   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
   // The profile runtime also needs access to system libraries.
-  getToolChain().addProfileRTLibs(Args, CmdArgs);
+  getToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
 
   if (D.CCCIsCXX() &&
       !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
@@ -9498,7 +9531,7 @@
         }
       }
 
-      AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
+      AddRunTimeLibs(ToolChain, D, EffectiveTriple, CmdArgs, Args);
 
       if (WantPthread && !isAndroid)
         CmdArgs.push_back("-lpthread");
@@ -9515,7 +9548,7 @@
       if (Args.hasArg(options::OPT_static))
         CmdArgs.push_back("--end-group");
       else
-        AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
+        AddRunTimeLibs(ToolChain, D, EffectiveTriple, CmdArgs, Args);
 
       // Add IAMCU specific libs (outside the group), if needed.
       if (IsIAMCU) {
@@ -9551,6 +9584,7 @@
 void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
                                            const InputInfo &Output,
                                            const InputInfoList &Inputs,
+                                           const llvm::Triple &EffectiveTriple,
                                            const ArgList &Args,
                                            const char *LinkingOutput) const {
   const toolchains::NaClToolChain &ToolChain =
@@ -9560,8 +9594,8 @@
   InputInfoList NewInputs;
   NewInputs.push_back(NaClMacros);
   NewInputs.append(Inputs.begin(), Inputs.end());
-  gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
-                                    LinkingOutput);
+  gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, EffectiveTriple,
+                                    Args, LinkingOutput);
 }
 
 // This is quite similar to gnutools::Linker::ConstructJob with changes that
@@ -9571,6 +9605,7 @@
 void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                      const InputInfo &Output,
                                      const InputInfoList &Inputs,
+                                     const llvm::Triple &EffectiveTriple,
                                      const ArgList &Args,
                                      const char *LinkingOutput) const {
 
@@ -9719,6 +9754,7 @@
 void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                     const InputInfo &Output,
                                     const InputInfoList &Inputs,
+                                    const llvm::Triple &EffectiveTriple,
                                     const ArgList &Args,
                                     const char *LinkingOutput) const {
   claimNoWarnArgs(Args);
@@ -9739,6 +9775,7 @@
 void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                  const InputInfo &Output,
                                  const InputInfoList &Inputs,
+                                 const llvm::Triple &EffectiveTriple,
                                  const ArgList &Args,
                                  const char *LinkingOutput) const {
   const Driver &D = getToolChain().getDriver();
@@ -9764,7 +9801,7 @@
 
   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
 
-  getToolChain().addProfileRTLibs(Args, CmdArgs);
+  getToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
 
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
     if (D.CCCIsCXX()) {
@@ -9794,6 +9831,7 @@
 void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                         const InputInfo &Output,
                                         const InputInfoList &Inputs,
+                                        const llvm::Triple &EffectiveTriple,
                                         const ArgList &Args,
                                         const char *LinkingOutput) const {
   claimNoWarnArgs(Args);
@@ -9819,6 +9857,7 @@
 void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                      const InputInfo &Output,
                                      const InputInfoList &Inputs,
+                                     const llvm::Triple &EffectiveTriple,
                                      const ArgList &Args,
                                      const char *LinkingOutput) const {
   const Driver &D = getToolChain().getDriver();
@@ -9933,7 +9972,7 @@
     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
   }
 
-  getToolChain().addProfileRTLibs(Args, CmdArgs);
+  getToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
 
   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
@@ -9962,6 +10001,7 @@
 void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                         const InputInfo &Output,
                                         const InputInfoList &Inputs,
+                                        const llvm::Triple &EffectiveTriple,
                                         const ArgList &Args,
                                         const char *LinkingOutput) const {
   ArgStringList CmdArgs;
@@ -10041,15 +10081,18 @@
     CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
     if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
       for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
-        CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
+        CmdArgs.push_back(
+            TC.getCompilerRTArgString(EffectiveTriple, Args, Lib));
       // Make sure the dynamic runtime thunk is not optimized out at link time
       // to ensure proper SEH handling.
       CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
     } else if (DLL) {
-      CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
+      CmdArgs.push_back(
+          TC.getCompilerRTArgString(EffectiveTriple, Args, "asan_dll_thunk"));
     } else {
       for (const auto &Lib : {"asan", "asan_cxx"})
-        CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
+        CmdArgs.push_back(
+            TC.getCompilerRTArgString(EffectiveTriple, Args, Lib));
     }
   }
 
@@ -10079,7 +10122,7 @@
   // Add compiler-rt lib in case if it was explicitly
   // specified as an argument for --rtlib option.
   if (!Args.hasArg(options::OPT_nostdlib)) {
-    AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
+    AddRunTimeLibs(TC, TC.getDriver(), EffectiveTriple, CmdArgs, Args);
   }
 
   // Add filenames, libraries, and other linker inputs.
@@ -10108,7 +10151,7 @@
     A.renderAsInput(Args, CmdArgs);
   }
 
-  TC.addProfileRTLibs(Args, CmdArgs);
+  TC.addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
 
   // We need to special case some linker paths.  In the case of lld, we need to
   // translate 'lld' into 'lld-link', and in the case of the regular msvc
@@ -10137,6 +10180,7 @@
 void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
                                           const InputInfo &Output,
                                           const InputInfoList &Inputs,
+                                          const llvm::Triple &EffectiveTriple,
                                           const ArgList &Args,
                                           const char *LinkingOutput) const {
   C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
@@ -10259,6 +10303,7 @@
 void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                     const InputInfo &Output,
                                     const InputInfoList &Inputs,
+                                    const llvm::Triple &EffectiveTriple,
                                     const ArgList &Args,
                                     const char *LinkingOutput) const {
   claimNoWarnArgs(Args);
@@ -10286,7 +10331,8 @@
                    SplitDebugName(Args, Inputs[0]));
 }
 
-void MinGW::Linker::AddLibGCC(const ArgList &Args,
+void MinGW::Linker::AddLibGCC(const llvm::Triple &EffectiveTriple,
+                              const ArgList &Args,
                               ArgStringList &CmdArgs) const {
   if (Args.hasArg(options::OPT_mthreads))
     CmdArgs.push_back("-lmingwthrd");
@@ -10308,7 +10354,8 @@
       CmdArgs.push_back("-lgcc");
     }
   } else {
-    AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
+    AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), EffectiveTriple,
+                   CmdArgs, Args);
   }
 
   CmdArgs.push_back("-lmoldname");
@@ -10319,6 +10366,7 @@
 void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                  const InputInfo &Output,
                                  const InputInfoList &Inputs,
+                                 const llvm::Triple &EffectiveTriple,
                                  const ArgList &Args,
                                  const char *LinkingOutput) const {
   const ToolChain &TC = getToolChain();
@@ -10441,7 +10489,7 @@
       if (Args.hasArg(options::OPT_fopenmp))
         CmdArgs.push_back("-lgomp");
 
-      AddLibGCC(Args, CmdArgs);
+      AddLibGCC(EffectiveTriple, Args, CmdArgs);
 
       if (Args.hasArg(options::OPT_pg))
         CmdArgs.push_back("-lgmon");
@@ -10462,7 +10510,7 @@
       if (Args.hasArg(options::OPT_static))
         CmdArgs.push_back("--end-group");
       else if (!LinkerName.equals_lower("lld"))
-        AddLibGCC(Args, CmdArgs);
+        AddLibGCC(EffectiveTriple, Args, CmdArgs);
     }
 
     if (!Args.hasArg(options::OPT_nostartfiles)) {
@@ -10482,6 +10530,7 @@
 void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                     const InputInfo &Output,
                                     const InputInfoList &Inputs,
+                                    const llvm::Triple &EffectiveTriple,
                                     const ArgList &Args,
                                     const char *LinkingOutput) const {
   claimNoWarnArgs(Args);
@@ -10515,6 +10564,7 @@
 void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                  const InputInfo &Output,
                                  const InputInfoList &Inputs,
+                                 const llvm::Triple &EffectiveTriple,
                                  const ArgList &Args,
                                  const char *LinkingOutput) const {
   ArgStringList CmdArgs;
@@ -10543,6 +10593,7 @@
 void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                            const InputInfo &Output,
                                            const InputInfoList &Inputs,
+                                           const llvm::Triple &EffectiveTriple,
                                            const ArgList &Args,
                                            const char *LinkingOutput) const {
   claimNoWarnArgs(Args);
@@ -10582,6 +10633,7 @@
 void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                         const InputInfo &Output,
                                         const InputInfoList &Inputs,
+                                        const llvm::Triple &EffectiveTriple,
                                         const ArgList &Args,
                                         const char *LinkingOutput) const {
   const auto &TC =
@@ -10705,17 +10757,19 @@
     if (!Args.hasArg(options::OPT_nodefaultlibs)) {
       // TODO handle /MT[d] /MD[d]
       CmdArgs.push_back("-lmsvcrt");
-      AddRunTimeLibs(TC, D, CmdArgs, Args);
+      AddRunTimeLibs(TC, D, EffectiveTriple, CmdArgs, Args);
     }
   }
 
   if (TC.getSanitizerArgs().needsAsanRt()) {
     // TODO handle /MT[d] /MD[d]
     if (Args.hasArg(options::OPT_shared)) {
-      CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
+      CmdArgs.push_back(
+          TC.getCompilerRTArgString(EffectiveTriple, Args, "asan_dll_thunk"));
     } else {
       for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
-        CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
+        CmdArgs.push_back(
+            TC.getCompilerRTArgString(EffectiveTriple, Args, Lib));
       // Make sure the dynamic runtime thunk is not optimized out at link time
       // to ensure proper SEH handling.
       CmdArgs.push_back(Args.MakeArgString("--undefined"));
@@ -10733,6 +10787,7 @@
 void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
                                           const InputInfo &Output,
                                           const InputInfoList &Inputs,
+                                          const llvm::Triple &EffectiveTriple,
                                           const ArgList &Args,
                                           const char *LinkingOutput) const {
   ArgStringList CmdArgs;
@@ -10789,6 +10844,7 @@
 void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                            const InputInfo &Output,
                                            const InputInfoList &Inputs,
+                                           const llvm::Triple &EffectiveTriple,
                                            const ArgList &Args,
                                            const char *LinkingOutput) const {
   ArgStringList CmdArgs;
@@ -10825,6 +10881,7 @@
 void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                          const InputInfo &Output,
                                          const InputInfoList &Inputs,
+                                         const llvm::Triple &EffectiveTriple,
                                          const ArgList &Args,
                                          const char *LinkingOutput) const {
   const auto &TC =
@@ -10900,6 +10957,7 @@
 void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
                                     const InputInfo &Output,
                                     const InputInfoList &Inputs,
+                                    const llvm::Triple &EffectiveTriple,
                                     const ArgList &Args,
                                     const char *LinkingOutput) const {
   claimNoWarnArgs(Args);
@@ -11168,6 +11226,7 @@
 void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
                                 const InputInfo &Output,
                                 const InputInfoList &Inputs,
+                                const llvm::Triple &EffectiveTriple,
                                 const ArgList &Args,
                                 const char *LinkingOutput) const {
   const toolchains::FreeBSD &ToolChain =
@@ -11197,6 +11256,7 @@
 void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                     const InputInfo &Output,
                                     const InputInfoList &Inputs,
+                                    const llvm::Triple &EffectiveTriple,
                                     const ArgList &Args,
                                     const char *LinkingOutput) const {
   const auto &TC =
@@ -11274,6 +11334,7 @@
 void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                  const InputInfo &Output,
                                  const InputInfoList &Inputs,
+                                 const llvm::Triple &EffectiveTriple,
                                  const ArgList &Args,
                                  const char *LinkingOutput) const {
   const auto &TC =
Index: lib/Driver/ToolChains.h
===================================================================
--- lib/Driver/ToolChains.h
+++ lib/Driver/ToolChains.h
@@ -280,7 +280,8 @@
                               llvm::opt::ArgStringList &CmdArgs) const {}
 
   /// Add the linker arguments to link the compiler runtime library.
-  virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
+  virtual void AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,
+                                     const llvm::opt::ArgList &Args,
                                      llvm::opt::ArgStringList &CmdArgs) const;
 
   virtual void addStartObjectFileArgs(const llvm::opt::ArgList &Args,
@@ -304,7 +305,8 @@
 
   /// Add any profiling runtime libraries that are needed. This is essentially a
   /// MachO specific version of addProfileRT in Tools.cpp.
-  void addProfileRTLibs(const llvm::opt::ArgList &Args,
+  void addProfileRTLibs(const llvm::Triple &EffectiveTriple,
+                        const llvm::opt::ArgList &Args,
                         llvm::opt::ArgStringList &CmdArgs) const override {
     // There aren't any profiling libs for embedded targets currently.
   }
@@ -418,7 +420,8 @@
             !isTargetWatchOS());
   }
 
-  void addProfileRTLibs(const llvm::opt::ArgList &Args,
+  void addProfileRTLibs(const llvm::Triple &EffectiveTriple,
+                        const llvm::opt::ArgList &Args,
                         llvm::opt::ArgStringList &CmdArgs) const override;
 
 protected:
@@ -573,7 +576,8 @@
   /// @name Apple ToolChain Implementation
   /// {
 
-  void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
+  void AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,
+                             const llvm::opt::ArgList &Args,
                              llvm::opt::ArgStringList &CmdArgs) const override;
 
   void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
@@ -839,7 +843,8 @@
                            llvm::opt::ArgStringList &CC1Args) const override;
   bool isPIEDefault() const override;
   SanitizerMask getSupportedSanitizers() const override;
-  void addProfileRTLibs(const llvm::opt::ArgList &Args,
+  void addProfileRTLibs(const llvm::Triple &EffectiveTriple,
+                        const llvm::opt::ArgList &Args,
                         llvm::opt::ArgStringList &CmdArgs) const override;
   virtual std::string computeSysRoot() const;
 
@@ -903,7 +908,8 @@
   void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
                            llvm::opt::ArgStringList &CmdArgs) const override;
 
-  std::string getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,
+  std::string getCompilerRT(const llvm::Triple &EffectiveTriple,
+                            const llvm::opt::ArgList &Args, StringRef Component,
                             bool Shared = false) const override;
 
   std::string computeSysRoot() const override;
Index: lib/Driver/ToolChains.cpp
===================================================================
--- lib/Driver/ToolChains.cpp
+++ lib/Driver/ToolChains.cpp
@@ -380,13 +380,16 @@
   llvm_unreachable("Unsupported platform");
 }
 
-void Darwin::addProfileRTLibs(const ArgList &Args,
+void Darwin::addProfileRTLibs(const llvm::Triple &EffectiveTriple,
+                              const ArgList &Args,
                               ArgStringList &CmdArgs) const {
-  if (!needsProfileRT(Args)) return;
+  if (!needsProfileRT(Args))
+    return;
 
-  AddLinkRuntimeLib(Args, CmdArgs, (Twine("libclang_rt.profile_") +
-       getOSLibraryNameSuffix() + ".a").str(),
-                    /*AlwaysLink*/ true);
+  AddLinkRuntimeLib(
+      Args, CmdArgs,
+      (Twine("libclang_rt.profile_") + getOSLibraryNameSuffix() + ".a").str(),
+      /*AlwaysLink*/ true);
 }
 
 void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
@@ -400,7 +403,8 @@
       /*AddRPath*/ true);
 }
 
-void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
+void DarwinClang::AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,
+                                        const ArgList &Args,
                                         ArgStringList &CmdArgs) const {
   // Darwin only supports the compiler-rt based runtime libraries.
   switch (GetRuntimeLibType(Args)) {
@@ -1012,16 +1016,17 @@
   return DAL;
 }
 
-void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
+void MachO::AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,
+                                  const ArgList &Args,
                                   ArgStringList &CmdArgs) const {
   // Embedded targets are simple at the moment, not supporting sanitizers and
   // with different libraries for each member of the product { static, PIC } x
   // { hard-float, soft-float }
   llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
-  CompilerRT +=
-      (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
-          ? "hard"
-          : "soft";
+  CompilerRT += (tools::arm::getARMFloatABI(*this, EffectiveTriple, Args) ==
+                 tools::arm::FloatABI::Hard)
+                    ? "hard"
+                    : "soft";
   CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
 
   AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
@@ -2858,9 +2863,10 @@
   CmdArgs.push_back("-lunwind");
 }
 
-std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
-                                             StringRef Component,
-                                             bool Shared) const {
+std::string
+MipsLLVMToolChain::getCompilerRT(const llvm::Triple &EffectiveTriple,
+                                 const ArgList &Args, StringRef Component,
+                                 bool Shared) const {
   SmallString<128> Path(getDriver().ResourceDir);
   llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
                           getOS());
@@ -4237,9 +4243,9 @@
   case llvm::Triple::thumb:
   case llvm::Triple::armeb:
   case llvm::Triple::thumbeb: {
-    const bool HF =
-        Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
-        tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard;
+    const bool HF = Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
+                    tools::arm::getARMFloatABI(*this, Triple, Args) ==
+                        tools::arm::FloatABI::Hard;
 
     LibDir = "lib";
     Loader = HF ? "ld-linux-armhf.so.3" : "ld-linux.so.3";
@@ -4631,16 +4637,18 @@
   return Res;
 }
 
-void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
+void Linux::addProfileRTLibs(const llvm::Triple &EffectiveTriple,
+                             const llvm::opt::ArgList &Args,
                              llvm::opt::ArgStringList &CmdArgs) const {
-  if (!needsProfileRT(Args)) return;
+  if (!needsProfileRT(Args))
+    return;
 
   // Add linker option -u__llvm_runtime_variable to cause runtime
   // initialization module to be linked in.
   if (!Args.hasArg(options::OPT_coverage))
     CmdArgs.push_back(Args.MakeArgString(
         Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
-  ToolChain::addProfileRTLibs(Args, CmdArgs);
+  ToolChain::addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
 }
 
 /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
Index: lib/Driver/ToolChain.cpp
===================================================================
--- lib/Driver/ToolChain.cpp
+++ lib/Driver/ToolChain.cpp
@@ -268,46 +268,52 @@
   llvm_unreachable("Invalid tool kind.");
 }
 
-static StringRef getArchNameForCompilerRTLib(const ToolChain &TC,
-                                             const ArgList &Args) {
-  const llvm::Triple &Triple = TC.getTriple();
-  bool IsWindows = Triple.isOSWindows();
-
-  if (Triple.isWindowsMSVCEnvironment() && TC.getArch() == llvm::Triple::x86)
+static StringRef
+getArchNameForCompilerRTLib(const ToolChain &TC,
+                            const llvm::Triple &EffectiveTriple,
+                            const ArgList &Args) {
+  bool IsWindows = EffectiveTriple.isOSWindows();
+
+  if (EffectiveTriple.isWindowsMSVCEnvironment() &&
+      TC.getArch() == llvm::Triple::x86)
     return "i386";
 
   if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
-    return (arm::getARMFloatABI(TC, Args) == arm::FloatABI::Hard && !IsWindows)
+    return (arm::getARMFloatABI(TC, EffectiveTriple, Args) ==
+                arm::FloatABI::Hard &&
+            !IsWindows)
                ? "armhf"
                : "arm";
 
   return TC.getArchName();
 }
 
-std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component,
+std::string ToolChain::getCompilerRT(const llvm::Triple &EffectiveTriple,
+                                     const ArgList &Args, StringRef Component,
                                      bool Shared) const {
-  const llvm::Triple &TT = getTriple();
-  const char *Env = TT.isAndroid() ? "-android" : "";
-  bool IsITANMSVCWindows =
-      TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment();
+  const char *Env = EffectiveTriple.isAndroid() ? "-android" : "";
+  bool IsITANMSVCWindows = EffectiveTriple.isWindowsMSVCEnvironment() ||
+                           EffectiveTriple.isWindowsItaniumEnvironment();
 
-  StringRef Arch = getArchNameForCompilerRTLib(*this, Args);
+  StringRef Arch = getArchNameForCompilerRTLib(*this, EffectiveTriple, Args);
   const char *Prefix = IsITANMSVCWindows ? "" : "lib";
-  const char *Suffix = Shared ? (Triple.isOSWindows() ? ".dll" : ".so")
+  const char *Suffix = Shared ? (EffectiveTriple.isOSWindows() ? ".dll" : ".so")
                               : (IsITANMSVCWindows ? ".lib" : ".a");
 
   SmallString<128> Path(getDriver().ResourceDir);
-  StringRef OSLibName = Triple.isOSFreeBSD() ? "freebsd" : getOS();
+  StringRef OSLibName = EffectiveTriple.isOSFreeBSD() ? "freebsd" : getOS();
   llvm::sys::path::append(Path, "lib", OSLibName);
   llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
                                     Arch + Env + Suffix);
   return Path.str();
 }
 
-const char *ToolChain::getCompilerRTArgString(const llvm::opt::ArgList &Args,
-                                              StringRef Component,
-                                              bool Shared) const {
-  return Args.MakeArgString(getCompilerRT(Args, Component, Shared));
+const char *
+ToolChain::getCompilerRTArgString(const llvm::Triple &EffectiveTriple,
+                                  const llvm::opt::ArgList &Args,
+                                  StringRef Component, bool Shared) const {
+  return Args.MakeArgString(
+      getCompilerRT(EffectiveTriple, Args, Component, Shared));
 }
 
 bool ToolChain::needsProfileRT(const ArgList &Args) {
@@ -518,11 +524,13 @@
 
 void ToolChain::addClangWarningOptions(ArgStringList &CC1Args) const {}
 
-void ToolChain::addProfileRTLibs(const llvm::opt::ArgList &Args,
+void ToolChain::addProfileRTLibs(const llvm::Triple &EffectiveTriple,
+                                 const llvm::opt::ArgList &Args,
                                  llvm::opt::ArgStringList &CmdArgs) const {
-  if (!needsProfileRT(Args)) return;
+  if (!needsProfileRT(Args))
+    return;
 
-  CmdArgs.push_back(getCompilerRTArgString(Args, "profile"));
+  CmdArgs.push_back(getCompilerRTArgString(EffectiveTriple, Args, "profile"));
 }
 
 ToolChain::RuntimeLibType ToolChain::GetRuntimeLibType(
Index: lib/Driver/SanitizerArgs.cpp
===================================================================
--- lib/Driver/SanitizerArgs.cpp
+++ lib/Driver/SanitizerArgs.cpp
@@ -602,7 +602,9 @@
   CmdArgs.push_back(Args.MakeArgString(LinkerOptionFlag));
 }
 
-void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
+void SanitizerArgs::addArgs(const ToolChain &TC,
+                            const llvm::Triple &EffectiveTriple,
+                            const llvm::opt::ArgList &Args,
                             llvm::opt::ArgStringList &CmdArgs,
                             types::ID InputType) const {
   // Translate available CoverageFeatures to corresponding clang-cc1 flags.
@@ -626,21 +628,24 @@
     // Instruct the code generator to embed linker directives in the object file
     // that cause the required runtime libraries to be linked.
     CmdArgs.push_back(Args.MakeArgString(
-        "--dependent-lib=" + TC.getCompilerRT(Args, "ubsan_standalone")));
+        "--dependent-lib=" +
+        TC.getCompilerRT(EffectiveTriple, Args, "ubsan_standalone")));
     if (types::isCXX(InputType))
       CmdArgs.push_back(Args.MakeArgString(
-          "--dependent-lib=" + TC.getCompilerRT(Args, "ubsan_standalone_cxx")));
+          "--dependent-lib=" +
+          TC.getCompilerRT(EffectiveTriple, Args, "ubsan_standalone_cxx")));
   }
   if (TC.getTriple().isOSWindows() && needsStatsRt()) {
-    CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" +
-                                         TC.getCompilerRT(Args, "stats_client")));
+    CmdArgs.push_back(Args.MakeArgString(
+        "--dependent-lib=" +
+        TC.getCompilerRT(EffectiveTriple, Args, "stats_client")));
 
     // The main executable must export the stats runtime.
     // FIXME: Only exporting from the main executable (e.g. based on whether the
     // translation unit defines main()) would save a little space, but having
     // multiple copies of the runtime shouldn't hurt.
-    CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" +
-                                         TC.getCompilerRT(Args, "stats")));
+    CmdArgs.push_back(Args.MakeArgString(
+        "--dependent-lib=" + TC.getCompilerRT(EffectiveTriple, Args, "stats")));
     addIncludeLinkerOption(TC, Args, CmdArgs, "__sanitizer_stats_register");
   }
 
Index: lib/Driver/Driver.cpp
===================================================================
--- lib/Driver/Driver.cpp
+++ lib/Driver/Driver.cpp
@@ -55,12 +55,12 @@
       Mode(GCCMode), SaveTemps(SaveTempsNone), BitcodeEmbed(EmbedNone),
       LTOMode(LTOK_None), ClangExecutable(ClangExecutable),
       SysRoot(DEFAULT_SYSROOT), UseStdLib(true),
-      DefaultTargetTriple(DefaultTargetTriple),
       DriverTitle("clang LLVM compiler"), CCPrintOptionsFilename(nullptr),
       CCPrintHeadersFilename(nullptr), CCLogDiagnosticsFilename(nullptr),
       CCCPrintBindings(false), CCPrintHeaders(false), CCLogDiagnostics(false),
-      CCGenDiagnostics(false), CCCGenericGCCName(""), CheckInputsExist(true),
-      CCCUsePCH(true), SuppressMissingInputWarning(false) {
+      CCGenDiagnostics(false), DefaultTargetTriple(DefaultTargetTriple),
+      CCCGenericGCCName(""), CheckInputsExist(true), CCCUsePCH(true),
+      SuppressMissingInputWarning(false) {
 
   // Provide a sane fallback if no VFS is specified.
   if (!this->VFS)
@@ -2112,7 +2112,21 @@
                                              AtTopLevel, MultipleArchs),
                        BaseInput);
 
+  llvm::Triple EffectiveTriple;
+  const ArgList &Args = C.getArgsForToolChain(TC, BoundArch);
+  if (InputInfos.size() != 1) {
+    EffectiveTriple = llvm::Triple(
+        T->getToolChain().ComputeEffectiveClangTriple(Args));
+  } else {
+    // Pass along the input type if it can be unambiguously determined.
+    EffectiveTriple =
+        llvm::Triple(T->getToolChain().ComputeEffectiveClangTriple(
+            Args, InputInfos[0].getType()));
+  }
+
   if (CCCPrintBindings && !CCGenDiagnostics) {
+    // FIXME: We should be able to use the effective triple here, but doing so
+    // breaks some multi-arch tests.
     llvm::errs() << "# \"" << T->getToolChain().getTripleString() << '"'
                  << " - \"" << T->getName() << "\", inputs: [";
     for (unsigned i = 0, e = InputInfos.size(); i != e; ++i) {
@@ -2122,7 +2136,7 @@
     }
     llvm::errs() << "], output: " << Result.getAsString() << "\n";
   } else {
-    T->ConstructJob(C, *JA, Result, InputInfos,
+    T->ConstructJob(C, *JA, Result, InputInfos, EffectiveTriple,
                     C.getArgsForToolChain(TC, BoundArch), LinkingOutput);
   }
   return Result;
Index: include/clang/Driver/ToolChain.h
===================================================================
--- include/clang/Driver/ToolChain.h
+++ include/clang/Driver/ToolChain.h
@@ -261,11 +261,13 @@
     return ToolChain::CST_Libstdcxx;
   }
 
-  virtual std::string getCompilerRT(const llvm::opt::ArgList &Args,
+  virtual std::string getCompilerRT(const llvm::Triple &EffectiveTriple,
+                                    const llvm::opt::ArgList &Args,
                                     StringRef Component,
                                     bool Shared = false) const;
 
-  const char *getCompilerRTArgString(const llvm::opt::ArgList &Args,
+  const char *getCompilerRTArgString(const llvm::Triple &EffectiveTriple,
+                                     const llvm::opt::ArgList &Args,
                                      StringRef Component,
                                      bool Shared = false) const;
   /// needsProfileRT - returns true if instrumentation profile is on.
@@ -411,7 +413,8 @@
       const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const;
   /// addProfileRTLibs - When -fprofile-instr-profile is specified, try to pass
   /// a suitable profile runtime library to the linker.
-  virtual void addProfileRTLibs(const llvm::opt::ArgList &Args,
+  virtual void addProfileRTLibs(const llvm::Triple &EffectiveTriple,
+                                const llvm::opt::ArgList &Args,
                                 llvm::opt::ArgStringList &CmdArgs) const;
 
   /// \brief Add arguments to use system-specific CUDA includes.
Index: include/clang/Driver/Tool.h
===================================================================
--- include/clang/Driver/Tool.h
+++ include/clang/Driver/Tool.h
@@ -14,6 +14,7 @@
 #include "llvm/Support/Program.h"
 
 namespace llvm {
+class Triple;
 namespace opt {
   class ArgList;
 }
@@ -127,6 +128,7 @@
   virtual void ConstructJob(Compilation &C, const JobAction &JA,
                             const InputInfo &Output,
                             const InputInfoList &Inputs,
+                            const llvm::Triple &EffectiveTriple,
                             const llvm::opt::ArgList &TCArgs,
                             const char *LinkingOutput) const = 0;
 };
Index: include/clang/Driver/SanitizerArgs.h
===================================================================
--- include/clang/Driver/SanitizerArgs.h
+++ include/clang/Driver/SanitizerArgs.h
@@ -16,6 +16,10 @@
 #include <string>
 #include <vector>
 
+namespace llvm {
+class Triple;
+}
+
 namespace clang {
 namespace driver {
 
@@ -66,7 +70,8 @@
   bool requiresPIE() const;
   bool needsUnwindTables() const;
   bool linkCXXRuntimes() const { return LinkCXXRuntimes; }
-  void addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
+  void addArgs(const ToolChain &TC, const llvm::Triple &EffectiveTriple,
+               const llvm::opt::ArgList &Args,
                llvm::opt::ArgStringList &CmdArgs, types::ID InputType) const;
 };
 
Index: include/clang/Driver/Driver.h
===================================================================
--- include/clang/Driver/Driver.h
+++ include/clang/Driver/Driver.h
@@ -132,9 +132,6 @@
   /// If the standard library is used
   bool UseStdLib;
 
-  /// Default target triple.
-  std::string DefaultTargetTriple;
-
   /// Driver title to use with help.
   std::string DriverTitle;
 
@@ -183,6 +180,9 @@
   unsigned CCGenDiagnostics : 1;
 
 private:
+  /// Default target triple.
+  std::string DefaultTargetTriple;
+
   /// Name to use when invoking gcc/g++.
   std::string CCCGenericGCCName;
 
Index: docs/ReleaseNotes.rst
===================================================================
--- docs/ReleaseNotes.rst
+++ docs/ReleaseNotes.rst
@@ -188,7 +188,8 @@
 Clang. If upgrading an external codebase that uses Clang as a library,
 this section should help get you past the largest hurdles of upgrading.
 
--  ...
+- Classes which inherit from ``driver::Tool`` must be updated to use effective
+  target triples when constructing jobs.
 
 AST Matchers
 ------------
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to