components/llvm/patches/012-solaris-clang-libclangDriver.patch
changeset 6637 22d5f6c97e6f
parent 6512 92717ce71105
child 7771 46912a8a1f29
--- a/components/llvm/patches/012-solaris-clang-libclangDriver.patch	Thu Aug 18 12:54:40 2016 -0700
+++ b/components/llvm/patches/012-solaris-clang-libclangDriver.patch	Thu Aug 18 12:56:39 2016 -0700
@@ -2,9 +2,11 @@
 # 23854357 clang should check for GNU ld
 # 22778650 clang should support OpenMP because it can
 # 24314745 clang should support PIE executables in Solaris
+# 24378340 clang -fopenmp must include the path to the omp.h header file
+# 24378393 clang -fopenmp must define _OPENMP to 201307
 # 3.9.X for upstream.
---- tools/clang/include/clang/Driver/Options.td	2016-01-06 16:27:42.000000000 -0500
-+++ tools/clang/include/clang/Driver/Options.td	2016-05-08 23:19:20.553431263 -0400
+--- tools/clang/include/clang/Driver/Options.td	2016-01-06 13:27:42.000000000 -0800
++++ tools/clang/include/clang/Driver/Options.td	2016-07-30 10:18:25.039779680 -0700
 @@ -669,6 +669,9 @@
    Flags<[CC1Option]>, HelpText<"Form fused FP ops (e.g. FMAs): fast (everywhere)"
    " | on (according to FP_CONTRACT pragma, default) | off (never fuse)">;
@@ -15,7 +17,30 @@
  def ffor_scope : Flag<["-"], "ffor-scope">, Group<f_Group>;
  def fno_for_scope : Flag<["-"], "fno-for-scope">, Group<f_Group>;
  
-@@ -1312,6 +1315,12 @@
+@@ -959,11 +962,17 @@
+ 
+ def fobjc_sender_dependent_dispatch : Flag<["-"], "fobjc-sender-dependent-dispatch">, Group<f_Group>;
+ def fomit_frame_pointer : Flag<["-"], "fomit-frame-pointer">, Group<f_Group>;
+-def fopenmp : Flag<["-"], "fopenmp">, Group<f_Group>, Flags<[CC1Option, NoArgumentUnused]>;
+-def fno_openmp : Flag<["-"], "fno-openmp">, Group<f_Group>, Flags<[NoArgumentUnused]>;
+-def fopenmp_EQ : Joined<["-"], "fopenmp=">, Group<f_Group>;
+-def fopenmp_use_tls : Flag<["-"], "fopenmp-use-tls">, Group<f_Group>, Flags<[NoArgumentUnused]>;
+-def fnoopenmp_use_tls : Flag<["-"], "fnoopenmp-use-tls">, Group<f_Group>, Flags<[CC1Option, NoArgumentUnused]>;
++def fopenmp : Flag<["-"], "fopenmp">, Group<f_Group>,
++              Flags<[CC1Option]>, HelpText<"Enable OpenMP">;
++def fno_openmp : Flag<["-"], "fno-openmp">, Group<f_Group>,
++                 Flags<[CC1Option]>, HelpText<"Disable OpenMP">;
++def fopenmp_EQ : Joined<["-"], "fopenmp=">, Group<f_Group>,
++                 Flags<[CC1Option]>,
++                 HelpText<"Use specified OpenMP Implementation">;
++def fopenmp_use_tls : Flag<["-"], "fopenmp-use-tls">, Group<f_Group>,
++                      Flags<[CC1Option]>, HelpText<"Use OpenMP TLS">;
++def fnoopenmp_use_tls : Flag<["-"], "fnoopenmp-use-tls">, Group<f_Group>,
++                        Flags<[CC1Option]>, HelpText<"Do not use OpenMP TLS">;
+ def fno_optimize_sibling_calls : Flag<["-"], "fno-optimize-sibling-calls">, Group<f_Group>;
+ def foptimize_sibling_calls : Flag<["-"], "foptimize-sibling-calls">, Group<f_Group>;
+ def force__cpusubtype__ALL : Flag<["-"], "force_cpusubtype_ALL">;
+@@ -1312,6 +1321,12 @@
  def meabi : Separate<["-"], "meabi">, Group<m_Group>, Flags<[CC1Option]>,
    HelpText<"Set EABI type, e.g. 4, 5 or gnu (default depends on triple)">;
  
@@ -28,7 +53,7 @@
  def mmmx : Flag<["-"], "mmmx">, Group<m_x86_Features_Group>;
  def mno_3dnowa : Flag<["-"], "mno-3dnowa">, Group<m_x86_Features_Group>;
  def mno_3dnow : Flag<["-"], "mno-3dnow">, Group<m_x86_Features_Group>;
-@@ -1954,6 +1963,7 @@
+@@ -1954,6 +1969,7 @@
  
  def fprofile_dir : Joined<["-"], "fprofile-dir=">, Group<clang_ignored_gcc_optimization_f_Group>;
  
@@ -55,8 +80,8 @@
                            New.includeSuffix());
  
 ###
---- tools/clang/lib/Driver/ToolChains.cpp	2016-02-16 10:56:48.000000000 -0900
-+++ tools/clang/lib/Driver/ToolChains.cpp	2016-06-30 09:27:01.031173505 -0800
+--- tools/clang/lib/Driver/ToolChains.cpp	2016-02-16 11:56:48.000000000 -0800
++++ tools/clang/lib/Driver/ToolChains.cpp	2016-08-04 06:09:44.734198665 -0700
 @@ -28,12 +28,15 @@
  #include "llvm/ProfileData/InstrProf.h"
  #include "llvm/Support/ErrorHandling.h"
@@ -174,7 +199,7 @@
    switch (TargetTriple.getArch()) {
    case llvm::Triple::aarch64:
      LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
-@@ -3302,69 +3321,783 @@
+@@ -3302,69 +3321,828 @@
  }
  
  /// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
@@ -225,8 +250,7 @@
 +      findGCCIncludeDirs(Triple, Args);
 +      findGCCInternalLibDir(Triple, Args);
 +    }
- 
--  GCCInstallation.init(Triple, Args);
++
 +    if (Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
 +      Linker = A->getValue();
 +      if (Linker == "bfd")
@@ -248,9 +272,7 @@
 +      }
 +    }
  
--  path_list &Paths = getFilePaths();
--  if (GCCInstallation.isValid())
--    addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
+-  GCCInstallation.init(Triple, Args);
 +    if (Arg *A = Args.getLastArg(options::OPT_fuse_as_EQ)) {
 +      Assembler = A->getValue();
 +      if (Assembler == "llvm")
@@ -265,7 +287,10 @@
 +                 (Assembler == "solaris"))
 +        D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
 +    }
-+
+ 
+-  path_list &Paths = getFilePaths();
+-  if (GCCInstallation.isValid())
+-    addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
 +    getProgramPaths().push_back(GCCInstallDir);
  
 -  addPathIfExists(D, getDriver().getInstalledDir(), Paths);
@@ -339,12 +364,12 @@
 +                                  llvm::opt::ArgStringList &CC1Args) const {
 +  if (!llvm::sys::fs::exists(Base + Suffix))
 +    return false;
++
++  addSystemInclude(DriverArgs, CC1Args, Base);
++  addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
  
 -void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
 -                                           ArgStringList &CC1Args) const {
-+  addSystemInclude(DriverArgs, CC1Args, Base);
-+  addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
-+
 +  if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
 +      llvm::sys::fs::exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
 +    addSystemInclude(DriverArgs,
@@ -356,6 +381,11 @@
 +                     Base + "/" + TargetMultiarchTriple + Suffix);
 +  }
 +
++  if (DriverArgs.hasArg(options::OPT_fopenmp) ||
++      DriverArgs.hasArg(options::OPT_fopenmp_EQ)) {
++    addSystemInclude(DriverArgs, CC1Args, "/usr/include/iomp5");
++  }
++
 +  addSystemInclude(DriverArgs, CC1Args, Base + "/backward");
 +  addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
 +  return true;
@@ -441,6 +471,10 @@
 +    }
 +  }
 +
++  if (DriverArgs.hasArg(options::OPT_fopenmp) ||
++      DriverArgs.hasArg(options::OPT_fopenmp_EQ))
++    addSystemInclude(DriverArgs, CC1Args, "/usr/include/iomp5");
++
 +  addExternCSystemInclude(DriverArgs, CC1Args, "/usr/include");
 +}
 +
@@ -473,11 +507,47 @@
 +
 +  DriverArgs.ClaimAllArgs(options::OPT_fabi_version_EQ);
 +
++  if (Arg *A = DriverArgs.getLastArg(options::OPT_fopenmp))
++    CC1Args.push_back(DriverArgs.MakeArgString("-fopenmp"));
++
++  if (Arg *A = DriverArgs.getLastArg(options::OPT_fno_openmp))
++    CC1Args.push_back(DriverArgs.MakeArgString("-fno-openmp"));
++
++  if (Arg *A = DriverArgs.getLastArg(options::OPT_fopenmp_EQ)) {
++    std::string V = A->getValue();
++    if (V != "libiomp5") {
++      const Driver &D = getDriver();
++      D.Diag(diag::err_drv_unsupported_opt) << V.c_str();
++    }
++
++    std::string fompeq="-fopenmp=";
++    fompeq += V;
++    CC1Args.push_back(DriverArgs.MakeArgString(fompeq.c_str()));
++  }
++
++  if (Arg *A = DriverArgs.getLastArg(options::OPT_fopenmp_use_tls))
++    CC1Args.push_back(DriverArgs.MakeArgString("-fopenmp-use-tls"));
++
++  if (Arg *A = DriverArgs.getLastArg(options::OPT_fnoopenmp_use_tls))
++    CC1Args.push_back(DriverArgs.MakeArgString("-fnoopenmp-use-tls"));
++
++  if (Arg *A = DriverArgs.getLastArg(options::OPT_fopenmp_is_device)) {
++    CC1Args.push_back(DriverArgs.MakeArgString("-fopenmp-is-device"));
++  }
++
 +  if (Arch == llvm::Triple::sparc || Arch == llvm::Triple::sparcv9) {
 +    CC1Args.push_back(DriverArgs.MakeArgString("-target-feature"));
 +    CC1Args.push_back(DriverArgs.MakeArgString("+hwcap"));
 +  }
 +
++  if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
++    if (Arg *A = DriverArgs.getLastArg(options::OPT_fomit_frame_pointer))
++      CC1Args.push_back(DriverArgs.MakeArgString("-fomit-frame-pointer"));
++
++    if (Arg *A = DriverArgs.getLastArg(options::OPT_fno_omit_frame_pointer))
++      CC1Args.push_back(DriverArgs.MakeArgString("-fno-omit-frame-pointer"));
++  }
++
 +  bool SeenVIS = false;
 +  bool SeenVIS2 = false;
 +  bool SeenVIS3 = false;
@@ -993,7 +1063,7 @@
    }
  }
  
-@@ -3404,6 +4137,27 @@
+@@ -3404,6 +4182,27 @@
    UbuntuVivid,
    UbuntuWily,
    UbuntuXenial,
@@ -1021,7 +1091,7 @@
    UnknownDistro
  };
  
-@@ -3421,6 +4175,10 @@
+@@ -3421,6 +4220,10 @@
    return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
  }
  
@@ -1032,7 +1102,7 @@
  static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
    llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
        llvm::MemoryBuffer::getFile("/etc/lsb-release");
-@@ -3488,6 +4246,59 @@
+@@ -3488,6 +4291,59 @@
      return UnknownDistro;
    }
  
@@ -1215,7 +1285,7 @@
    MinGW(const Driver &D, const llvm::Triple &Triple,
 ###
 --- tools/clang/lib/Driver/Tools.cpp	2016-02-12 14:51:41.000000000 -0800
-+++ tools/clang/lib/Driver/Tools.cpp	2016-07-18 19:13:48.364415520 -0700
++++ tools/clang/lib/Driver/Tools.cpp	2016-08-04 06:17:07.826616905 -0700
 @@ -43,15 +43,22 @@
  #include "llvm/Support/raw_ostream.h"
  #include "llvm/Support/TargetParser.h"
@@ -2053,7 +2123,7 @@
      }
    }
  
-@@ -7431,48 +7965,264 @@
+@@ -7431,48 +7965,268 @@
      assert(Output.isNothing() && "Invalid output.");
    }
  
@@ -2291,7 +2361,11 @@
 +
 +  if (!Args.hasArg(options::OPT_nostdlib) &&
 +      !Args.hasArg(options::OPT_nodefaultlibs)) {
-+    addOpenMPRuntime(CmdArgs, TC, Args);
++    if (Args.hasArg(options::OPT_fopenmp) ||
++        Args.hasArg(options::OPT_fopenmp_EQ)) {
++      addOpenMPRuntime(CmdArgs, TC, Args);
++      CmdArgs.push_back("-latomic");
++    }
 +
 +    if (D.CCCIsCXX())
 +      TC.AddCXXStdlibLibArgs(Args, CmdArgs);
@@ -2343,7 +2417,7 @@
  void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
                                        const InputInfo &Output,
                                        const InputInfoList &Inputs,
-@@ -8623,6 +9373,41 @@
+@@ -8623,6 +9377,41 @@
      CmdArgs.push_back("-ldl");
  }