From 04531ba3a288086fc01e469af2fa07191df8edd0 Mon Sep 17 00:00:00 2001 From: Kadir Cetinkaya Date: Thu, 4 Jul 2019 11:34:23 +0000 Subject: [PATCH] [clangd] Query driver reads stderr and passes driver as first argument Summary: gcc invokes cc1 through a path deduced from argv[0] therefore it must be correctly set. Also it prints the search path to stderr not stdout, this also applies to clang. Reviewers: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D64196 llvm-svn: 365132 --- clang-tools-extra/clangd/QueryDriverDatabase.cpp | 24 ++++++++++------------ .../clangd/test/system-include-extractor.test | 11 +++++----- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/clang-tools-extra/clangd/QueryDriverDatabase.cpp b/clang-tools-extra/clangd/QueryDriverDatabase.cpp index 6d51ec2..c68596d 100644 --- a/clang-tools-extra/clangd/QueryDriverDatabase.cpp +++ b/clang-tools-extra/clangd/QueryDriverDatabase.cpp @@ -102,20 +102,19 @@ std::vector extractSystemIncludes(PathRef Driver, return {}; } - llvm::SmallString<128> OutputPath; - auto EC = llvm::sys::fs::createTemporaryFile("system-includes", "clangd", - OutputPath); - if (EC) { + llvm::SmallString<128> StdErrPath; + if (auto EC = llvm::sys::fs::createTemporaryFile("system-includes", "clangd", + StdErrPath)) { elog("System include extraction: failed to create temporary file with " "error {0}", EC.message()); return {}; } auto CleanUp = llvm::make_scope_exit( - [&OutputPath]() { llvm::sys::fs::remove(OutputPath); }); + [&StdErrPath]() { llvm::sys::fs::remove(StdErrPath); }); llvm::Optional Redirects[] = { - {""}, llvm::StringRef(OutputPath), {""}}; + {""}, {""}, llvm::StringRef(StdErrPath)}; auto Type = driver::types::lookupTypeForExtension(Ext); if (Type == driver::types::TY_INVALID) { @@ -123,22 +122,21 @@ std::vector extractSystemIncludes(PathRef Driver, return {}; } // Should we also preserve flags like "-sysroot", "-nostdinc" ? - const llvm::StringRef Args[] = {"-E", "-x", driver::types::getTypeName(Type), - "-", "-v"}; + const llvm::StringRef Args[] = { + Driver, "-E", "-x", driver::types::getTypeName(Type), "-", "-v"}; - int RC = - llvm::sys::ExecuteAndWait(Driver, Args, /*Env=*/llvm::None, Redirects); - if (RC) { + if (int RC = llvm::sys::ExecuteAndWait(Driver, Args, /*Env=*/llvm::None, + Redirects)) { elog("System include extraction: driver execution failed with return code: " "{0}", llvm::to_string(RC)); return {}; } - auto BufOrError = llvm::MemoryBuffer::getFile(OutputPath); + auto BufOrError = llvm::MemoryBuffer::getFile(StdErrPath); if (!BufOrError) { elog("System include extraction: failed to read {0} with error {1}", - OutputPath, BufOrError.getError().message()); + StdErrPath, BufOrError.getError().message()); return {}; } diff --git a/clang-tools-extra/clangd/test/system-include-extractor.test b/clang-tools-extra/clangd/test/system-include-extractor.test index 861be9c..130afbd 100644 --- a/clang-tools-extra/clangd/test/system-include-extractor.test +++ b/clang-tools-extra/clangd/test/system-include-extractor.test @@ -3,11 +3,12 @@ # Generate a mock-driver that will print %temp_dir%/my/dir and # %temp_dir%/my/dir2 as include search paths. # RUN: echo '#!/bin/bash' >> %t.dir/my_driver.sh -# RUN: echo 'echo line to ignore' >> %t.dir/my_driver.sh -# RUN: echo 'echo \#include \<...\> search starts here:' >> %t.dir/my_driver.sh -# RUN: echo 'echo %t.dir/my/dir/' >> %t.dir/my_driver.sh -# RUN: echo 'echo %t.dir/my/dir2/' >> %t.dir/my_driver.sh -# RUN: echo 'echo End of search list.' >> %t.dir/my_driver.sh +# RUN: echo '[ "$0" = "%t.dir/my_driver.sh" ] || exit' >> %t.dir/my_driver.sh +# RUN: echo 'echo line to ignore >&2' >> %t.dir/my_driver.sh +# RUN: echo 'echo \#include \<...\> search starts here: >&2' >> %t.dir/my_driver.sh +# RUN: echo 'echo %t.dir/my/dir/ >&2' >> %t.dir/my_driver.sh +# RUN: echo 'echo %t.dir/my/dir2/ >&2' >> %t.dir/my_driver.sh +# RUN: echo 'echo End of search list. >&2' >> %t.dir/my_driver.sh # RUN: chmod +x %t.dir/my_driver.sh # Create header files my/dir/a.h and my/dir2/b.h -- 2.7.4