From 3e8479d97f59594ac90799f3ff831ac3b2b81c48 Mon Sep 17 00:00:00 2001 From: Manuel Klimek Date: Wed, 25 Apr 2012 09:25:41 +0000 Subject: [PATCH] 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 --- lib/Tooling/Tooling.cpp | 21 +++++++++++++++----- test/Tooling/clang-check-builtin-headers.cpp | 16 +++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 test/Tooling/clang-check-builtin-headers.cpp diff --git a/lib/Tooling/Tooling.cpp b/lib/Tooling/Tooling.cpp index fa2374f5e3..646a22af87 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 0000000000..307b9344cd --- /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 + +// 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 -- 2.40.0