diff --git a/clang-tools-extra/clangd/CMakeLists.txt b/clang-tools-extra/clangd/CMakeLists.txt --- a/clang-tools-extra/clangd/CMakeLists.txt +++ b/clang-tools-extra/clangd/CMakeLists.txt @@ -21,6 +21,7 @@ set(LLVM_LINK_COMPONENTS Support + AllTargetsInfos ) if(CLANG_BUILT_STANDALONE) diff --git a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp --- a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp +++ b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp @@ -11,6 +11,7 @@ #include "clang/Frontend/CompilerInvocation.h" #include "clang/Tooling/ArgumentsAdjusters.h" #include "clang/Tooling/CompilationDatabase.h" +#include "clang/Tooling/Tooling.h" #include "llvm/ADT/Optional.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" diff --git a/clang-tools-extra/clangd/test/target_info.test b/clang-tools-extra/clangd/test/target_info.test new file mode 100644 --- /dev/null +++ b/clang-tools-extra/clangd/test/target_info.test @@ -0,0 +1,34 @@ +# Mock 'compile_commands.json' to contain a driver name targeting fuchsia OS. +# Afterwards check that correct target is passed into clang. + +# RUN: rm -rf %t.dir && mkdir -p %t.dir + +# RUN: echo '[{"directory": "%/t.dir", "command": "%/t.dir/x86_64-fuchsia-clang -x c++ the-file.cpp -v", "file": "the-file.cpp"}]' > %t.dir/compile_commands.json + +# RUN: sed -e "s|INPUT_DIR|%/t.dir|g" %s > %t.test.1 +# On Windows, we need the URI in didOpen to look like "uri":"file:///C:/..." +# (with the extra slash in the front), so we add it here. +# RUN: sed -e "s|file://\([A-Z]\):/|file:///\1:/|g" %t.test.1 > %t.test + +# RUN: clangd -lit-test < %t.test 2>&1 | FileCheck -strict-whitespace %t.test +{"jsonrpc":"2.0","id":0,"method":"initialize","params":{}} +--- +{ + "jsonrpc":"2.0", + "method":"textDocument/didOpen", + "params": { + "textDocument": { + "uri": "file://INPUT_DIR/the-file.cpp", + "languageId":"cpp", + "version":1, + "text":"" + } + } +} +# Make sure we have target passed into cc1 driver, which is printed due to -v in +# the compile_commands.json +# CHECK: Target: x86_64-unknown-fuchsia +--- +{"jsonrpc":"2.0","id":10000,"method":"shutdown"} +--- +{"jsonrpc":"2.0","method":"exit"} diff --git a/clang-tools-extra/clangd/tool/ClangdMain.cpp b/clang-tools-extra/clangd/tool/ClangdMain.cpp --- a/clang-tools-extra/clangd/tool/ClangdMain.cpp +++ b/clang-tools-extra/clangd/tool/ClangdMain.cpp @@ -24,6 +24,7 @@ #include "llvm/Support/Path.h" #include "llvm/Support/Program.h" #include "llvm/Support/Signals.h" +#include "llvm/Support/TargetSelect.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -324,6 +325,7 @@ using namespace clang; using namespace clang::clangd; + llvm::InitializeAllTargetInfos(); llvm::sys::PrintStackTraceOnErrorSignal(argv[0]); llvm::cl::SetVersionPrinter([](llvm::raw_ostream &OS) { OS << clang::getClangToolFullVersion("clangd") << "\n"; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1046,8 +1046,14 @@ T.setObjectFormat(llvm::Triple::COFF); TargetTriple = T.str(); } + if (const Arg *A = Args.getLastArg(options::OPT_target)) TargetTriple = A->getValue(); + // Deduce target triplet from clang executable name, if not specified + // explicitly. + else if (ClangNameParts.TargetIsValid) + TargetTriple = ClangNameParts.TargetPrefix; + if (const Arg *A = Args.getLastArg(options::OPT_ccc_install_dir)) Dir = InstalledDir = A->getValue(); for (const Arg *A : Args.filtered(options::OPT_B)) {