Skip to content
Snippets Groups Projects
Commit 3e8479d9 authored by Manuel Klimek's avatar Manuel Klimek
Browse files

Fixes the header search logic for tools:

The driver needs to get the correct path to the executable to deduce
the header search path.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155542 91177308-0d34-0410-b5e6-96231b3b80d8
parent a6ddc029
No related branches found
No related tags found
No related merge requests found
...@@ -29,6 +29,9 @@ ...@@ -29,6 +29,9 @@
namespace clang { namespace clang {
namespace tooling { namespace tooling {
// Exists solely for the purpose of lookup of the resource path.
static int StaticSymbol;
FrontendActionFactory::~FrontendActionFactory() {} FrontendActionFactory::~FrontendActionFactory() {}
// FIXME: This file contains structural duplication with other parts of the // FIXME: This file contains structural duplication with other parts of the
...@@ -39,9 +42,20 @@ FrontendActionFactory::~FrontendActionFactory() {} ...@@ -39,9 +42,20 @@ FrontendActionFactory::~FrontendActionFactory() {}
static clang::driver::Driver *newDriver(clang::DiagnosticsEngine *Diagnostics, static clang::driver::Driver *newDriver(clang::DiagnosticsEngine *Diagnostics,
const char *BinaryName) { const char *BinaryName) {
const std::string DefaultOutputName = "a.out"; 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( clang::driver::Driver *CompilerDriver = new clang::driver::Driver(
BinaryName, llvm::sys::getDefaultTargetTriple(), MainExecutable.str(), llvm::sys::getDefaultTargetTriple(),
DefaultOutputName, false, *Diagnostics); DefaultOutputName, false, *Diagnostics);
CompilerDriver->setTitle("clang_based_tool"); CompilerDriver->setTitle("clang_based_tool");
return CompilerDriver; return CompilerDriver;
} }
...@@ -171,9 +185,6 @@ bool ToolInvocation::run() { ...@@ -171,9 +185,6 @@ bool ToolInvocation::run() {
Invocation.take(), *CC1Args, ToolAction.take()); Invocation.take(), *CC1Args, ToolAction.take());
} }
// Exists solely for the purpose of lookup of the resource path.
static int StaticSymbol;
bool ToolInvocation::runInvocation( bool ToolInvocation::runInvocation(
const char *BinaryName, const char *BinaryName,
clang::driver::Compilation *Compilation, clang::driver::Compilation *Compilation,
......
// 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment