components/llvm/patches/014-clang-gcc-toolchain.patch
author Stefan Teleman <stefan.teleman@oracle.com>
Wed, 10 Feb 2016 11:54:12 -0800
changeset 5434 9f55c805ce9d
permissions -rw-r--r--
PSARC/2013/188 Clang/LLVM 15777690 clang/llvm compiler infrastructure in Solaris 21851513 severe memory corruption in the LLVM command-line parsing module 22031298 toxic bugs in LLVM ilist/plist end up eliminating entire MachineBasicBlocks 22065707 LLVM SPARC assembler generator emits wrong ELF Section flags 22346218 LLVM's assembler printer on SPARC needs a lot of work 21870061 partial template specializations in CommandLine.h are buggy 21874261 the Google Test Harness doesn't know how to count threads in Solaris 21697459 memory corruption in LLVM IR Code Generator 21341968 llc on SPARC should not need to be passed -march=sparc or -march=sparcv9 21870103 TableGen makes incorrect assumptions about anonymous namespace instantiation 21870087 naming convention for the InputFile key is inconsistent across LLVM utilities 21870099 128 bytes for a filesystem path is definitely not enough 21870067 lli makes incorrect assumptions about anonymous namespace instantiation order 21870065 llc makes incorrect assumptions about anonymous namespace instantiation order 21870283 llvm::sys::Process::GetArgumentVector should overload for std::vector 21874221 clang C++ does not properly initialize the C++ Standard Library's iostreams
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 = "";