diff --git a/lib/Tooling/Tooling.cpp b/lib/Tooling/Tooling.cpp index fa2374f5e30def73a3d42e1aa0e51f6e769d8e21..646a22af87759a7604ce2af82a21659077e71198 100644 --- a/lib/Tooling/Tooling.cpp +++ b/lib/Tooling/Tooling.cpp @@ -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 @@ FrontendActionFactory::~FrontendActionFactory() {} 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 @@ bool ToolInvocation::run() { 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, diff --git a/test/Tooling/clang-check-builtin-headers.cpp b/test/Tooling/clang-check-builtin-headers.cpp new file mode 100644 index 0000000000000000000000000000000000000000..307b9344cdb013c25ad9e63a90380b16204780a4 --- /dev/null +++ b/test/Tooling/clang-check-builtin-headers.cpp @@ -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