[PATCH] D149236: [clangd] Bail gracefully if given an assembly or IR source file
Nathan Ridge via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 25 23:23:19 PDT 2023
nridge created this revision.
nridge added reviewers: hokein, kadircet.
Herald added a subscriber: arphaman.
Herald added a project: All.
nridge requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov.
Herald added a project: clang-tools-extra.
The previous behaviour is to try to parse such files, and in some
cases assert or hang in components that don't expect these forms of
input, like TokenBuffer.
Fixes https://github.com/llvm/llvm-project/issues/62090
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D149236
Files:
clang-tools-extra/clangd/ParsedAST.cpp
clang-tools-extra/clangd/unittests/ParsedASTTests.cpp
Index: clang-tools-extra/clangd/unittests/ParsedASTTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/ParsedASTTests.cpp
+++ clang-tools-extra/clangd/unittests/ParsedASTTests.cpp
@@ -16,6 +16,7 @@
#include "../../clang-tidy/ClangTidyModuleRegistry.h"
#include "AST.h"
#include "Annotations.h"
+#include "CompileCommands.h"
#include "Compiler.h"
#include "Diagnostics.h"
#include "Headers.h"
@@ -846,6 +847,39 @@
pragmaTrivia(" End")));
}
+TEST(ParsedASTTest, GracefulFailureOnAssemblyFile) {
+ std::string Filename = "TestTU.S";
+ std::string Code = R"S(
+main:
+ # test comment
+ bx lr
+ )S";
+
+ // The rest is a simplified version of TestTU::build().
+ // Don't call TestTU::build() itself because it would assert on
+ // failure to build an AST.
+ MockFS FS;
+ std::string FullFilename = testPath(Filename);
+ FS.Files[FullFilename] = Code;
+ ParseInputs Inputs;
+ auto &Argv = Inputs.CompileCommand.CommandLine;
+ Argv = {"clang"};
+ Argv.push_back(FullFilename);
+ auto Mangler = CommandMangler::forTests();
+ Mangler(Inputs.CompileCommand, FullFilename);
+ Inputs.CompileCommand.Filename = FullFilename;
+ Inputs.CompileCommand.Directory = testRoot();
+ Inputs.Contents = Code;
+ Inputs.TFS = &FS;
+ StoreDiags Diags;
+ auto CI = buildCompilerInvocation(Inputs, Diags);
+ assert(CI && "Failed to build compilation invocation.");
+ auto AST = ParsedAST::build(FullFilename, Inputs, std::move(CI), {}, nullptr);
+
+ EXPECT_FALSE(AST.has_value())
+ << "Should not try to build AST for assembly source file";
+}
+
} // namespace
} // namespace clangd
} // namespace clang
Index: clang-tools-extra/clangd/ParsedAST.cpp
===================================================================
--- clang-tools-extra/clangd/ParsedAST.cpp
+++ clang-tools-extra/clangd/ParsedAST.cpp
@@ -354,6 +354,15 @@
VFS = Preamble->StatCache->getConsumingFS(std::move(VFS));
assert(CI);
+
+ if (CI->getFrontendOpts().Inputs.size() > 0) {
+ auto Lang = CI->getFrontendOpts().Inputs[0].getKind().getLanguage();
+ if (Lang == Language::Asm || Lang == Language::LLVM_IR) {
+ elog("Clangd does not support assembly or IR source files");
+ return std::nullopt;
+ }
+ }
+
// Command-line parsing sets DisableFree to true by default, but we don't want
// to leak memory in clangd.
CI->getFrontendOpts().DisableFree = false;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D149236.517068.patch
Type: text/x-patch
Size: 2492 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230426/7a0be9cc/attachment.bin>
More information about the cfe-commits
mailing list