Find clang headers in the clang headers dir, search it before 
the system headers dir.  This produces an annoying warning:
clang.cpp:883: warning: ISO C++ forbids casting between pointer-to-function and pointer-to-object

I'm not sure how to remove it. :(


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47836 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/clang.cpp b/Driver/clang.cpp
index 36a7f16..0f6e7fa 100644
--- a/Driver/clang.cpp
+++ b/Driver/clang.cpp
@@ -43,6 +43,7 @@
 #include "llvm/System/Signals.h"
 #include "llvm/Config/config.h"
 #include "llvm/ADT/OwningPtr.h"
+#include "llvm/System/Path.h"
 #include <memory>
 #include <fstream>
 using namespace clang;
@@ -805,8 +806,8 @@
 
 /// InitializeIncludePaths - Process the -I options and set them in the
 /// HeaderSearch object.
-static void InitializeIncludePaths(HeaderSearch &Headers, FileManager &FM,
-                                   const LangOptions &Lang) {
+static void InitializeIncludePaths(const char *Argv0, HeaderSearch &Headers,
+                                   FileManager &FM, const LangOptions &Lang) {
   // Handle -F... options.
   for (unsigned i = 0, e = F_dirs.size(); i != e; ++i)
     AddPath(F_dirs[i], Angled, false, true, true, Headers);
@@ -877,6 +878,16 @@
   else
     AddEnvVarPaths("C_INCLUDE_PATH", Headers);
 
+  // Add the clang headers, which are relative to the clang driver.
+  llvm::sys::Path MainExecutablePath = 
+     llvm::sys::Path::GetMainExecutable(Argv0, (void*)InitializeIncludePaths);
+  if (!MainExecutablePath.isEmpty()) {
+    MainExecutablePath.eraseComponent();  // Remove /clang from foo/bin/clang
+    MainExecutablePath.eraseComponent();  // Remove /bin   from foo/bin
+    MainExecutablePath.appendComponent("Headers"); // Get foo/Headers
+    AddPath(MainExecutablePath.c_str(), System, false, false, false, Headers);
+  }
+  
   // FIXME: temporary hack: hard-coded paths.
   // FIXME: get these from the target?
   if (!nostdinc) {
@@ -1230,7 +1241,7 @@
 
 
 int main(int argc, char **argv) {
-  llvm::cl::ParseCommandLineOptions(argc, argv, " llvm cfe\n");
+  llvm::cl::ParseCommandLineOptions(argc, argv, " llvm clang cfe\n");
   llvm::sys::PrintStackTraceOnErrorSignal();
   
   // If no input was specified, read from stdin.
@@ -1290,7 +1301,7 @@
       // Process the -I options and set them in the HeaderInfo.
       HeaderSearch HeaderInfo(FileMgr);
       DiagClient->setHeaderSearch(HeaderInfo);
-      InitializeIncludePaths(HeaderInfo, FileMgr, LangInfo);
+      InitializeIncludePaths(argv[0], HeaderInfo, FileMgr, LangInfo);
       
       // Get information about the targets being compiled for.  Note that this
       // pointer and the TargetInfoImpl objects are never deleted by this toy