components/llvm/patches/014-clang-gcc-toolchain.patch
author xiao qing lu - Sun Microsystems - Beijing China <xiaoqing.lu@oracle.com>
Tue, 12 Jul 2016 19:50:03 -0700
changeset 6403 9d25dbe7eb71
parent 5434 9f55c805ce9d
permissions -rw-r--r--
23209274 Upgrade libsigsegv to 2.10
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5434
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     1
# Solaris GCC Toolchain discovery.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     2
# https://llvm.org/bugs/show_bug.cgi?id=24606
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     3
--- lib/Support/Host.cpp	2014-12-16 19:38:04.000000000 -0800
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     4
+++ lib/Support/Host.cpp	2016-02-09 09:59:19.281147309 -0800
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     5
@@ -39,6 +39,11 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     6
 #include <mach/machine.h>
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     7
 #endif
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     8
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     9
+#if defined(sun) || defined(__sun) || defined(__sun__)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    10
+#include <cstring>
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    11
+#include <kstat.h>
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    12
+#endif
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    13
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    14
 #define DEBUG_TYPE "host-detection"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    15
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    16
 //===----------------------------------------------------------------------===//
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    17
@@ -674,6 +679,43 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    18
   
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    19
   return "generic";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    20
 }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    21
+#elif ((defined(sun) || defined(__sun) || defined(__sun__)) && \
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    22
+       (defined(sparc) || defined(__sparc) || defined(__sparc__)))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    23
+StringRef sys::getHostCPUName() {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    24
+  kstat_ctl_t *KC = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    25
+  kstat_t *KSP = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    26
+  kstat_named_t *KNP = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    27
+  static char Buffer[256];
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    28
+  static bool Init = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    29
+  const char *Value;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    30
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    31
+  if (!Init) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    32
+    KC = kstat_open();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    33
+    if (KC) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    34
+      KSP = kstat_lookup(KC, "cpu_info", -1, "cpu_info0");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    35
+      kstat_read(KC, KSP, NULL);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    36
+      KNP = reinterpret_cast<kstat_named_t*>(kstat_data_lookup(KSP, "brand"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    37
+      Value = (const char *) KNP->value.str.addr.ptr;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    38
+      (void) std::sprintf(Buffer, "%s (", Value);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    39
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    40
+      KNP =
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    41
+        reinterpret_cast<kstat_named_t*>(kstat_data_lookup(KSP, "cpu_type"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    42
+      Value = (const char*) KNP->value.c;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    43
+      (void) std::strcat(Buffer, Value);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    44
+      (void) std::strcat(Buffer, ") ");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    45
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    46
+      KNP =
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    47
+        reinterpret_cast<kstat_named_t*>(kstat_data_lookup(KSP,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    48
+                                                           "implementation"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    49
+      Value = (const char*) KNP->value.str.addr.ptr;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    50
+      (void) std::strcat(Buffer, Value);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    51
+      Init = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    52
+      kstat_close(KC);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    53
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    54
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    55
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    56
+  return Buffer;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    57
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    58
 #else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    59
 StringRef sys::getHostCPUName() {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    60
   return "generic";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    61
--- tools/clang/include/clang/Driver/Options.td	Sat Jul 18 11:44:46 2015
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    62
+++ tools/clang/include/clang/Driver/Options.td	Thu Aug 20 22:46:37 2015
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    63
@@ -1129,6 +1129,11 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    64
 def mthread_model : Separate<["-"], "mthread-model">, Group<m_Group>, Flags<[CC1Option]>,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    65
   HelpText<"The thread model to use, e.g. posix, single (posix by default)">;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    66
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    67
+def mvis : Flag<["-"], "mvis">, Group<m_Group>;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    68
+def mvis2 : Flag<["-"], "mvis2">, Group<m_Group>;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    69
+def mvis3 : Flag<["-"], "mvis3">, Group<m_Group>;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    70
+def mimpure_text: Flag<["-"], "mimpure-text">, Group<m_Group>;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    71
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    72
 def mmmx : Flag<["-"], "mmmx">, Group<m_x86_Features_Group>;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    73
 def mno_3dnowa : Flag<["-"], "mno-3dnowa">, Group<m_x86_Features_Group>;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    74
 def mno_3dnow : Flag<["-"], "mno-3dnow">, Group<m_x86_Features_Group>;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    75
@@ -1690,6 +1695,7 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    76
 defm profile_use : BooleanFFlag<"profile-use">, Group<clang_ignored_gcc_optimization_f_Group>;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    77
 def fprofile_use_EQ : Joined<["-"], "fprofile-use=">, Group<clang_ignored_gcc_optimization_f_Group>;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    78
 def fuse_ld_EQ : Joined<["-"], "fuse-ld=">, Group<f_Group>;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    79
+def fuse_as_EQ : Joined<["-"], "fuse-as=">, Group<f_Group>;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    80
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    81
 defm align_functions : BooleanFFlag<"align-functions">, Group<clang_ignored_gcc_optimization_f_Group>;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    82
 def falign_functions_EQ : Joined<["-"], "falign-functions=">, Group<clang_ignored_gcc_optimization_f_Group>;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    83
--- tools/clang/lib/Frontend/InitHeaderSearch.cpp	Thu Dec  4 16:22:48 2014
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    84
+++ tools/clang/lib/Frontend/InitHeaderSearch.cpp	Fri Aug 21 23:23:27 2015
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    85
@@ -122,7 +122,7 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    86
   // Add the path with sysroot prepended, if desired and this is a system header
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    87
   // group.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    88
   if (HasSysroot) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    89
-    SmallString<256> MappedPathStorage;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    90
+    SmallString<PATH_MAX> MappedPathStorage;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    91
     StringRef MappedPathStr = Path.toStringRef(MappedPathStorage);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    92
     if (CanPrefixSysroot(MappedPathStr)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    93
       AddUnmappedPath(IncludeSysroot + Path, Group, isFramework);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    94
@@ -138,7 +138,7 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    95
   assert(!Path.isTriviallyEmpty() && "can't handle empty path here");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    96
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    97
   FileManager &FM = Headers.getFileMgr();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    98
-  SmallString<256> MappedPathStorage;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    99
+  SmallString<PATH_MAX> MappedPathStorage;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   100
   StringRef MappedPathStr = Path.toStringRef(MappedPathStorage);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   101
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   102
   // Compute the DirectoryLookup type.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   103
@@ -187,12 +187,16 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   104
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   105
   // Add the multilib dirs
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   106
   llvm::Triple::ArchType arch = triple.getArch();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   107
-  bool is64bit = arch == llvm::Triple::ppc64 || arch == llvm::Triple::x86_64;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   108
+  bool is64bit = arch == llvm::Triple::ppc64 || arch == llvm::Triple::x86_64 ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   109
+    arch == llvm::Triple::sparcv9;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   110
   if (is64bit)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   111
     AddPath(Base + "/" + ArchDir + "/" + Dir64, CXXSystem, false);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   112
   else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   113
     AddPath(Base + "/" + ArchDir + "/" + Dir32, CXXSystem, false);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   114
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   115
+  // Add GCC's "C" include dir
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   116
+  AddPath(Base + "/include", CXXSystem, false);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   117
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   118
   // Add the backward dir
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   119
   AddPath(Base + "/backward", CXXSystem, false);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   120
 }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   121
@@ -442,8 +446,7 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   122
                                 "", "", "", triple);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   123
     break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   124
   case llvm::Triple::Solaris:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   125
-    AddGnuCPlusPlusIncludePaths("/usr/gcc/4.5/include/c++/4.5.2/",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   126
-                                "i386-pc-solaris2.11", "", "", triple);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   127
+    // All of this is handled in the driver.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   128
     break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   129
   default:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   130
     break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   131
@@ -462,6 +465,7 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   132
     break; // Everything else continues to use this routine's logic.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   133
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   134
   case llvm::Triple::Linux:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   135
+  case llvm::Triple::Solaris:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   136
     return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   137
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   138
   case llvm::Triple::Win32:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   139
@@ -484,7 +488,7 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   140
           // Remove clang from foo/lib/clang
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   141
           StringRef Lib = llvm::sys::path::parent_path(NoVer);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   142
           // Remove lib from foo/lib
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   143
-          SmallString<128> P = llvm::sys::path::parent_path(Lib);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   144
+          SmallString<PATH_MAX> P = llvm::sys::path::parent_path(Lib);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   145
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   146
           // Get foo/include/c++/v1
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   147
           llvm::sys::path::append(P, "include", "c++", "v1");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   148
@@ -491,10 +495,6 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   149
           AddUnmappedPath(P.str(), CXXSystem, false);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   150
         }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   151
       }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   152
-      // On Solaris, include the support directory for things like xlocale and
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   153
-      // fudged system headers.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   154
-      if (triple.getOS() == llvm::Triple::Solaris) 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   155
-        AddPath("/usr/include/c++/v1/support/solaris", CXXSystem, false);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   156
       
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   157
       AddPath("/usr/include/c++/v1", CXXSystem, false);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   158
     } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   159
--- tools/clang/lib/Driver/Tools.h	Wed Jan 28 15:52:21 2015
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   160
+++ tools/clang/lib/Driver/Tools.h	Thu Aug 20 22:46:37 2015
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   161
@@ -529,6 +529,9 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   162
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   163
     bool hasIntegratedCPP() const override { return false; }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   164
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   165
+    void RenderExtraToolArgs(const JobAction &JA,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   166
+                             ArgStringList &CmdArgs) const;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   167
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   168
     void ConstructJob(Compilation &C, const JobAction &JA,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   169
                       const InputInfo &Output, const InputInfoList &Inputs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   170
                       const llvm::opt::ArgList &TCArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   171
@@ -541,6 +544,9 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   172
     bool hasIntegratedCPP() const override { return false; }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   173
     bool isLinkJob() const override { return true; }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   174
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   175
+    void RenderExtraToolArgs(const JobAction &JA,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   176
+                             ArgStringList &CmdArgs) const;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   177
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   178
     void ConstructJob(Compilation &C, const JobAction &JA,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   179
                       const InputInfo &Output, const InputInfoList &Inputs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   180
                       const llvm::opt::ArgList &TCArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   181
--- tools/clang/lib/Driver/Tools.cpp	Sat Jul 18 11:44:46 2015
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   182
+++ tools/clang/lib/Driver/Tools.cpp	Sat Aug 22 17:26:16 2015
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   183
@@ -60,6 +60,12 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   184
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   185
 }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   186
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   187
+static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   188
+                      ArgStringList &CmdArgs, const ArgList &Args);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   189
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   190
+static void AddLibgcc(const Driver &D, ArgStringList &CmdArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   191
+                       const ArgList &Args, const std::string& Exec);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   192
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   193
 /// CheckPreprocessingOptions - Perform some validation of preprocessing
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   194
 /// arguments that is shared with gcc.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   195
 static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   196
@@ -1360,14 +1366,30 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   197
   return "";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   198
 }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   199
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   200
+static const char *getSparcTargetCPU(const ArgList &Args,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   201
+                                     const llvm::Triple &Triple);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   202
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   203
+static const char *getSparcTargetCPUFeature(const char* CPU,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   204
+                                            const ArgList &Args,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   205
+                                            const llvm::Triple &Triple);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   206
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   207
 static void getSparcTargetFeatures(const ArgList &Args,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   208
-                                   std::vector<const char *> &Features) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   209
-  bool SoftFloatABI = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   210
+                                   std::vector<const char *> &Features,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   211
+                                   const llvm::Triple &Triple) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   212
+  bool SoftFloatABI;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   213
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   214
+  if ((Triple.getOS() == llvm::Triple::Solaris) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   215
+      (Triple.getOS() == llvm::Triple::Linux))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   216
+    SoftFloatABI = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   217
+  else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   218
+    SoftFloatABI = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   219
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   220
   if (Arg *A =
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   221
           Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   222
     if (A->getOption().matches(options::OPT_mhard_float))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   223
       SoftFloatABI = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   224
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   225
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   226
   if (SoftFloatABI)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   227
     Features.push_back("+soft-float");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   228
 }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   229
@@ -1375,17 +1397,31 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   230
 void Clang::AddSparcTargetArgs(const ArgList &Args,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   231
                              ArgStringList &CmdArgs) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   232
   const Driver &D = getToolChain().getDriver();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   233
+  const llvm::Triple &T = getToolChain().getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   234
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   235
   // Select the float ABI as determined by -msoft-float and -mhard-float.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   236
+  // There is no support for soft-float ABI in Solaris.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   237
   StringRef FloatABI;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   238
   if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   239
                                options::OPT_mhard_float)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   240
-    if (A->getOption().matches(options::OPT_msoft_float))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   241
+    if (A->getOption().matches(options::OPT_msoft_float)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   242
+      if ((T.getOS() == llvm::Triple::Solaris) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   243
+          (T.getOS() == llvm::Triple::Linux)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   244
+        D.Diag(diag::warn_drv_clang_unsupported) << "-msoft-float";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   245
+        D.Diag(diag::warn_drv_overriding_flag_option) <<
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   246
+          "-msoft-float" << "-mhard-float";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   247
+        FloatABI = "hard";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   248
+      } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   249
       FloatABI = "soft";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   250
-    else if (A->getOption().matches(options::OPT_mhard_float))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   251
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   252
+    } else if (A->getOption().matches(options::OPT_mhard_float))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   253
       FloatABI = "hard";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   254
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   255
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   256
+  if (((T.getOS() == llvm::Triple::Solaris) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   257
+       (T.getOS() == llvm::Triple::Linux)) && FloatABI.empty())
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   258
+    FloatABI = "hard";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   259
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   260
   // If unspecified, choose the default based on the platform.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   261
   if (FloatABI.empty()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   262
     // Assume "soft", but warn the user we are guessing.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   263
@@ -1400,10 +1436,93 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   264
     CmdArgs.push_back("-msoft-float");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   265
   } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   266
     assert(FloatABI == "hard" && "Invalid float abi!");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   267
-    CmdArgs.push_back("-mhard-float");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   268
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   269
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   270
+  std::string Feature;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   271
+  if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   272
+    Feature = "-march=";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   273
+    Feature += A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   274
+    CmdArgs.push_back(Args.MakeArgString("-target-feature"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   275
+    CmdArgs.push_back(Args.MakeArgString(Feature.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   276
 }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   277
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   278
+  if (Arg *A = Args.getLastArg(options::OPT_mtune_EQ)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   279
+    Feature = "-mtune=";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   280
+    Feature += A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   281
+    CmdArgs.push_back(Args.MakeArgString("-target-feature"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   282
+    CmdArgs.push_back(Args.MakeArgString(Feature.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   283
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   284
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   285
+  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   286
+    Feature = "-mcpu=";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   287
+    Feature += A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   288
+    CmdArgs.push_back(Args.MakeArgString("-target-feature"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   289
+    CmdArgs.push_back(Args.MakeArgString(Feature.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   290
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   291
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   292
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   293
+static const char *getSparcTargetCPU(const ArgList &Args,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   294
+                                     const llvm::Triple &Triple) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   295
+    StringRef V;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   296
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   297
+    if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   298
+      V = A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   299
+      switch (Triple.getOS()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   300
+      case llvm::Triple::Solaris:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   301
+      case llvm::Triple::Linux:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   302
+        if (V == "v8plus" || V == "v8plusa" ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   303
+            V == "v8plusb" || V == "v9" ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   304
+            V == "v9a" || V == "v9b" ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   305
+            V == "sparcmaf" || V == "sparc4" )
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   306
+          return Args.MakeArgString(V);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   307
+        break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   308
+      default:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   309
+        return Args.MakeArgString("v8plusa");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   310
+        break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   311
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   312
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   313
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   314
+    if (Arg *AA = Args.getLastArg(options::OPT_m64))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   315
+      return "v9a";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   316
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   317
+    return "v8plusa";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   318
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   319
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   320
+static const char *getSparcTargetCPUFeature(const char* CPU,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   321
+                                            const ArgList &Args,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   322
+                                            const llvm::Triple &Triple) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   323
+  StringRef V;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   324
+  if (Arg *A = Args.getLastArg(options::OPT_mtune_EQ)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   325
+    V = A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   326
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   327
+    if (V.empty())
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   328
+      if (Arg *AA = Args.getLastArg(options::OPT_m64))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   329
+        return "vis";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   330
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   331
+    if (V == "ultrasparc" || V == "ultrasparc2" ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   332
+        V == "ultrasparc3" || V == "sparcmaf" || V == "sparc4" )
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   333
+      return Args.MakeArgString(A->getValue());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   334
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   335
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   336
+  if (!CPU)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   337
+    return 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   338
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   339
+  std::string C = CPU;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   340
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   341
+  if (C == "v8plus" || C == "v9")
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   342
+    return "";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   343
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   344
+  if (C == "v8plusa" || C == "v9a")
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   345
+    return "vis1";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   346
+  else if (C == "v8plusb" || C == "v9b")
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   347
+    return "vis2";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   348
+  else if (C == "sparcmaf" || C == "sparc4")
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   349
+    return "vis3";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   350
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   351
+  return 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   352
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   353
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   354
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   355
 static const char *getSystemZTargetCPU(const ArgList &Args) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   356
   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   357
     return A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   358
@@ -1872,7 +1991,7 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   359
     break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   360
   case llvm::Triple::sparc:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   361
   case llvm::Triple::sparcv9:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   362
-    getSparcTargetFeatures(Args, Features);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   363
+    getSparcTargetFeatures(Args, Features, Triple);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   364
     break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   365
   case llvm::Triple::aarch64:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   366
   case llvm::Triple::aarch64_be:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   367
@@ -2695,6 +2814,23 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   368
     }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   369
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   370
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   371
+  // Solaris-specific defaults for PIE
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   372
+  if (getToolChain().getTriple().getOS() == llvm::Triple::Solaris) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   373
+    switch (getToolChain().getTriple().getArch()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   374
+    case llvm::Triple::x86:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   375
+      IsPICLevelTwo = false; // "-fpie"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   376
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   377
+    case llvm::Triple::sparc:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   378
+    case llvm::Triple::x86_64:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   379
+    case llvm::Triple::sparcv9:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   380
+      IsPICLevelTwo = true; // "-fPIE"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   381
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   382
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   383
+    default:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   384
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   385
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   386
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   387
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   388
   // For the PIC and PIE flag options, this logic is different from the
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   389
   // legacy logic in very old versions of GCC, as that logic was just
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   390
   // a bug no one had ever fixed. This logic is both more rational and
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   391
@@ -2740,6 +2876,47 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   392
   if (Args.hasArg(options::OPT_static))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   393
     PIC = PIE = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   394
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   395
+  if (Triple.getOS() == llvm::Triple::Solaris) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   396
+    if (Arg *A = Args.getLastArg(options::OPT_shared)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   397
+      PIC = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   398
+      PIE = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   399
+      CmdArgs.push_back("-mrelocation-model");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   400
+      CmdArgs.push_back("pic");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   401
+      if (IsPICLevelTwo) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   402
+        CmdArgs.push_back("-pic-level");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   403
+        CmdArgs.push_back("2");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   404
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   405
+    } else if (PIC) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   406
+      PIC = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   407
+      PIE = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   408
+      CmdArgs.push_back("-mrelocation-model");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   409
+      CmdArgs.push_back("pic");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   410
+      if (IsPICLevelTwo) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   411
+        CmdArgs.push_back("-pic-level");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   412
+        CmdArgs.push_back("2");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   413
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   414
+    } else if (PIE) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   415
+      PIC = PIE = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   416
+      CmdArgs.push_back("-mrelocation-model");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   417
+      CmdArgs.push_back("pic");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   418
+      if (IsPICLevelTwo) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   419
+        CmdArgs.push_back("-pie-level");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   420
+        CmdArgs.push_back("2");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   421
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   422
+    } else if (Args.hasArg(options::OPT_static)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   423
+      // Solaris doesn't to static relocations.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   424
+      PIC = PIE = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   425
+      CmdArgs.push_back("-mrelocation-model");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   426
+      CmdArgs.push_back("dynamic-no-pic");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   427
+    } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   428
+      // This is a Solaris non-PIE executable.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   429
+      // Solaris doesn't to static relocations.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   430
+      PIC = PIE = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   431
+      CmdArgs.push_back("-mrelocation-model");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   432
+      CmdArgs.push_back("dynamic-no-pic");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   433
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   434
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   435
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   436
   if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   437
     // This is a very special mode. It trumps the other modes, almost no one
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   438
     // uses it, and it isn't even valid on any OS but Darwin.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   439
@@ -2762,6 +2939,8 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   440
   } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   441
     // Currently, LLVM only knows about PIC vs. static; the PIE differences are
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   442
     // handled in Clang's IRGen by the -pie-level flag.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   443
+    // Solaris already took care of PIC/PIE/non-PIC above.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   444
+    if (Triple.getOS() != llvm::Triple::Solaris) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   445
     CmdArgs.push_back("-mrelocation-model");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   446
     CmdArgs.push_back(PIC ? "pic" : "static");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   447
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   448
@@ -2774,6 +2953,7 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   449
       }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   450
     }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   451
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   452
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   453
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   454
   CmdArgs.push_back("-mthread-model");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   455
   if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   456
@@ -3180,12 +3360,13 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   457
       // FIXME: we should support specifying dwarf version with
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   458
       // -gline-tables-only.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   459
       CmdArgs.push_back("-gline-tables-only");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   460
-      // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   461
+      // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   462
       const llvm::Triple &Triple = getToolChain().getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   463
       if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   464
-          Triple.getOS() == llvm::Triple::FreeBSD ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   465
-          Triple.getOS() == llvm::Triple::Solaris)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   466
+          Triple.getOS() == llvm::Triple::FreeBSD)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   467
         CmdArgs.push_back("-gdwarf-2");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   468
+      else if (Triple.getOS() == llvm::Triple::Solaris)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   469
+        CmdArgs.push_back("-gdwarf-4");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   470
     } else if (A->getOption().matches(options::OPT_gdwarf_2))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   471
       CmdArgs.push_back("-gdwarf-2");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   472
     else if (A->getOption().matches(options::OPT_gdwarf_3))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   473
@@ -3194,12 +3375,13 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   474
       CmdArgs.push_back("-gdwarf-4");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   475
     else if (!A->getOption().matches(options::OPT_g0) &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   476
              !A->getOption().matches(options::OPT_ggdb0)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   477
-      // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   478
+      // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   479
       const llvm::Triple &Triple = getToolChain().getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   480
       if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   481
-          Triple.getOS() == llvm::Triple::FreeBSD ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   482
-          Triple.getOS() == llvm::Triple::Solaris)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   483
+          Triple.getOS() == llvm::Triple::FreeBSD)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   484
         CmdArgs.push_back("-gdwarf-2");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   485
+      else if (Triple.getOS() == llvm::Triple::Solaris)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   486
+        CmdArgs.push_back("-gdwarf-4");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   487
       else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   488
         CmdArgs.push_back("-g");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   489
     }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   490
@@ -3594,6 +3776,7 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   491
     // If -fmessage-length=N was not specified, determine whether this is a
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   492
     // terminal and, if so, implicitly define -fmessage-length appropriately.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   493
     unsigned N = llvm::sys::Process::StandardErrColumns();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   494
+    if (N == 0) N = 72U;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   495
     CmdArgs.push_back(Args.MakeArgString(Twine(N)));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   496
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   497
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   498
@@ -3735,6 +3918,7 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   499
     CmdArgs.push_back("-backend-option");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   500
     CmdArgs.push_back("-force-align-stack");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   501
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   502
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   503
   if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   504
                    false)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   505
     CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   506
@@ -3743,6 +3927,10 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   507
   if (Args.hasArg(options::OPT_mstack_alignment)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   508
     StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   509
     CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   510
+  } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   511
+    if ((getToolChain().getTriple().getArch() == llvm::Triple::sparc) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   512
+        (getToolChain().getTriple().getArch() == llvm::Triple::sparcv9))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   513
+      CmdArgs.push_back("-mstack-alignment=16");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   514
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   515
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   516
   if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   517
@@ -6049,6 +6237,10 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   518
   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   519
 }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   520
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   521
+void solaris::Assemble::RenderExtraToolArgs(const JobAction &JA,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   522
+                                            ArgStringList &CmdArgs) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   523
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   524
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   525
 void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   526
                                       const InputInfo &Output,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   527
                                       const InputInfoList &Inputs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   528
@@ -6055,61 +6247,321 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   529
                                       const ArgList &Args,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   530
                                       const char *LinkingOutput) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   531
   claimNoWarnArgs(Args);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   532
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   533
+  const toolchains::Solaris &TC =
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   534
+    static_cast<const toolchains::Solaris&>(getToolChain());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   535
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   536
+  if (!TC.isValid()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   537
+    llvm::errs() << "Invalid GCC installation!\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   538
+    return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   539
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   540
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   541
+  const llvm::Triple &TT = TC.getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   542
+  const Driver &D = TC.getDriver();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   543
+  llvm::Triple::ArchType Arch = TT.getArch();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   544
+  StringRef Assembler = TC.getAssembler();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   545
+  bool m32 = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   546
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   547
+  std::string march;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   548
+  std::string mtune;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   549
+  std::string mcpu;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   550
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   551
   ArgStringList CmdArgs;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   552
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   553
-  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   554
-                       options::OPT_Xassembler);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   555
+  if (Arg *A = Args.getLastArg(options::OPT_march_EQ))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   556
+    march = A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   557
+  else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   558
+    march = TC.getMArch();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   559
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   560
+  if (Arg *A = Args.getLastArg(options::OPT_mtune_EQ))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   561
+    mtune = A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   562
+  else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   563
+    mtune = TC.getMTune();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   564
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   565
+  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   566
+    mcpu = A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   567
+  else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   568
+    mcpu = TC.getMCpu();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   569
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   570
+  if (Arg *A = Args.getLastArg(options::OPT_m64))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   571
+    m32 = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   572
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   573
+  if (Args.hasArg(options::OPT_v))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   574
+    CmdArgs.push_back("-V");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   575
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   576
+  switch (Arch) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   577
+  case llvm::Triple::x86:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   578
+  case llvm::Triple::x86_64:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   579
+    if (m32)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   580
+      CmdArgs.push_back("--32");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   581
+    else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   582
+      CmdArgs.push_back("--64");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   583
+    break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   584
+  case llvm::Triple::sparc:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   585
+  case llvm::Triple::sparcv9:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   586
+    if (m32) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   587
+      CmdArgs.push_back("-32");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   588
+      march="v8plusa";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   589
+      mcpu="v8plusa";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   590
+    } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   591
+      CmdArgs.push_back("-64");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   592
+      march="v9a";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   593
+      mcpu="v9a";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   594
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   595
+    break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   596
+  default:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   597
+    D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   598
+      << TT.getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   599
+    break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   600
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   601
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   602
+  std::string xarch;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   603
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   604
+  switch (Arch) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   605
+    case llvm::Triple::sparc:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   606
+    case llvm::Triple::sparcv9:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   607
+      if (!march.empty()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   608
+        xarch = "-xarch=";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   609
+        xarch += march;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   610
+        CmdArgs.push_back(Args.MakeArgString(xarch.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   611
+      } else if (!mtune.empty()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   612
+        xarch = "-xarch=";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   613
+        xarch += mtune;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   614
+        CmdArgs.push_back(Args.MakeArgString(xarch.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   615
+      } else if (!mcpu.empty()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   616
+        xarch = "-xarch=";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   617
+        xarch += mcpu;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   618
+        CmdArgs.push_back(Args.MakeArgString(xarch.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   619
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   620
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   621
+      addAssemblerKPIC(Args, CmdArgs);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   622
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   623
+      if (Args.hasArg(options::OPT_mstrict_align))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   624
+        CmdArgs.push_back("--enforce-aligned-data");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   625
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   626
+    case llvm::Triple::x86:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   627
+    case llvm::Triple::x86_64:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   628
+      if (!march.empty()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   629
+        xarch = "-mtune=";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   630
+        xarch += march;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   631
+        CmdArgs.push_back(Args.MakeArgString(xarch.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   632
+      } else if (!mtune.empty()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   633
+        xarch = "-mtune=";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   634
+        xarch += mtune;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   635
+        CmdArgs.push_back(Args.MakeArgString(xarch.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   636
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   637
+      if (!mcpu.empty()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   638
+        xarch = "-march=";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   639
+        xarch += mcpu;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   640
+        CmdArgs.push_back(Args.MakeArgString(xarch.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   641
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   642
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   643
+    default:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   644
+      D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   645
+        << TT.getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   646
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   647
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   648
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   649
+  if (Args.hasArg(options::OPT_g_Flag) || Args.hasArg(options::OPT_g0) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   650
+      Args.hasArg(options::OPT_g1) || Args.hasArg(options::OPT_g2) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   651
+      Args.hasArg(options::OPT_g3))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   652
+    CmdArgs.push_back("--gen-debug");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   653
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   654
+  if (Output.isFilename()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   655
   CmdArgs.push_back("-o");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   656
   CmdArgs.push_back(Output.getFilename());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   657
+  } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   658
+    D.Diag(diag::err_drv_invalid_gcc_output_type) << "<unspecified>";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   659
+    CmdArgs.push_back("-fsyntax-only");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   660
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   661
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   662
-  for (const auto &II : Inputs)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   663
+  RenderExtraToolArgs(JA, CmdArgs);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   664
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   665
+  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   666
+                       options::OPT_Xassembler);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   667
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   668
+  for (const auto &II : Inputs) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   669
+    if (II.getType() == types::TY_LLVM_IR ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   670
+        II.getType() == types::TY_LTO_IR ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   671
+        II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   672
+      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   673
+        << getToolChain().getTripleString();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   674
+    else if (II.getType() == types::TY_AST)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   675
+      D.Diag(clang::diag::err_drv_no_ast_support)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   676
+        << getToolChain().getTripleString();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   677
+    else if (II.getType() == types::TY_ModuleFile)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   678
+      D.Diag(diag::err_drv_no_module_support)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   679
+        << getToolChain().getTripleString();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   680
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   681
+    if (II.isFilename())
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   682
     CmdArgs.push_back(II.getFilename());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   683
+    else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   684
+      II.getInputArg().render(Args, CmdArgs);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   685
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   686
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   687
-  const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   688
-  C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   689
+  C.addCommand(llvm::make_unique<Command>(JA, *this,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   690
+                                          Args.MakeArgString(Assembler),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   691
+                                          CmdArgs));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   692
 }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   693
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   694
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   695
+void solaris::Link::RenderExtraToolArgs(const JobAction &JA,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   696
+                                        ArgStringList &CmdArgs) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   697
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   698
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   699
 void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   700
                                   const InputInfo &Output,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   701
                                   const InputInfoList &Inputs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   702
                                   const ArgList &Args,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   703
                                   const char *LinkingOutput) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   704
-  // FIXME: Find a real GCC, don't hard-code versions here
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   705
-  std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   706
-  const llvm::Triple &T = getToolChain().getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   707
-  std::string LibPath = "/usr/lib/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   708
+  const toolchains::Solaris& TC =
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   709
+    static_cast<const toolchains::Solaris&>(getToolChain());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   710
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   711
+  if (!TC.isValid()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   712
+    llvm::errs() << "Invalid GCC installation!\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   713
+    return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   714
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   715
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   716
+  const llvm::Triple &T = TC.getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   717
+  const Driver &D = TC.getDriver();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   718
   llvm::Triple::ArchType Arch = T.getArch();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   719
+  bool m32 = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   720
+  StringRef Linker = TC.getLinker();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   721
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   722
+  if (Arg *A = Args.getLastArg(options::OPT_m64))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   723
+    m32 = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   724
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   725
+  std::string GCCLibPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   726
+  std::string YPPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   727
+  GCCLibPath += "/lib/gcc/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   728
+  std::string LibPath = "/usr/lib/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   729
+  std::string ShortLibPath = "/lib/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   730
+  std::string ClangLibPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   731
+  const char* moption;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   732
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   733
   switch (Arch) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   734
   case llvm::Triple::x86:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   735
-    GCCLibPath +=
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   736
-        ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   737
+    if (m32) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   738
+      GCCLibPath = TC.getGCCInternalLibDir().str();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   739
+      GCCLibPath += "/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   740
+      moption = "-32";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   741
+      YPPath = "/lib:/usr/lib";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   742
+      ClangLibPath = "/usr/lib/clang/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   743
+    } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   744
+      GCCLibPath = TC.getGCCInternalMultiLibDir().str();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   745
+      GCCLibPath += "/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   746
+      LibPath += "amd64/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   747
+      ShortLibPath += "amd64/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   748
+      moption = "-64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   749
+      YPPath = "/lib/amd64:/usr/lib/amd64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   750
+      ClangLibPath = "/usr/lib/clang/amd64/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   751
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   752
     break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   753
+  case llvm::Triple::sparc:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   754
+    if (m32) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   755
+      GCCLibPath = TC.getGCCInternalLibDir().str();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   756
+      GCCLibPath += "/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   757
+      moption = "-32";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   758
+      YPPath = "/lib:/usr/lib";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   759
+      ClangLibPath = "/usr/lib/clang/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   760
+    } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   761
+      GCCLibPath = TC.getGCCInternalMultiLibDir().str();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   762
+      GCCLibPath += "/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   763
+      LibPath += "sparcv9/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   764
+      ShortLibPath += "sparcv9/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   765
+      moption = "-64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   766
+      YPPath = "/lib/sparcv9:/usr/lib/sparcv9";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   767
+      ClangLibPath = "/usr/lib/clang/sparcv9/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   768
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   769
+    break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   770
   case llvm::Triple::x86_64:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   771
-    GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   772
-    GCCLibPath += "/4.5.2/amd64/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   773
+    if (m32) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   774
+      GCCLibPath = TC.getGCCInternalMultiLibDir().str();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   775
+      GCCLibPath += "/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   776
+      moption = "-32";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   777
+      YPPath = "/lib:/usr/lib";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   778
+      ClangLibPath = "/usr/lib/clang/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   779
+    } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   780
+      GCCLibPath = TC.getGCCInternalLibDir().str();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   781
+      GCCLibPath += "/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   782
     LibPath += "amd64/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   783
+      ShortLibPath += "amd64/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   784
+      moption = "-64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   785
+      YPPath = "/lib/amd64:/usr/lib/amd64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   786
+      ClangLibPath = "/usr/lib/clang/amd64/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   787
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   788
     break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   789
+  case llvm::Triple::sparcv9:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   790
+    if (m32) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   791
+      GCCLibPath = TC.getGCCInternalMultiLibDir().str();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   792
+      GCCLibPath += "/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   793
+      moption = "-32";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   794
+      YPPath = "/lib:/usr/lib";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   795
+      ClangLibPath = "/usr/lib/clang/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   796
+    } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   797
+      GCCLibPath = TC.getGCCInternalLibDir().str();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   798
+      GCCLibPath += "/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   799
+      LibPath += "sparcv9/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   800
+      ShortLibPath += "sparcv9/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   801
+      moption = "-64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   802
+      YPPath = "/lib/sparcv9:/usr/lib/sparcv9";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   803
+      ClangLibPath = "/usr/lib/clang/sparcv9/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   804
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   805
+    break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   806
   default:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   807
-    llvm_unreachable("Unsupported architecture");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   808
+    D.Diag(diag::err_target_unsupported_arch) << T.getArchName()
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   809
+      << T.getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   810
+    break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   811
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   812
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   813
   ArgStringList CmdArgs;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   814
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   815
-  // Demangle C++ names in errors
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   816
-  CmdArgs.push_back("-C");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   817
+  CmdArgs.push_back(Args.MakeArgString("-zignore"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   818
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   819
-  if ((!Args.hasArg(options::OPT_nostdlib)) &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   820
-      (!Args.hasArg(options::OPT_shared))) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   821
-    CmdArgs.push_back("-e");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   822
-    CmdArgs.push_back("_start");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   823
+  Arg *PIEArg = Args.getLastArg(options::OPT_fPIE, options::OPT_fpie);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   824
+  if (PIEArg) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   825
+    if (PIEArg->getOption().matches(options::OPT_fPIE) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   826
+        PIEArg->getOption().matches(options::OPT_fpie)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   827
+      CmdArgs.push_back(Args.MakeArgString("-Qy"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   828
+      CmdArgs.push_back(Args.MakeArgString("-zdirect"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   829
+      CmdArgs.push_back(Args.MakeArgString("-ztextwarn"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   830
+      CmdArgs.push_back(Args.MakeArgString("-ztype=pie"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   831
+      CmdArgs.push_back(Args.MakeArgString("-zaslr=enable"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   832
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   833
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   834
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   835
+  // Silence warning for "-g: argument not used during compilation
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   836
+  Args.ClaimAllArgs(options::OPT_g_Group);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   837
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   838
+  // Language options
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   839
+  Args.ClaimAllArgs(options::OPT_emit_llvm);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   840
+  Args.ClaimAllArgs(options::OPT_w);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   841
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   842
+  if (Args.hasArg(options::OPT_s))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   843
+    CmdArgs.push_back("-s");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   844
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   845
+  const std::vector<std::string> &ExtraOpts = TC.getExtraOpts();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   846
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   847
+  // Handle extra options
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   848
+  if (ExtraOpts.size()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   849
+    for (std::vector<std::string>::const_iterator I = ExtraOpts.begin(),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   850
+         E = ExtraOpts.end(); I != E; ++I)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   851
+      CmdArgs.push_back((*I).c_str());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   852
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   853
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   854
+  // Demangle C++ names
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   855
+  if (Linker == "/usr/gnu/bin/ld.bfd" || Linker == "/usr/gnu/bin/ld.gold" ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   856
+      Linker == "/usr/gnu/bin/ld" || Linker == "/usr/bin/gld")
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   857
+    CmdArgs.push_back("--demangle");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   858
+  else if (Linker == "/usr/bin/ld")
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   859
+    CmdArgs.push_back("-C");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   860
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   861
   if (Args.hasArg(options::OPT_static)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   862
     CmdArgs.push_back("-Bstatic");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   863
     CmdArgs.push_back("-dn");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   864
   } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   865
     CmdArgs.push_back("-Bdynamic");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   866
+    CmdArgs.push_back("-dy");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   867
     if (Args.hasArg(options::OPT_shared)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   868
       CmdArgs.push_back("-shared");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   869
     } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   870
@@ -6125,41 +6577,261 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   871
     assert(Output.isNothing() && "Invalid output.");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   872
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   873
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   874
+  const char* Values = "values-Xa.o";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   875
+  const char* Xpg = "values-xpg4.o";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   876
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   877
+  Arg *STDArg = Args.getLastArg(options::OPT_std_EQ);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   878
+  if (STDArg) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   879
+    if (STDArg->getOption().matches(options::OPT_std_EQ)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   880
+      std::string Lang = STDArg->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   881
+      if ((Lang == "c99") || (Lang == "c11") ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   882
+          (Lang == "c++11") || (Lang == "c++14")) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   883
+        Values = "values-Xc.o";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   884
+        Xpg = "values-xpg6.o";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   885
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   886
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   887
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   888
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   889
+  const char *gldm = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   890
+  if (Linker == "/usr/gnu/bin/ld.bfd" || Linker == "/usr/gnu/bin/ld.gold" ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   891
+      Linker == "/usr/gnu/bin/ld" || Linker == "/usr/bin/gld") {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   892
+    switch (Arch) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   893
+    case llvm::Triple::x86:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   894
+      if (m32)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   895
+        gldm = "-m elf_i386";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   896
+      else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   897
+        gldm = "-m elf_x86_64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   898
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   899
+    case llvm::Triple::x86_64:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   900
+      if (m32)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   901
+        gldm = "-m elf_i386";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   902
+      else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   903
+        gldm = "-m elf_x86_64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   904
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   905
+    case llvm::Triple::sparc:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   906
+      if (m32)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   907
+        gldm = "-m elf32_sparc";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   908
+      else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   909
+        gldm = "-m elf64_sparc";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   910
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   911
+    case llvm::Triple::sparcv9:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   912
+      if (m32)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   913
+        gldm = "-m elf32_sparc";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   914
+      else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   915
+        gldm = "-m elf64_sparc";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   916
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   917
+    default:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   918
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   919
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   920
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   921
+    if (gldm)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   922
+      CmdArgs.push_back(Args.MakeArgString(StringRef(gldm)));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   923
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   924
+    if (Linker == "/usr/gnu/bin/ld.gold") {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   925
+      if (Args.hasArg(options::OPT_O))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   926
+        Args.AddAllArgs(CmdArgs, options::OPT_O);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   927
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   928
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   929
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   930
+  if (Args.hasArg(options::OPT_v))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   931
+    CmdArgs.push_back(Args.MakeArgString(StringRef("-V")));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   932
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   933
+  CmdArgs.push_back(Args.MakeArgString(StringRef("-Qy")));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   934
+  if (Linker == "/usr/bin/ld") {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   935
+    CmdArgs.push_back(Args.MakeArgString(StringRef("-Y")));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   936
+    CmdArgs.push_back(Args.MakeArgString(StringRef("P," + YPPath)));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   937
+  } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   938
+    CmdArgs.push_back(Args.MakeArgString(StringRef("-Y")));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   939
+    CmdArgs.push_back(Args.MakeArgString(StringRef(YPPath)));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   940
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   941
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   942
+  CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   943
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   944
+  std::string P = GCCLibPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   945
+  P += "../../..";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   946
+  CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + P));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   947
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   948
+  std::string crt1o;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   949
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   950
   if (!Args.hasArg(options::OPT_nostdlib) &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   951
       !Args.hasArg(options::OPT_nostartfiles)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   952
     if (!Args.hasArg(options::OPT_shared)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   953
-      CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   954
+      switch (Arch) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   955
+      case llvm::Triple::sparc:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   956
+      case llvm::Triple::sparcv9:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   957
+        crt1o = GCCLibPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   958
+        break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   959
+      case llvm::Triple::x86:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   960
+      case llvm::Triple::x86_64:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   961
+        crt1o = LibPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   962
+        break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   963
+      default:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   964
+        D.Diag(diag::err_target_unsupported_arch) << T.getArchName()
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   965
+          << T.getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   966
+        break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   967
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   968
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   969
+      crt1o += "/crt1.o";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   970
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   971
+      CmdArgs.push_back(Args.MakeArgString(crt1o.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   972
       CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   973
-      CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   974
+      CmdArgs.push_back(Args.MakeArgString(LibPath + Values));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   975
+      CmdArgs.push_back(Args.MakeArgString(LibPath + Xpg));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   976
+      CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + GCCLibPath));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   977
+      CmdArgs.push_back(Args.MakeArgString("-L" + P));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   978
       CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   979
     } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   980
       CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   981
-      CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   982
+      CmdArgs.push_back(Args.MakeArgString(LibPath + Values));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   983
+      CmdArgs.push_back(Args.MakeArgString(LibPath + Xpg));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   984
+      CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + GCCLibPath));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   985
+      CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + P));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   986
       CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   987
     }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   988
-    if (getToolChain().getDriver().CCCIsCXX())
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   989
-      CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   990
+  } else if (Args.hasArg(options::OPT_nostdlib) &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   991
+             !Args.hasArg(options::OPT_nostartfiles)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   992
+    if (Args.hasArg(options::OPT_shared)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   993
+      CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   994
+      CmdArgs.push_back(Args.MakeArgString(LibPath + Values));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   995
+      CmdArgs.push_back(Args.MakeArgString(LibPath + Xpg));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   996
+      CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + GCCLibPath));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   997
+      CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + P));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   998
+      CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   999
+    } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1000
+      CmdArgs.push_back(Args.MakeArgString(crt1o.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1001
+      CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1002
+      CmdArgs.push_back(Args.MakeArgString(LibPath + Values));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1003
+      CmdArgs.push_back(Args.MakeArgString(LibPath + Xpg));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1004
+      CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + GCCLibPath));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1005
+      CmdArgs.push_back(Args.MakeArgString("-L" + P));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1006
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1007
+  } else if (!Args.hasArg(options::OPT_nostdlib) &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1008
+             Args.hasArg(options::OPT_nostartfiles)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1009
+    if (Args.hasArg(options::OPT_shared)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1010
+      CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1011
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1012
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1013
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1014
-  CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1015
+  // Itanium C++ ABI.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1016
+  std::string CXAFinalize;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1017
+  bool HasSystemCXAFinalize = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1018
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1019
+  if (!Args.hasArg(options::OPT_shared)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1020
+    if (PIEArg) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1021
+      if (PIEArg->getOption().matches(options::OPT_fPIE) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1022
+          PIEArg->getOption().matches(options::OPT_fpie)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1023
+        CXAFinalize = ClangLibPath + "cxa_finalize_pic.o";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1024
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1025
+    } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1026
+      CXAFinalize = ClangLibPath + "cxa_finalize.o";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1027
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1028
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1029
+    HasSystemCXAFinalize = llvm::sys::fs::exists(CXAFinalize.c_str());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1030
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1031
+    if (D.CCCIsCXX() && HasSystemCXAFinalize)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1032
+      CmdArgs.push_back(Args.MakeArgString(CXAFinalize.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1033
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1034
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1035
+  CmdArgs.push_back(Args.MakeArgString(StringRef("-L" + GCCLibPath)));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1036
+  CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1037
+  CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + ShortLibPath));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1038
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1039
   Args.AddAllArgs(CmdArgs, options::OPT_L);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1040
+  const ToolChain::path_list Paths = TC.getFilePaths();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1041
+  for (ToolChain::path_list::const_iterator B = Paths.begin(), E = Paths.end();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1042
+       B != E; ++B) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1043
+    CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *B));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1044
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1045
+    // Itanium C++ ABI.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1046
+    if (!Args.hasArg(options::OPT_shared)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1047
+      if (D.CCCIsCXX() && !HasSystemCXAFinalize) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1048
+        if (PIEArg) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1049
+          if (PIEArg->getOption().matches(options::OPT_fPIE) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1050
+              PIEArg->getOption().matches(options::OPT_fpie)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1051
+            CXAFinalize = *B + "/cxa_finalize_pic.o";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1052
+          }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1053
+        } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1054
+          CXAFinalize = *B + "/cxa_finalize.o";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1055
+        }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1056
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1057
+        if (llvm::sys::fs::exists(CXAFinalize.c_str()))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1058
+          CmdArgs.push_back(Args.MakeArgString(CXAFinalize.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1059
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1060
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1061
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1062
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1063
   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1064
   Args.AddAllArgs(CmdArgs, options::OPT_e);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1065
+  Args.AddAllArgs(CmdArgs, options::OPT_s);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1066
+  Args.AddAllArgs(CmdArgs, options::OPT_t);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1067
   Args.AddAllArgs(CmdArgs, options::OPT_r);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1068
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1069
-  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1070
+  std::vector<std::string>  zoptions = Args.getAllArgValues(options::OPT_z);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1071
+  std::string zoption;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1072
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1073
+  for (std::vector<std::string>::const_iterator B = zoptions.begin(),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1074
+      E = zoptions.end(); B != E; ++B) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1075
+    zoption = "-z";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1076
+    zoption += *B;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1077
+    CmdArgs.push_back(Args.MakeArgString(StringRef(zoption)));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1078
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1079
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1080
+  if (!Args.hasArg(options::OPT_mimpure_text) &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1081
+      !Args.hasArg(options::OPT_fpie) &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1082
+      !Args.hasArg(options::OPT_fPIE))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1083
+    CmdArgs.push_back(Args.MakeArgString(StringRef("-ztext")));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1084
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1085
+  // Itanium C++ ABI.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1086
+  if (D.CCCIsCXX()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1087
+    if (!Args.hasArg(options::OPT_shared)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1088
+      const char* zfiniarray = "-zfiniarray=__cxa_finalize";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1089
+      CmdArgs.push_back(Args.MakeArgString(zfiniarray));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1090
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1091
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1092
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1093
+  if (Linker == "/usr/gnu/bin/ld.gold" || Linker == "/usr/gnu/bin/ld" ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1094
+      Linker == "/usr/gnu/bin/ld.bfd") {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1095
+    CmdArgs.push_back("-plugin");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1096
+    std::string Plugin = D.Dir + "/../lib/LLVMgold.so";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1097
+    CmdArgs.push_back(Args.MakeArgString(Plugin));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1098
+  } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1099
+    CmdArgs.push_back(moption);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1100
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1101
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1102
+  if (Arg *A = Args.getLastArg(options::OPT_rpath)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1103
+    StringRef V = A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1104
+    if (Linker == "/usr/gnu/bin/ld.gold" || Linker == "/usr/gnu/bin/ld" ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1105
+        Linker == "/usr/gnu/bin/ld.bfd") {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1106
+      CmdArgs.push_back(Args.MakeArgString("-rpath"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1107
+      CmdArgs.push_back(Args.MakeArgString(V));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1108
+    } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1109
+      CmdArgs.push_back(Args.MakeArgString("-R"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1110
+      CmdArgs.push_back(Args.MakeArgString(V));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1111
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1112
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1113
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1114
+  AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1115
+  AddLibgcc(D, CmdArgs, Args, Linker.str());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1116
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1117
   if (!Args.hasArg(options::OPT_nostdlib) &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1118
       !Args.hasArg(options::OPT_nodefaultlibs)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1119
-    if (getToolChain().getDriver().CCCIsCXX())
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1120
-      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1121
-    CmdArgs.push_back("-lgcc_s");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1122
-    if (!Args.hasArg(options::OPT_shared)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1123
-      CmdArgs.push_back("-lgcc");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1124
+    if (D.CCCIsCXX())
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1125
+      TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1126
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1127
       CmdArgs.push_back("-lc");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1128
       CmdArgs.push_back("-lm");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1129
+    CmdArgs.push_back("-lgcc_s");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1130
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1131
+    if (Args.hasArg(options::OPT_static)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1132
+      CmdArgs.push_back("-lgcc");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1133
+      CmdArgs.push_back("-lgcc_eh");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1134
     }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1135
+  } else if (Args.hasArg(options::OPT_nostdlib) &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1136
+             (!Args.hasArg(options::OPT_nodefaultlibs))) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1137
+    CmdArgs.push_back("-lgcc_s");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1138
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1139
+    if (Args.hasArg(options::OPT_static))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1140
+      CmdArgs.push_back("-lgcc_eh");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1141
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1142
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1143
   if (!Args.hasArg(options::OPT_nostdlib) &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1144
@@ -6166,15 +6838,17 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1145
       !Args.hasArg(options::OPT_nostartfiles)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1146
     CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1147
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1148
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1149
   CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1150
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1151
-  addProfileRT(getToolChain(), Args, CmdArgs);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1152
+  addProfileRT(TC, Args, CmdArgs);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1153
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1154
-  const char *Exec =
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1155
-    Args.MakeArgString(getToolChain().GetLinkerPath());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1156
-  C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1157
+  C.addCommand(llvm::make_unique<Command>(JA, *this,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1158
+                                          Args.MakeArgString(Linker),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1159
+                                          CmdArgs));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1160
 }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1161
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1162
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1163
 void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1164
                                      const InputInfo &Output,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1165
                                      const InputInfoList &Inputs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1166
@@ -7280,6 +7954,40 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1167
   if (isAndroid && !StaticLibgcc)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1168
     CmdArgs.push_back("-ldl");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1169
 }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1170
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1171
+static void AddLibgcc(const Driver &D, ArgStringList &CmdArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1172
+                      const ArgList &Args, const std::string& Exec) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1173
+  bool StaticLibgcc = Args.hasArg(options::OPT_static) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1174
+    Args.hasArg(options::OPT_static_libgcc);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1175
+  if (!D.CCCIsCXX())
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1176
+    CmdArgs.push_back("-lgcc");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1177
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1178
+  if (StaticLibgcc) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1179
+    if (D.CCCIsCXX())
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1180
+      CmdArgs.push_back("-lgcc");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1181
+  } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1182
+    if ((!D.CCCIsCXX()) && ((Exec == "/usr/bin/gld") ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1183
+                            (Exec == "/usr/gnu/bin/ld") ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1184
+                            (Exec == "/usr/gnu/bin/ld.bfd") ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1185
+                            (Exec == "/usr/gnu/bin/ld.gold")))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1186
+      CmdArgs.push_back("--as-needed");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1187
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1188
+    CmdArgs.push_back("-lgcc_s");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1189
+    if ((!D.CCCIsCXX()) && ((Exec == "/usr/bin/gld") ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1190
+                            (Exec == "/usr/gnu/bin/ld") ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1191
+                            (Exec == "/usr/gnu/bin/ld.bfd") ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1192
+                            (Exec == "/usr/gnu/bin/ld.gold")))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1193
+      CmdArgs.push_back("--no-as-needed");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1194
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1195
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1196
+  if (StaticLibgcc)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1197
+    CmdArgs.push_back("-lgcc_eh");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1198
+  else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1199
+    CmdArgs.push_back("-lgcc");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1200
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1201
+  if (!StaticLibgcc)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1202
+    CmdArgs.push_back("-ldl");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1203
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1204
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1205
 static std::string getLinuxDynamicLinker(const ArgList &Args,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1206
                                          const toolchains::Linux &ToolChain) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1207
--- tools/clang/lib/Driver/ToolChains.h	2015-08-29 19:24:32.064113013 -0700
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1208
+++ tools/clang/lib/Driver/ToolChains.h	2015-08-30 12:42:03.657485673 -0700
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1209
@@ -508,16 +508,106 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1210
                              llvm::opt::ArgStringList &CC1Args) const override;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1211
 };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1212
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1213
-class LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1214
+class LLVM_LIBRARY_VISIBILITY Solaris : public Generic_ELF {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1215
 public:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1216
   Solaris(const Driver &D, const llvm::Triple &Triple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1217
           const llvm::opt::ArgList &Args);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1218
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1219
-  bool IsIntegratedAssemblerDefault() const override { return true; }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1220
+  bool IsIntegratedAssemblerDefault() const override { return !UseGnuAs; }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1221
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1222
+  std::string computeSysRoot() const;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1223
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1224
+  bool addLibStdCXXIncludePaths(Twine Base, Twine Suffix,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1225
+                                StringRef GCCTriple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1226
+                                StringRef GCCMultiarchTriple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1227
+                                StringRef TargetMultiarchTriple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1228
+                                Twine IncludeSuffix,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1229
+                                const llvm::opt::ArgList &DriverArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1230
+                                llvm::opt::ArgStringList &CC1Args) const;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1231
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1232
+  void addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1233
+                                const llvm::opt::ArgList &DriverArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1234
+                                llvm::opt::ArgStringList &CC1Args) const;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1235
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1236
+  void AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1237
+                                    llvm::opt::ArgStringList &CC1Args) const override;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1238
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1239
+  void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1240
+                                 llvm::opt::ArgStringList &CC1Args) const override;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1241
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1242
+  void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1243
+                             llvm::opt::ArgStringList &CC1Args) const override;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1244
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1245
+  void findGCCMajorMinor() const;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1246
+  void findGCCMajorMinorMicro(const llvm::Triple &Triple) const;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1247
+  void findGCCIncludeDirs(const llvm::Triple &Triple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1248
+                          const llvm::opt::ArgList &Args) const;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1249
+  void findGCCInternalLibDir(const llvm::Triple &Triple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1250
+                             const llvm::opt::ArgList &Args) const;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1251
+  void findSpecifiedGCCToolchain(const char *StartingPath,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1252
+                                 const llvm::Triple &Triple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1253
+                                 const llvm::opt::ArgList &Args) const;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1254
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1255
+  StringRef getAssembler() const { return Assembler.c_str(); }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1256
+  StringRef getLinker() const { return Linker.c_str(); }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1257
+  StringRef getGCCInstallDir() const { return GCCInstallDir.c_str(); }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1258
+  StringRef getGCCMajorMinor() const { return GCCMajorMinor.c_str(); }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1259
+  StringRef getMArch() const { return march.c_str(); }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1260
+  StringRef getMTune() const { return mtune.c_str(); }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1261
+  StringRef getMCpu() const { return mcpu.c_str(); }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1262
+  StringRef getGCCInternalLibDir() const { return GCCInternalLibDir; }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1263
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1264
+  StringRef getGCCInternalMultiLibDir() const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1265
+    return GCCInternalMultiLibDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1266
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1267
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1268
+  StringRef getGCCMajorMinorMicro() const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1269
+    return GCCMajorMinorMicro.c_str();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1270
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1271
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1272
+  const std::vector<std::string> &getGCCIncludeDirs() const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1273
+    return GCCIncludeDirs;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1274
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1275
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1276
+  const std::vector<std::string> &getExtraOpts() const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1277
+    return ExtraOpts;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1278
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1279
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1280
+  bool isValid() const { return IsValid; }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1281
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1282
+  void print(raw_ostream &OS) const;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1283
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1284
 protected:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1285
   Tool *buildAssembler() const override;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1286
   Tool *buildLinker() const override;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1287
+  void validate();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1288
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1289
+private:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1290
+  bool UseGnuAs;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1291
+  bool UseGnuLd;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1292
+  bool UseGoldLd;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1293
+  bool UseSunLd;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1294
+  mutable bool UseMediatedGCCToolChainPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1295
+  mutable bool UseSpecifiedGCCToolChainPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1296
+  bool IsValid;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1297
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1298
+protected:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1299
+  mutable std::string GCCInstallDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1300
+  mutable std::string GCCMajorMinor;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1301
+  mutable std::string GCCMajorMinorMicro;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1302
+  mutable std::string GCCInternalLibDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1303
+  mutable std::string GCCInternalMultiLibDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1304
+  mutable std::vector<std::string> GCCIncludeDirs;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1305
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1306
+  mutable std::string Assembler;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1307
+  mutable std::string Linker;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1308
+  mutable std::string mtune;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1309
+  mutable std::string march;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1310
+  mutable std::string mcpu;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1311
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1312
+  mutable std::vector<std::string> ExtraOpts;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1313
+  static const char *MediatedGCCToolChainPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1314
+  static const bool SupportsClangLibCPlusPlus;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1315
 };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1316
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1317
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1318
--- tools/clang/lib/Driver/ToolChains.cpp	2015-04-27 01:13:25.000000000 -0700
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1319
+++ tools/clang/lib/Driver/ToolChains.cpp	2015-08-30 13:11:52.217344511 -0700
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1320
@@ -28,8 +28,10 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1321
 #include "llvm/Support/FileSystem.h"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1322
 #include "llvm/Support/MemoryBuffer.h"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1323
 #include "llvm/Support/Path.h"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1324
+#include "llvm/Support/Host.h"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1325
 #include "llvm/Support/Program.h"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1326
 #include "llvm/Support/raw_ostream.h"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1327
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1328
 #include <cstdlib> // ::getenv
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1329
 #include <system_error>
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1330
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1331
@@ -38,6 +40,19 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1332
 using namespace clang;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1333
 using namespace llvm::opt;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1334
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1335
+#if defined(LLVM_ON_UNIX)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1336
+#include <cstring>
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1337
+#include <cctype>
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1338
+#include <sys/types.h>
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1339
+#include <sys/stat.h>
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1340
+#include <dirent.h>
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1341
+#include <unistd.h>
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1342
+#endif
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1343
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1344
+/// \brief Get our best guess at the multiarch triple for a target.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1345
+static std::string getMultiarchTriple(const llvm::Triple &TargetTriple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1346
+                                      StringRef SysRoot);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1347
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1348
 MachO::MachO(const Driver &D, const llvm::Triple &Triple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1349
                        const ArgList &Args)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1350
   : ToolChain(D, Triple, Args) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1351
@@ -1214,6 +1229,11 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1352
     // If we have a SysRoot, try that first.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1353
     if (!D.SysRoot.empty()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1354
       Prefixes.push_back(D.SysRoot);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1355
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1356
+      // Add Solaris-specific GCC locations.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1357
+      if (TargetTriple.getOS() == llvm::Triple::Solaris)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1358
+        Prefixes.push_back("/usr/gcc");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1359
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1360
       Prefixes.push_back(D.SysRoot + "/usr");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1361
     }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1362
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1363
@@ -1303,20 +1323,24 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1364
   static const char *const ARMebHFTriples[] = { "armeb-linux-gnueabihf",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1365
                                                 "armebv7hl-redhat-linux-gnueabi" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1366
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1367
-  static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1368
+  static const char *const X86_64LibDirs[] = { "/lib64", "/lib/amd64",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1369
+                                               "/lib/64", "/lib" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1370
   static const char *const X86_64Triples[] = {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1371
     "x86_64-linux-gnu", "x86_64-unknown-linux-gnu", "x86_64-pc-linux-gnu",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1372
     "x86_64-redhat-linux6E", "x86_64-redhat-linux", "x86_64-suse-linux",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1373
     "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", "x86_64-slackware-linux",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1374
-    "x86_64-linux-android", "x86_64-unknown-linux"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1375
+    "x86_64-linux-android", "x86_64-unknown-linux", "x86_64-pc-solaris2.11",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1376
+    "x86_64-pc-solaris2.12", "x86_64-pc-solaris2.13"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1377
   };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1378
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1379
   static const char *const X32LibDirs[] = { "/libx32" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1380
   static const char *const X86LibDirs[] = { "/lib32", "/lib" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1381
   static const char *const X86Triples[] = {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1382
     "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu", "i386-linux-gnu",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1383
     "i386-redhat-linux6E", "i686-redhat-linux", "i586-redhat-linux",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1384
     "i386-redhat-linux", "i586-suse-linux", "i486-slackware-linux",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1385
-    "i686-montavista-linux", "i686-linux-android", "i586-linux-gnu"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1386
+    "i686-montavista-linux", "i686-linux-android", "i586-linux-gnu",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1387
+    "i386-pc-solaris2.11", "i386-pc-solaris2.12", "i386-pc-solaris2.13"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1388
   };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1389
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1390
   static const char *const MIPSLibDirs[] = { "/lib" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1391
@@ -1358,10 +1382,18 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1392
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1393
   static const char *const SPARCv8LibDirs[] = { "/lib32", "/lib" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1394
   static const char *const SPARCv8Triples[] = { "sparc-linux-gnu",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1395
-                                                "sparcv8-linux-gnu" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1396
-  static const char *const SPARCv9LibDirs[] = { "/lib64", "/lib" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1397
+                                                "sparcv8-linux-gnu",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1398
+                                                "sparc-sun-solaris2.11",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1399
+                                                "sparc-sun-solaris2.12",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1400
+                                                "sparc-sun-solaris2.13" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1401
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1402
+  static const char *const SPARCv9LibDirs[] = { "/lib64", "/lib/sparcv9",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1403
+    "/lib/64", "/lib" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1404
   static const char *const SPARCv9Triples[] = { "sparc64-linux-gnu",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1405
-                                                "sparcv9-linux-gnu" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1406
+                                                "sparcv9-linux-gnu",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1407
+                                                "sparcv9-sun-solaris2.11",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1408
+                                                "sparcv9-sun-solaris2.12",
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1409
+                                                "sparcv9-sun-solaris2.13" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1410
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1411
   static const char *const SystemZLibDirs[] = { "/lib64", "/lib" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1412
   static const char *const SystemZTriples[] = {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1413
@@ -2649,16 +2681,703 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1414
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1415
 /// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1416
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1417
+const char *Solaris::MediatedGCCToolChainPath =
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1418
+"/path/to/mediated/gcc/toolchain";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1419
+const bool Solaris::SupportsClangLibCPlusPlus = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1420
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1421
 Solaris::Solaris(const Driver &D, const llvm::Triple& Triple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1422
-                 const ArgList &Args)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1423
-  : Generic_GCC(D, Triple, Args) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1424
+                 const llvm::opt::ArgList &Args)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1425
+  : Generic_ELF(D, Triple, Args),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1426
+  UseGnuAs(true),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1427
+  UseGnuLd(false),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1428
+  UseGoldLd(false),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1429
+  UseSunLd(true),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1430
+  UseMediatedGCCToolChainPath(false),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1431
+  UseSpecifiedGCCToolChainPath(false),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1432
+  IsValid(false),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1433
+  GCCInstallDir("/usr/gcc/"),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1434
+  GCCMajorMinor(""),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1435
+  GCCMajorMinorMicro(""),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1436
+  GCCInternalLibDir(""),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1437
+  GCCInternalMultiLibDir(""),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1438
+  GCCIncludeDirs(),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1439
+  Assembler("/usr/gnu/bin/as"),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1440
+  Linker("/usr/bin/ld"),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1441
+  mtune(""),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1442
+  march(""),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1443
+  mcpu(""),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1444
+  ExtraOpts() {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1445
+    if (Arg *A = Args.getLastArg(options::OPT_gcc_toolchain)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1446
+      GCCInstallDir = A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1447
+      if (!llvm::sys::fs::exists(GCCInstallDir))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1448
+        D.Diag(diag::err_drv_no_such_file) << GCCInstallDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1449
+      else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1450
+        findSpecifiedGCCToolchain(GCCInstallDir.c_str(), Triple, Args);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1451
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1452
-  getProgramPaths().push_back(getDriver().getInstalledDir());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1453
+        if (!UseSpecifiedGCCToolChainPath) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1454
+          D.Diag(diag::err_drv_unsupported_rtlib_for_platform)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1455
+            << GCCInstallDir << Triple.getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1456
+        } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1457
+          findGCCIncludeDirs(Triple, Args);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1458
+          findGCCInternalLibDir(Triple, Args);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1459
+        }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1460
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1461
+    } else if (llvm::sys::fs::exists(Solaris::MediatedGCCToolChainPath)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1462
+      GCCInstallDir = Solaris::MediatedGCCToolChainPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1463
+      UseMediatedGCCToolChainPath = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1464
+    } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1465
+      findGCCMajorMinor();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1466
+      findGCCMajorMinorMicro(Triple);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1467
+      findGCCIncludeDirs(Triple, Args);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1468
+      findGCCInternalLibDir(Triple, Args);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1469
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1470
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1471
+    if (Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1472
+      Linker = A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1473
+      if (Linker == "bfd")
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1474
+        Linker = "/usr/gnu/bin/ld";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1475
+      else if (Linker == "gold")
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1476
+        Linker = "/usr/gnu/bin/ld.gold";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1477
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1478
+      if ((Linker == "/usr/gnu/bin/ld") || (Linker == "/usr/gnu/bin/ld.bfd") ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1479
+          (Linker == "/usr/bin/gld") || (Linker == "/usr/bin/gld.bfd")) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1480
+        UseGnuLd = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1481
+        UseGoldLd = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1482
+        UseSunLd = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1483
+      } else if ((Linker == "/usr/gnu/bin/ld.gold") ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1484
+                 (Linker == "/usr/bin/gld.gold") ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1485
+                 (Linker == "/usr/bin/ld.gold")) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1486
+        UseGnuLd = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1487
+        UseSunLd = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1488
+        UseGoldLd = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1489
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1490
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1491
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1492
+    if (Arg *A = Args.getLastArg(options::OPT_fuse_as_EQ)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1493
+      Assembler = A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1494
+      if (Assembler == "llvm")
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1495
+        UseGnuAs = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1496
+      else if ((Assembler == "/usr/gnu/bin/as") ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1497
+               (Assembler == "/usr/bin/gas"))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1498
+        UseGnuAs = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1499
+      else if (Assembler == "gas") {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1500
+        Assembler = "/usr/gnu/bin/as";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1501
+        UseGnuAs = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1502
+      } else if ((Assembler == "/usr/bin/as") || (Assembler == "sun") ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1503
+                 (Assembler == "solaris"))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1504
+        D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1505
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1506
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1507
+    getProgramPaths().push_back(GCCInstallDir);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1508
   if (getDriver().getInstalledDir() != getDriver().Dir)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1509
     getProgramPaths().push_back(getDriver().Dir);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1510
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1511
+    llvm::Triple::ArchType Arch = Triple.getArch();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1512
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1513
+    switch (Arch) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1514
+    case llvm::Triple::x86:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1515
+      getFilePaths().push_back(getDriver().Dir + "/../lib");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1516
+      getFilePaths().push_back("/usr/lib");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1517
+      march = mtune = "i686";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1518
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1519
+    case llvm::Triple::sparc:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1520
+      getFilePaths().push_back(getDriver().Dir + "/../lib");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1521
+      getFilePaths().push_back("/usr/lib");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1522
+      mcpu = "ultrasparc";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1523
+      mtune = "ultrasparc";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1524
+      march = "v8plusa";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1525
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1526
+    case llvm::Triple::x86_64:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1527
+      getFilePaths().push_back(getDriver().Dir + "/../lib/amd64");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1528
+      getFilePaths().push_back("/usr/lib/amd64");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1529
+      march = mtune = "opteron";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1530
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1531
+    case llvm::Triple::sparcv9:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1532
+      getFilePaths().push_back(getDriver().Dir + "/../lib/sparcv9");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1533
+      getFilePaths().push_back("/usr/lib/sparcv9");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1534
+      mcpu = "ultrasparc";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1535
+      mtune = "ultrasparc";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1536
+      march = "v9a";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1537
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1538
+    default:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1539
   getFilePaths().push_back(getDriver().Dir + "/../lib");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1540
   getFilePaths().push_back("/usr/lib");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1541
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1542
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1543
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1544
+    validate();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1545
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1546
+    if (Args.hasArg(options::OPT_v))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1547
+      this->print(llvm::errs());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1548
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1549
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1550
+std::string Solaris::computeSysRoot() const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1551
+  if (!getDriver().SysRoot.empty())
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1552
+    return getDriver().SysRoot;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1553
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1554
+  return std::string("/");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1555
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1556
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1557
+bool Solaris::addLibStdCXXIncludePaths(Twine Base, Twine Suffix,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1558
+                                       StringRef GCCTriple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1559
+                                       StringRef GCCMultiarchTriple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1560
+                                       StringRef TargetMultiarchTriple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1561
+                                       Twine IncludeSuffix,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1562
+                                       const llvm::opt::ArgList &DriverArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1563
+                                       llvm::opt::ArgStringList &CC1Args) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1564
+  if (!llvm::sys::fs::exists(Base + Suffix))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1565
+        return false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1566
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1567
+  addSystemInclude(DriverArgs, CC1Args, Base);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1568
+  addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1569
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1570
+  if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1571
+      llvm::sys::fs::exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1572
+    addSystemInclude(DriverArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1573
+                     CC1Args, Base + Suffix + "/" + GCCTriple + IncludeSuffix);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1574
+  } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1575
+    addSystemInclude(DriverArgs, CC1Args,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1576
+                     Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1577
+    addSystemInclude(DriverArgs, CC1Args,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1578
+                     Base + "/" + TargetMultiarchTriple + Suffix);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1579
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1580
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1581
+  addSystemInclude(DriverArgs, CC1Args, Base + "/backward");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1582
+  addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1583
+  return true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1584
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1585
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1586
+void Solaris::AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1587
+                                           llvm::opt::ArgStringList &CC1Args) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1588
+  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1589
+      DriverArgs.hasArg(options::OPT_nostdincxx))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1590
+    return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1591
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1592
+  const Driver &D = getDriver();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1593
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1594
+  // Check for Clang libc++
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1595
+  if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1596
+    if (!Solaris::SupportsClangLibCPlusPlus) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1597
+      D.Diag(diag::err_drv_invalid_stdlib_name) << "libc++";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1598
+      return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1599
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1600
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1601
+    StringRef IncludePath = "/usr/include/libc++/v1";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1602
+    if (!llvm::sys::fs::exists(IncludePath)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1603
+      D.Diag(diag::err_drv_no_such_file) << IncludePath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1604
+      return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1605
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1606
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1607
+    addSystemInclude(DriverArgs, CC1Args, IncludePath);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1608
+    return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1609
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1610
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1611
+  for (std::vector<std::string>::const_iterator B =
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1612
+      getGCCIncludeDirs().begin(), E = getGCCIncludeDirs().end();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1613
+      B != E; ++B) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1614
+    llvm::Twine IncludePath((*B));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1615
+    addSystemInclude(DriverArgs, CC1Args, IncludePath);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1616
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1617
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1618
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1619
+void Solaris::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1620
+                                        ArgStringList &CC1Args) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1621
+  const Driver &D = getDriver();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1622
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1623
+  if (DriverArgs.hasArg(options::OPT_nostdinc))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1624
+    return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1625
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1626
+  std::string SysRoot = computeSysRoot();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1627
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1628
+  if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1629
+    SmallString<PATH_MAX> P(D.ResourceDir);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1630
+    llvm::sys::path::append(P, "/include");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1631
+    addSystemInclude(DriverArgs, CC1Args, P.str());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1632
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1633
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1634
+  if (DriverArgs.hasArg(options::OPT_nostdlibinc))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1635
+    return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1636
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1637
+  StringRef CIncludeDirs(C_INCLUDE_DIRS);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1638
+  if (CIncludeDirs != "") {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1639
+    SmallVector<StringRef, 5> dirs;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1640
+    CIncludeDirs.split(dirs, ":");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1641
+    for (SmallVectorImpl<StringRef>::iterator I = dirs.begin(), E = dirs.end();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1642
+         I != E; ++I) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1643
+      StringRef Prefix =
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1644
+        llvm::sys::path::is_absolute(*I) ? StringRef(SysRoot) : "";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1645
+      addExternCSystemInclude(DriverArgs, CC1Args, Prefix + *I);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1646
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1647
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1648
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1649
+  addExternCSystemInclude(DriverArgs, CC1Args, "/usr/include");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1650
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1651
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1652
+void Solaris::addClangTargetOptions(const ArgList &DriverArgs,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1653
+                                    ArgStringList &CC1Args) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1654
+  const llvm::Triple& TT = getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1655
+  llvm::Triple::ArchType Arch = TT.getArch();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1656
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1657
+  if (Arg *A = DriverArgs.getLastArg(options::OPT_mtune_EQ)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1658
+    StringRef V = A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1659
+    if (!V.empty())
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1660
+      mtune = V.str();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1661
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1662
+    // FIXME: Impplement SPARC target features.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1663
+    CC1Args.push_back(DriverArgs.MakeArgString("-target-feature"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1664
+    if (Arch == llvm::Triple::sparc || Arch == llvm::Triple::sparcv9) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1665
+      std::string S = "mtune=";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1666
+      S += mtune;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1667
+      CC1Args.push_back(DriverArgs.MakeArgString(S.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1668
+    } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1669
+      CC1Args.push_back(DriverArgs.MakeArgString(mtune.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1670
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1671
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1672
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1673
+  if (Arg *A = DriverArgs.getLastArg(options::OPT_march_EQ)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1674
+    StringRef V = A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1675
+    if (!V.empty())
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1676
+      march = V.str();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1677
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1678
+    CC1Args.push_back(DriverArgs.MakeArgString("-target-feature"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1679
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1680
+    if ((Arch == llvm::Triple::sparc) || (Arch == llvm::Triple::sparcv9)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1681
+      std::string S = "march=";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1682
+      S += mtune;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1683
+      CC1Args.push_back(DriverArgs.MakeArgString(S.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1684
+    } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1685
+      CC1Args.push_back(DriverArgs.MakeArgString(march.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1686
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1687
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1688
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1689
+  if (Arch == llvm::Triple::sparc || Arch == llvm::Triple::sparcv9) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1690
+    if (Arg *A = DriverArgs.getLastArg(options::OPT_mcpu_EQ)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1691
+      StringRef V = A->getValue();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1692
+      if (!V.empty())
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1693
+        mcpu = V.str();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1694
+      else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1695
+        mcpu = "ultrasparc";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1696
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1697
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1698
+    CC1Args.push_back(DriverArgs.MakeArgString("-target-feature"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1699
+    std::string S = "mcpu=";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1700
+    S += mcpu;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1701
+    CC1Args.push_back(DriverArgs.MakeArgString(S.c_str()));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1702
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1703
+    if (Arg *A = DriverArgs.getLastArg(options::OPT_mvis)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1704
+      CC1Args.push_back(DriverArgs.MakeArgString("-target-feature"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1705
+      CC1Args.push_back(DriverArgs.MakeArgString("vis"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1706
+    } else if (Arg *A = DriverArgs.getLastArg(options::OPT_mvis2)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1707
+      CC1Args.push_back(DriverArgs.MakeArgString("-target-feature"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1708
+      CC1Args.push_back(DriverArgs.MakeArgString("vis2"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1709
+    } else if (Arg *A = DriverArgs.getLastArg(options::OPT_mvis3)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1710
+      CC1Args.push_back(DriverArgs.MakeArgString("-target-feature"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1711
+      CC1Args.push_back(DriverArgs.MakeArgString("vis3"));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1712
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1713
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1714
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1715
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1716
+void Solaris::findGCCMajorMinor() const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1717
+  // FIXME: Add 5.2 after testing the ABI.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1718
+  static const char* const GCCMM[] = { "4.8", "4.9" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1719
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1720
+  const char* P;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1721
+  std::string Path;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1722
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1723
+  if (UseMediatedGCCToolChainPath) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1724
+    // FIXME: IMPLEMENT.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1725
+    // Needs spec.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1726
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1727
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1728
+  Path.reserve(std::string::size_type(PATH_MAX));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1729
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1730
+  for (int I = (llvm::array_lengthof(GCCMM) - 1); I >= 0; --I) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1731
+    if ((P = GCCMM[I]) != NULL) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1732
+      Path = GCCInstallDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1733
+      Path.append(P);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1734
+      Path.append("/");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1735
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1736
+      if (llvm::sys::fs::exists(Path.c_str())) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1737
+        GCCMajorMinor = P;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1738
+        break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1739
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1740
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1741
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1742
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1743
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1744
+void Solaris::findGCCMajorMinorMicro(const llvm::Triple& T) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1745
+  // FIXME: Add 5.2.0 after testing the ABI.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1746
+  static const char* const GCCMMM[] = { "4.8.2", "4.8.5", "4.9.3" };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1747
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1748
+  const char* P;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1749
+  std::string Path;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1750
+  std::string TripleString = llvm::sys::getDefaultTargetTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1751
+  llvm::Triple::ArchType Arch = T.getArch();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1752
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1753
+  if (UseMediatedGCCToolChainPath) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1754
+    // FIXME: IMPLEMENT.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1755
+    // Needs spec.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1756
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1757
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1758
+  Path.reserve(std::string::size_type(PATH_MAX));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1759
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1760
+  for (int I = (llvm::array_lengthof(GCCMMM) - 1); I >= 0; --I) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1761
+    if ((P = GCCMMM[I]) != NULL) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1762
+      if ((P[0] == GCCMajorMinor[0]) && (P[2] == GCCMajorMinor[2])) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1763
+        Path = GCCInstallDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1764
+        Path.append("/");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1765
+        Path.append(GCCMajorMinor);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1766
+        Path.append("/lib/gcc/");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1767
+        Path.append(TripleString);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1768
+        Path.append("/");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1769
+        Path.append(P);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1770
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1771
+        if (llvm::sys::fs::exists(Path.c_str())) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1772
+          std::string Test;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1773
+          // Check if this is a real GCC installation and not just
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1774
+          // an empty directory tree
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1775
+          switch (Arch) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1776
+              case llvm::Triple::x86:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1777
+              case llvm::Triple::sparc:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1778
+                Test = Path + "/crtbegin.o";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1779
+                break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1780
+              case llvm::Triple::x86_64:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1781
+                Test = Path + "/amd64/crtbegin.o";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1782
+                break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1783
+              case llvm::Triple::sparcv9:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1784
+                Test = Path + "/sparcv9/crtbegin.o";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1785
+                break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1786
+              default:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1787
+                break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1788
+          }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1789
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1790
+          if (llvm::sys::fs::exists(Test.c_str())) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1791
+            GCCMajorMinorMicro = P;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1792
+            break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1793
+          }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1794
+        }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1795
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1796
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1797
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1798
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1799
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1800
+void Solaris::findSpecifiedGCCToolchain(const char *StartingPath,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1801
+                                        const llvm::Triple &Triple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1802
+                                        const llvm::opt::ArgList &Args) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1803
+  DIR *TopLD = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1804
+  DIR *LibLD = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1805
+  DIR *GccLD = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1806
+  DIR *TripleLD = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1807
+  struct dirent *TopDE = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1808
+  struct dirent *LibDE = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1809
+  struct dirent *GccDE = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1810
+  struct dirent *TripleDE = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1811
+  std::string LibDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1812
+  std::string GccDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1813
+  std::string TripleDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1814
+  std::string TripleVersionDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1815
+  const char *DName;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1816
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1817
+  assert(StartingPath && "Invalid GCC Toolchain starting search path!");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1818
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1819
+  GCCMajorMinor = "";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1820
+  GCCMajorMinorMicro = "";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1821
+  UseSpecifiedGCCToolChainPath = false;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1822
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1823
+  LibDir.reserve(std::string::size_type(PATH_MAX));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1824
+  GccDir.reserve(std::string::size_type(PATH_MAX));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1825
+  TripleDir.reserve(std::string::size_type(PATH_MAX));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1826
+  TripleVersionDir.reserve(std::string::size_type(PATH_MAX));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1827
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1828
+  if (llvm::sys::fs::exists(StartingPath) &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1829
+      llvm::sys::fs::is_directory(StartingPath)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1830
+    TopLD = opendir(StartingPath);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1831
+    assert(TopLD && "Cannot obtain a valid toplevel DIR handle!");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1832
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1833
+    while ((TopDE = readdir(TopLD)) != NULL) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1834
+      if (TopDE->d_name[0] == '.')
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1835
+        continue;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1836
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1837
+      DName = reinterpret_cast<const char*>(&TopDE->d_name[0]);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1838
+      if (std::strcmp(DName, "lib") == 0) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1839
+        LibDir = StartingPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1840
+        LibDir.append("/");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1841
+        LibDir.append(DName);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1842
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1843
+        if (!llvm::sys::fs::is_directory(LibDir.c_str()))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1844
+          continue;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1845
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1846
+        LibLD = opendir(LibDir.c_str());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1847
+        assert(LibLD && "Could not obtain a valid lib DIR handle!");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1848
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1849
+        while ((LibDE = readdir(LibLD)) != NULL) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1850
+          if (LibDE->d_name[0] == '.')
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1851
+            continue;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1852
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1853
+          DName = reinterpret_cast<const char*>(&LibDE->d_name[0]);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1854
+          if (std::strcmp(DName, "gcc") == 0) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1855
+            GccDir = LibDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1856
+            GccDir.append("/");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1857
+            GccDir.append(DName);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1858
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1859
+            if (!llvm::sys::fs::is_directory(GccDir.c_str()))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1860
+              continue;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1861
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1862
+            GccLD = opendir(GccDir.c_str());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1863
+            assert(GccLD && "Could not obtain a valid gcc DIR handle!");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1864
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1865
+            while ((GccDE = readdir(GccLD)) != NULL) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1866
+              if (GccDE->d_name[0] == '.')
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1867
+                continue;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1868
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1869
+              DName = reinterpret_cast<const char*>(&GccDE->d_name[0]);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1870
+              TripleDir = GccDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1871
+              TripleDir.append("/");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1872
+              TripleDir.append(DName);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1873
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1874
+              if (!llvm::sys::fs::is_directory(TripleDir.c_str()))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1875
+                continue;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1876
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1877
+              if ((std::strncmp(DName, "sparc", 5) == 0) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1878
+                  (std::strncmp(DName, "i386", 4) == 0) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1879
+                  (std::strncmp(DName, "sparcv9", 7) == 0) ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1880
+                  (std::strncmp(DName, "x86_64", 6) == 0)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1881
+                TripleLD = opendir(TripleDir.c_str());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1882
+                assert(TripleLD &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1883
+                       "Could not obtain a valid Triple DIR handle!");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1884
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1885
+                while ((TripleDE = readdir(TripleLD)) != NULL) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1886
+                  if (TripleDE->d_name[0] == '.')
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1887
+                    continue;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1888
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1889
+                  DName = reinterpret_cast<const char*>(&TripleDE->d_name[0]);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1890
+                  TripleVersionDir = TripleDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1891
+                  TripleVersionDir.append("/");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1892
+                  TripleVersionDir.append(DName);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1893
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1894
+                  if (!llvm::sys::fs::is_directory(TripleVersionDir.c_str()))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1895
+                    continue;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1896
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1897
+                  if ((std::isdigit(DName[0])) && (DName[1] == '.') &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1898
+                      (std::isdigit(DName[2])) && (DName[3] == '.') &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1899
+                      (std::isdigit(DName[4])) && (DName[5] == '\0')) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1900
+                    GCCMajorMinorMicro = DName;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1901
+                    GCCMajorMinor = GCCMajorMinorMicro.substr(0, 3);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1902
+                    UseSpecifiedGCCToolChainPath = true;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1903
+                    goto done;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1904
+                  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1905
+                }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1906
+              }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1907
+            }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1908
+          }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1909
+        }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1910
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1911
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1912
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1913
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1914
+done:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1915
+  if (TripleLD) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1916
+    rewinddir(TripleLD);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1917
+    closedir(TripleLD);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1918
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1919
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1920
+  if (GccLD) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1921
+    rewinddir(GccLD);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1922
+    closedir(GccLD);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1923
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1924
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1925
+  if (LibLD) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1926
+    rewinddir(LibLD);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1927
+    closedir(LibLD);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1928
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1929
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1930
+  if (TopLD) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1931
+    rewinddir(TopLD);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1932
+    closedir(TopLD);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1933
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1934
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1935
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1936
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1937
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1938
+void Solaris::findGCCIncludeDirs(const llvm::Triple &Triple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1939
+                                 const llvm::opt::ArgList &Args) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1940
+  std::string GCCInstallPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1941
+  if (UseSpecifiedGCCToolChainPath)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1942
+    GCCInstallPath = GCCInstallDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1943
+  else if (UseMediatedGCCToolChainPath)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1944
+    GCCInstallPath = Solaris::MediatedGCCToolChainPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1945
+  else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1946
+    GCCInstallPath = GCCInstallDir + GCCMajorMinor;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1947
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1948
+  std::string GCCIncludeDir =
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1949
+    GCCInstallPath + "/include/c++/" + GCCMajorMinorMicro;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1950
+  GCCIncludeDirs.push_back(GCCIncludeDir);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1951
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1952
+  llvm::Triple::ArchType Arch = Triple.getArch();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1953
+  GCCIncludeDir += "/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1954
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1955
+  switch (Arch) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1956
+    case llvm::Triple::x86:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1957
+      GCCIncludeDir += Triple.getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1958
+      if (Arg *A = Args.getLastArg(options::OPT_m64))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1959
+        GCCIncludeDir += "/amd64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1960
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1961
+    case llvm::Triple::sparc:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1962
+      GCCIncludeDir += Triple.getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1963
+      if (Arg *A = Args.getLastArg(options::OPT_m64))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1964
+        GCCIncludeDir += "/sparcv9";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1965
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1966
+    case llvm::Triple::x86_64:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1967
+      GCCIncludeDir += "i386-pc-";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1968
+      GCCIncludeDir += Triple.getOSName();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1969
+      if (Arg *A = Args.getLastArg(options::OPT_m64))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1970
+        GCCIncludeDir += "/amd64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1971
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1972
+    case llvm::Triple::sparcv9:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1973
+      GCCIncludeDir += "sparc-sun-";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1974
+      GCCIncludeDir += Triple.getOSName();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1975
+      if (Arg *A = Args.getLastArg(options::OPT_m64))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1976
+        GCCIncludeDir += "/sparcv9";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1977
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1978
+    default:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1979
+      getDriver().Diag(diag::err_target_unsupported_arch)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1980
+        << Triple.getArchName() << Triple.getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1981
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1982
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1983
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1984
+  GCCIncludeDirs.push_back(GCCIncludeDir);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1985
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1986
+  GCCIncludeDir = GCCInstallPath + "/include/c++/" +
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1987
+    GCCMajorMinorMicro + "/backward";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1988
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1989
+  GCCIncludeDirs.push_back(GCCIncludeDir);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1990
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1991
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1992
+void Solaris::findGCCInternalLibDir(const llvm::Triple &Triple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1993
+                                    const llvm::opt::ArgList &Args) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1994
+  std::string GCCInstallPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1995
+  if (UseSpecifiedGCCToolChainPath)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1996
+    GCCInstallPath = GCCInstallDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1997
+  else if (UseMediatedGCCToolChainPath)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1998
+    GCCInstallPath = Solaris::MediatedGCCToolChainPath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  1999
+  else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2000
+    GCCInstallPath = GCCInstallDir + GCCMajorMinor;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2001
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2002
+  GCCInternalLibDir = GCCInstallPath + "/lib/gcc/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2003
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2004
+  llvm::Triple::ArchType Arch = Triple.getArch();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2005
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2006
+  switch (Arch) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2007
+    case llvm::Triple::x86:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2008
+      GCCInternalLibDir += Triple.getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2009
+      GCCInternalLibDir += "/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2010
+      GCCInternalLibDir += GCCMajorMinorMicro;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2011
+      if (Arg *A = Args.getLastArg(options::OPT_m64)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2012
+        GCCInternalMultiLibDir = GCCInternalLibDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2013
+        GCCInternalLibDir += "/amd64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2014
+      } else if (Arg *A = Args.getLastArg(options::OPT_m32)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2015
+        GCCInternalMultiLibDir = GCCInternalLibDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2016
+        GCCInternalMultiLibDir += "/amd64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2017
+      } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2018
+        GCCInternalMultiLibDir = GCCInternalLibDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2019
+        GCCInternalMultiLibDir += "/amd64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2020
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2021
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2022
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2023
+    case llvm::Triple::sparc:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2024
+      GCCInternalLibDir += Triple.getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2025
+      GCCInternalLibDir += "/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2026
+      GCCInternalLibDir += GCCMajorMinorMicro;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2027
+      if (Arg *A = Args.getLastArg(options::OPT_m64)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2028
+        GCCInternalMultiLibDir = GCCInternalLibDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2029
+        GCCInternalLibDir += "/sparcv9";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2030
+      } else if (Arg *A = Args.getLastArg(options::OPT_m32)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2031
+        GCCInternalMultiLibDir = GCCInternalLibDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2032
+        GCCInternalMultiLibDir += "/sparcv9";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2033
+      } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2034
+        GCCInternalMultiLibDir = GCCInternalLibDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2035
+        GCCInternalMultiLibDir += "/sparcv9";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2036
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2037
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2038
+    case llvm::Triple::x86_64:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2039
+      GCCInternalLibDir += "i386-pc-";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2040
+      GCCInternalLibDir += Triple.getOSName();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2041
+      GCCInternalLibDir += "/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2042
+      GCCInternalLibDir += GCCMajorMinorMicro;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2043
+      GCCInternalMultiLibDir = GCCInternalLibDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2044
+      if (Arg *A = Args.getLastArg(options::OPT_m64))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2045
+        GCCInternalLibDir += "/amd64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2046
+      else if (Arg *A = Args.getLastArg(options::OPT_m32))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2047
+        GCCInternalMultiLibDir += "/amd64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2048
+      else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2049
+        GCCInternalLibDir += "/amd64";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2050
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2051
+    case llvm::Triple::sparcv9:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2052
+      GCCInternalLibDir += "sparc-sun-";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2053
+      GCCInternalLibDir += Triple.getOSName();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2054
+      GCCInternalLibDir += "/";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2055
+      GCCInternalLibDir += GCCMajorMinorMicro;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2056
+      GCCInternalMultiLibDir = GCCInternalLibDir;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2057
+      if (Arg *A = Args.getLastArg(options::OPT_m64))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2058
+        GCCInternalLibDir += "/sparcv9";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2059
+      else if (Arg *A = Args.getLastArg(options::OPT_m32))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2060
+        GCCInternalMultiLibDir += "/sparcv9";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2061
+      else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2062
+        GCCInternalLibDir += "/sparcv9";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2063
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2064
+    default:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2065
+      getDriver().Diag(diag::err_target_unsupported_arch)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2066
+        << Triple.getArchName() << Triple.getTriple();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2067
+      break;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2068
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2069
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2070
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2071
+void Solaris::print(raw_ostream &OS) const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2072
+  OS << "UseGnuAs: " << (UseGnuAs ? "true" : "false") << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2073
+  OS << "UseGnuLd: " << (UseGnuLd ? "true" : "false") << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2074
+  OS << "UseGoldLd: " << (UseGoldLd ? "true" : "false") << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2075
+  OS << "UseSunLd: " << (UseSunLd ? "true" : "false") << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2076
+  OS << "UseMediatedGCCToolChainPath: "
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2077
+    << (UseMediatedGCCToolChainPath ? "true" : "false") << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2078
+  OS << "UseSpecifiedGCCToolChainPath: "
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2079
+    << (UseSpecifiedGCCToolChainPath ? "true" : "false") << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2080
+  OS << "GCCInstallDir: " << GCCInstallDir.c_str() << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2081
+  OS << "GCCMajorMinor: " << GCCMajorMinor.c_str() << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2082
+  OS << "GCCMajorMinorMicro: " << GCCMajorMinorMicro.c_str() << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2083
+  OS << "GCCInternalLibDir: " << GCCInternalLibDir.c_str() << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2084
+  OS << "GCCInternalMultiLibDir: " << GCCInternalMultiLibDir.c_str() << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2085
+  OS << "MediatedGCCToolChainPath: " << MediatedGCCToolChainPath << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2086
+  OS << "GCCIncludeDirs: ";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2087
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2088
+  if (GCCIncludeDirs.size()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2089
+    std::string IncludePath;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2090
+    for (std::vector<std::string>::const_iterator B = GCCIncludeDirs.begin(),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2091
+        E = GCCIncludeDirs.end(); B != E; ++B) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2092
+      IncludePath = "-I";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2093
+      IncludePath += (*B);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2094
+      OS << IncludePath.c_str() << " ";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2095
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2096
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2097
+    OS << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2098
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2099
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2100
+  OS << "Assembler: " << Assembler.c_str() << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2101
+  OS << "Linker: " << Linker.c_str() << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2102
+  OS << "mtune: " << mtune.c_str() << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2103
+  OS << "march: " << march.c_str() << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2104
+  OS << "mcpu: " << mcpu.c_str() << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2105
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2106
+  if (ExtraOpts.size()) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2107
+    OS << "ExtraOpts: ";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2108
+    for (std::vector<std::string>::const_iterator B = ExtraOpts.begin(),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2109
+        E = ExtraOpts.end(); B != E; ++B) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2110
+      OS << (*B).c_str() << " ";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2111
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2112
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2113
+    OS << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2114
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2115
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2116
+  OS << "Valid: " << (IsValid ? "true" : "false") << "\n";
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2117
 }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2118
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2119
 Tool *Solaris::buildAssembler() const {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2120
@@ -2669,6 +3388,21 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2121
   return new tools::solaris::Link(*this);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2122
 }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2123
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2124
+void Solaris::validate() {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2125
+  IsValid = llvm::sys::fs::exists(GCCInstallDir.c_str());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2126
+  if (!IsValid) return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2127
+  IsValid = llvm::sys::fs::exists(GCCInternalLibDir.c_str());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2128
+  if (!IsValid) return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2129
+  IsValid = llvm::sys::fs::exists(GCCInternalMultiLibDir.c_str());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2130
+  if (!IsValid) return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2131
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2132
+  for (std::vector<std::string>::const_iterator B = GCCIncludeDirs.begin(),
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2133
+      E = GCCIncludeDirs.end(); B != E; ++B) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2134
+    IsValid = llvm::sys::fs::exists((*B).c_str());
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2135
+    if (!IsValid) return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2136
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2137
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2138
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2139
 /// Distribution (very bare-bones at the moment).
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2140
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2141
 enum Distro {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2142
@@ -2696,6 +3430,27 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2143
   UbuntuRaring,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2144
   UbuntuSaucy,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2145
   UbuntuTrusty,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2146
+  Solaris_11,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2147
+  Solaris_11_1,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2148
+  Solaris_11_2,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2149
+  Solaris_11_3,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2150
+  Solaris_11_4,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2151
+  Solaris_11_5,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2152
+  Solaris_11_6,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2153
+  Solaris_11_7,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2154
+  Solaris_11_8,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2155
+  Solaris_11_9,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2156
+  Solaris_12,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2157
+  Solaris_12_1,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2158
+  Solaris_12_2,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2159
+  Solaris_12_3,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2160
+  Solaris_12_4,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2161
+  Solaris_12_5,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2162
+  Solaris_12_6,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2163
+  Solaris_12_7,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2164
+  Solaris_12_8,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2165
+  Solaris_12_9,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2166
+  Solaris_13,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2167
   UnknownDistro
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2168
 };
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2169
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2170
@@ -2715,6 +3470,10 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2171
   return Distro >= UbuntuHardy && Distro <= UbuntuTrusty;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2172
 }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2173
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2174
+static bool IsSolaris(enum Distro Distro) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2175
+  return Distro >= Solaris_11 && Distro <= Solaris_13;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2176
+}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2177
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2178
 static Distro DetectDistro(llvm::Triple::ArchType Arch) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2179
   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2180
       llvm::MemoryBuffer::getFile("/etc/lsb-release");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2181
@@ -2774,6 +3533,59 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2182
     return UnknownDistro;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2183
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2184
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2185
+  File = llvm::MemoryBuffer::getFile("/etc/release");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2186
+  if (File) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2187
+    StringRef Data = File.get()->getBuffer();
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2188
+    SmallVector<StringRef, 8> Lines;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2189
+    Data.split(Lines, "\n");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2190
+    for (unsigned I = 0, S = Lines.size(); I != S; ++I) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2191
+      if (Lines[I].find("Oracle Solaris") != std::string::npos) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2192
+        if (Lines[I].find("Solaris 11.0") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2193
+          return Solaris_11;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2194
+        else if (Lines[I].find("Solaris 11.1") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2195
+          return Solaris_11_1;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2196
+        else if (Lines[I].find("Solaris 11.2") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2197
+          return Solaris_11_2;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2198
+        else if (Lines[I].find("Solaris 11.3") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2199
+          return Solaris_11_3;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2200
+        else if (Lines[I].find("Solaris 11.4") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2201
+          return Solaris_11_4;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2202
+        else if (Lines[I].find("Solaris 11.5") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2203
+          return Solaris_11_5;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2204
+        else if (Lines[I].find("Solaris 11.6") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2205
+          return Solaris_11_6;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2206
+        else if (Lines[I].find("Solaris 11.7") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2207
+          return Solaris_11_7;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2208
+        else if (Lines[I].find("Solaris 11.8") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2209
+          return Solaris_11_8;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2210
+        else if (Lines[I].find("Solaris 11.9") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2211
+          return Solaris_11_9;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2212
+        else if (Lines[I].find("Solaris 12.0") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2213
+          return Solaris_12;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2214
+        else if (Lines[I].find("Solaris 12.1") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2215
+          return Solaris_12_1;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2216
+        else if (Lines[I].find("Solaris 12.2") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2217
+          return Solaris_12_2;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2218
+        else if (Lines[I].find("Solaris 12.3") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2219
+          return Solaris_12_3;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2220
+        else if (Lines[I].find("Solaris 12.4") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2221
+          return Solaris_12_4;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2222
+        else if (Lines[I].find("Solaris 12.5") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2223
+          return Solaris_12_5;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2224
+        else if (Lines[I].find("Solaris 12.6") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2225
+          return Solaris_12_6;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2226
+        else if (Lines[I].find("Solaris 12.7") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2227
+          return Solaris_12_7;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2228
+        else if (Lines[I].find("Solaris 12.8") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2229
+          return Solaris_12_8;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2230
+        else if (Lines[I].find("Solaris 12.9") != std::string::npos)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2231
+          return Solaris_12_9;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2232
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2233
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2234
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2235
+    return UnknownDistro;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2236
+  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2237
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2238
   if (llvm::sys::fs::exists("/etc/SuSE-release"))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2239
     return OpenSUSE;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2240
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2241
--- tools/llvm-shlib/Makefile	Sat Jul 18 11:44:45 2015
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2242
+++ tools/llvm-shlib/Makefile	Thu Aug 20 23:40:28 2015
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2243
@@ -74,6 +74,7 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2244
     LLVMLibsOptions := -Wl,-z -Wl,rescan -Wl,-z -Wl,allextract $(LLVMLibsOptions)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2245
     LLVMLibsOptions += -Wl,-h -Wl,lib$(LIBRARYNAME)$(SHLIBEXT)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2246
     LLVMLibsOptions += -Wl,-z -Wl,defaultextract -Wl,-z -Wl,defs
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2247
+    LLVMLibsOptions += -lkstat
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2248
 endif
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2249
 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2250
 ifeq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2251
--- tools/clang/lib/Basic/Targets.cpp	2015-08-26 11:44:48.659904739 -0700
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2252
+++ tools/clang/lib/Basic/Targets.cpp	2015-08-26 11:47:36.318310023 -0700
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2253
@@ -530,28 +530,60 @@
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2254
 template<typename Target>
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2255
 class SolarisTargetInfo : public OSTargetInfo<Target> {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2256
 protected:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2257
-  void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2258
+  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2259
                     MacroBuilder &Builder) const override {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2260
     DefineStd(Builder, "sun", Opts);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2261
     DefineStd(Builder, "unix", Opts);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2262
     Builder.defineMacro("__ELF__");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2263
     Builder.defineMacro("__svr4__");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2264
     Builder.defineMacro("__SVR4");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2265
-    // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2266
-    // newer, but to 500 for everything else.  feature_test.h has a check to
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2267
-    // ensure that you are not using C99 with an old version of X/Open or C89
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2268
-    // with a new version.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2269
-    if (Opts.C99)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2270
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2271
+    if (Opts.C99 || Opts.CPlusPlus11) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2272
+      if (Opts.C99) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2273
       Builder.defineMacro("_XOPEN_SOURCE", "600");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2274
-    else
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2275
+        Builder.defineMacro("_XPG6", "1");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2276
+      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2277
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2278
+      Builder.defineMacro("__STDC_VERSION__", "199901L");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2279
+      Builder.defineMacro("_STDC_C99", "1");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2280
+      Builder.defineMacro("__C99FEATURES__", "1");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2281
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2282
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2283
+    if (Opts.CPlusPlus11)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2284
+      Builder.defineMacro("__cplusplus", "201103L");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2285
+    else if (Opts.CPlusPlus14)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2286
+      Builder.defineMacro("__cplusplus", "201402L");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2287
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2288
+    if (Opts.CPlusPlus11) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2289
+      Builder.defineMacro("_STDC_C11", "1");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2290
+      Builder.defineMacro("_STDC_C11_BCI", "1");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2291
+      Builder.defineMacro("__XPG7_THREAD_MODEL__", "1");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2292
+      Builder.defineMacro("_XPG7", "1");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2293
+      Builder.defineMacro("_XOPEN_SOURCE", "700");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2294
+    } else if (Opts.C11 || Opts.CPlusPlus14) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2295
+      Builder.defineMacro("__STDC_VERSION__", "201112L");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2296
+      Builder.defineMacro("_STDC_C11", "1");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2297
+      Builder.defineMacro("_STDC_C11_BCI", "1");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2298
+      Builder.defineMacro("__XPG7_THREAD_MODEL__", "1");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2299
+      Builder.defineMacro("_XPG7", "1");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2300
+      Builder.defineMacro("_XOPEN_SOURCE", "700");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2301
+    } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2302
       Builder.defineMacro("_XOPEN_SOURCE", "500");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2303
-    if (Opts.CPlusPlus)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2304
-      Builder.defineMacro("__C99FEATURES__");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2305
+      Builder.defineMacro("__STDC_VERSION__", "199409L");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2306
+      if (Opts.CPlusPlus && !Opts.CPlusPlus11 && !Opts.CPlusPlus14)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2307
+        Builder.defineMacro("__cplusplus", "199711L");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2308
+    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2309
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2310
+    if ((Triple.getArchName() == "i386") || (Triple.getArchName() == "sparc"))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2311
     Builder.defineMacro("_LARGEFILE_SOURCE");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2312
+    else if ((Triple.getArchName() == "x86_64") ||
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2313
+             (Triple.getArchName() == "sparcv9"))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2314
     Builder.defineMacro("_LARGEFILE64_SOURCE");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2315
-    Builder.defineMacro("__EXTENSIONS__");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2316
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2317
+    Builder.defineMacro("__EXTENSIONS__", "1");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2318
     Builder.defineMacro("_REENTRANT");
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2319
   }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2320
+
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2321
 public:
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2322
   SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
  2323
     this->UserLabelPrefix = "";