[cfe-commits] r155542 - in /cfe/trunk: lib/Tooling/Tooling.cpp test/Tooling/clang-check-builtin-headers.cpp

Manuel Klimek klimek at google.com
Wed Apr 25 02:25:41 PDT 2012


Author: klimek
Date: Wed Apr 25 04:25:41 2012
New Revision: 155542

URL: http://llvm.org/viewvc/llvm-project?rev=155542&view=rev
Log:
Fixes the header search logic for tools:
The driver needs to get the correct path to the executable to deduce
the header search path.


Added:
    cfe/trunk/test/Tooling/clang-check-builtin-headers.cpp   (with props)
Modified:
    cfe/trunk/lib/Tooling/Tooling.cpp

Modified: cfe/trunk/lib/Tooling/Tooling.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/Tooling.cpp?rev=155542&r1=155541&r2=155542&view=diff
==============================================================================
--- cfe/trunk/lib/Tooling/Tooling.cpp (original)
+++ cfe/trunk/lib/Tooling/Tooling.cpp Wed Apr 25 04:25:41 2012
@@ -29,6 +29,9 @@
 namespace clang {
 namespace tooling {
 
+// Exists solely for the purpose of lookup of the resource path.
+static int StaticSymbol;
+
 FrontendActionFactory::~FrontendActionFactory() {}
 
 // FIXME: This file contains structural duplication with other parts of the
@@ -39,9 +42,20 @@
 static clang::driver::Driver *newDriver(clang::DiagnosticsEngine *Diagnostics,
                                         const char *BinaryName) {
   const std::string DefaultOutputName = "a.out";
+  // This just needs to be some symbol in the binary.
+  void *const SymbolAddr = &StaticSymbol;
+  // The driver detects the builtin header path based on the path of
+  // the executable.
+  // FIXME: On linux, GetMainExecutable is independent of the content
+  // of BinaryName, thus allowing ClangTool and runToolOnCode to just
+  // pass in made-up names here (in the case of ClangTool this being
+  // the original compiler invocation). Make sure this works on other
+  // platforms.
+  llvm::sys::Path MainExecutable =
+    llvm::sys::Path::GetMainExecutable(BinaryName, SymbolAddr);
   clang::driver::Driver *CompilerDriver = new clang::driver::Driver(
-      BinaryName, llvm::sys::getDefaultTargetTriple(),
-      DefaultOutputName, false, *Diagnostics);
+    MainExecutable.str(), llvm::sys::getDefaultTargetTriple(),
+    DefaultOutputName, false, *Diagnostics);
   CompilerDriver->setTitle("clang_based_tool");
   return CompilerDriver;
 }
@@ -171,9 +185,6 @@
                        Invocation.take(), *CC1Args, ToolAction.take());
 }
 
-// Exists solely for the purpose of lookup of the resource path.
-static int StaticSymbol;
-
 bool ToolInvocation::runInvocation(
     const char *BinaryName,
     clang::driver::Compilation *Compilation,

Added: cfe/trunk/test/Tooling/clang-check-builtin-headers.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/clang-check-builtin-headers.cpp?rev=155542&view=auto
==============================================================================
--- cfe/trunk/test/Tooling/clang-check-builtin-headers.cpp (added)
+++ cfe/trunk/test/Tooling/clang-check-builtin-headers.cpp Wed Apr 25 04:25:41 2012
@@ -0,0 +1,16 @@
+// RUN: rm -rf %t
+// RUN: mkdir %t
+// Add a path that doesn't exist as argv[0] for the compile command line:
+// RUN: echo '[{"directory":".","command":"/random/tool -c %t/test.cpp","file":"%t/test.cpp"}]' > %t/compile_commands.json
+// RUN: cp "%s" "%t/test.cpp"
+// RUN: clang-check "%t" "%t/test.cpp" 2>&1|FileCheck %s
+// FIXME: Make the above easier.
+
+#include <stddef.h>
+
+// CHECK: C++ requires
+invalid;
+
+// FIXME: JSON doesn't like path separator '\', on Win32 hosts.
+// FIXME: clang-check doesn't like gcc driver on cygming.
+// XFAIL: cygwin,mingw32,win32

Propchange: cfe/trunk/test/Tooling/clang-check-builtin-headers.cpp
------------------------------------------------------------------------------
    svn:eol-style = LF





More information about the cfe-commits mailing list