<div dir="ltr">Not sure why arc removed some reviewers when I added the latest diff, but I've added them back.<div><br></div><div>Sorry for the noise...</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Sep 7, 2015 at 8:36 PM, don hinton <span dir="ltr"><<a href="mailto:hintonda@gmail.com" target="_blank">hintonda@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">hintonda updated this revision to Diff 34175.<br>
hintonda removed reviewers: thakis, EricWF, kubabrecka.<br>
hintonda added a comment.<br>
<br>
Removed redundant code from InitHeaderSearch.cpp, it's handled more cleanly in AddClangCXXStdlibIncludeArgs.<br>
<br>
Also, newer versions of OSX add libc++ as the default.  Perhaps this could be done in cmake, as well as passing the default path to the c++ include directory used by the version of clang used to compile clang.  This directory can be found by running xcrun -f clang and munging the path, e.g.,<br>
<br>
  LIBCXX_INCLUDE_DIR=$(dirname $(dirname $(xcrun -f clang))..)/include/c++/v1<br>
<span class=""><br>
<br>
<a href="http://reviews.llvm.org/D12646" rel="noreferrer" target="_blank">http://reviews.llvm.org/D12646</a><br>
<br>
Files:<br>
  lib/Driver/ToolChains.cpp<br>
  lib/Driver/ToolChains.h<br>
</span>  lib/Frontend/InitHeaderSearch.cpp<br>
<br>
Index: lib/Frontend/InitHeaderSearch.cpp<br>
===================================================================<br>
--- lib/Frontend/InitHeaderSearch.cpp<br>
+++ lib/Frontend/InitHeaderSearch.cpp<br>
@@ -437,22 +437,6 @@<br>
   if (Lang.CPlusPlus && HSOpts.UseStandardCXXIncludes &&<br>
       HSOpts.UseStandardSystemIncludes) {<br>
     if (HSOpts.UseLibcxx) {<br>
-      if (triple.isOSDarwin()) {<br>
-        // On Darwin, libc++ may be installed alongside the compiler in<br>
-        // include/c++/v1.<br>
-        if (!HSOpts.ResourceDir.empty()) {<br>
-          // Remove version from foo/lib/clang/version<br>
-          StringRef NoVer = llvm::sys::path::parent_path(HSOpts.ResourceDir);<br>
-          // Remove clang from foo/lib/clang<br>
-          StringRef Lib = llvm::sys::path::parent_path(NoVer);<br>
-          // Remove lib from foo/lib<br>
-          SmallString<128> P = llvm::sys::path::parent_path(Lib);<br>
-<br>
-          // Get foo/include/c++/v1<br>
-          llvm::sys::path::append(P, "include", "c++", "v1");<br>
-          AddUnmappedPath(P, CXXSystem, false);<br>
-        }<br>
-      }<br>
       // On Solaris, include the support directory for things like xlocale and<br>
       // fudged system headers.<br>
       if (triple.getOS() == llvm::Triple::Solaris)<br>
<span class="">Index: lib/Driver/ToolChains.h<br>
===================================================================<br>
--- lib/Driver/ToolChains.h<br>
+++ lib/Driver/ToolChains.h<br>
@@ -475,6 +475,9 @@<br>
<br>
   void AddLinkARCArgs(const llvm::opt::ArgList &Args,<br>
                       llvm::opt::ArgStringList &CmdArgs) const override;<br>
+<br>
+  void AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,<br>
+                                    llvm::opt::ArgStringList &CC1Args) const override;<br>
   /// }<br>
<br>
 private:<br>
Index: lib/Driver/ToolChains.cpp<br>
===================================================================<br>
--- lib/Driver/ToolChains.cpp<br>
+++ lib/Driver/ToolChains.cpp<br>
</span>@@ -264,6 +264,50 @@<br>
   CmdArgs.push_back(Args.MakeArgString(P));<br>
 }<br>
<br>
+void DarwinClang::AddClangCXXStdlibIncludeArgs(<br>
+    const llvm::opt::ArgList &DriverArgs,<br>
<span class="">+    llvm::opt::ArgStringList &CC1Args) const {<br>
+  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||<br>
+      DriverArgs.hasArg(options::OPT_nostdincxx))<br>
+    return;<br>
+<br>
+  DriverArgs.AddAllArgs(CC1Args, options::OPT_stdlib_EQ);<br>
+<br>
+  // Check if libc++ has been enabled and provide its include paths if so.<br>
+  if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {<br>
+    const std::string LibCXXIncludePathCandidates[] = {<br>
+      // The primary location is within the Clang installation.<br>
+      // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to<br>
+      // newer ABI versions.<br>
+      getDriver().Dir + "/../include/c++/v1",<br>
+<br>
+      // Try sysroot, e.g., DEFAULT_SYSROOT, if set<br>
+      getDriver().SysRoot + "/usr/include/c++/v1",<br>
+<br>
+      // libc++ was installed via macports<br>
+      "/usr/include/c++/v1",<br>
+<br>
</span>+      // FIXME: We should really let cmake find this path, e.g.,<br>
+      // assuming we were compiled with clang:<br>
+      // LIBCXX_INCLUDE_DIR=$(dirname $(dirname $(xcrun -f clang))..)/include/c++/v1<br>
+      // libc++ installed along side clang<br>
+      "/Applications/Xcode.app/Contents/Developer/Toolchains/"<br>
+      "XcodeDefault.xctoolchain/usr/include/c++/v1"<br>
<span class="">+    };<br>
+    for (const auto &IncludePath : LibCXXIncludePathCandidates) {<br>
+      if (!llvm::sys::fs::exists(IncludePath))<br>
+        continue;<br>
+      // Add the first candidate that exists.<br>
+      addSystemInclude(DriverArgs, CC1Args, IncludePath);<br>
+      break;<br>
+    }<br>
</span>+  } else {<br>
+    // FIXME: The libstdc++ include paths are currently added in<br>
+    // InitHeaderSearch::AddDefaultCPlusPlusIncludePaths().<br>
+    // Should they be moved here?<br>
<div class="HOEnZb"><div class="h5">+  }<br>
+}<br>
+<br>
 void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,<br>
                               StringRef DarwinLibName, bool AlwaysLink,<br>
                               bool IsEmbedded, bool AddRPath) const {<br>
<br>
<br>
</div></div></blockquote></div><br></div>