Skip to content

Commit bdd10d9

Browse files
authored
[NFC] Explicitly pass a VFS when creating DiagnosticsEngine (#115852)
Starting with 41e3919 DiagnosticsEngine creation might perform IO. It was implicitly defaulting to getRealFileSystem. This patch makes it explicit by pushing the decision making to callers. It uses ambient VFS if one is available, and keeps using `getRealFileSystem` if there aren't any VFS.
1 parent 83c7784 commit bdd10d9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+192
-134
lines changed

clang-tools-extra/clang-include-fixer/IncludeFixer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ bool IncludeFixerActionFactory::runInvocation(
9595

9696
// Create the compiler's actual diagnostics engine. We want to drop all
9797
// diagnostics here.
98-
Compiler.createDiagnostics(new clang::IgnoringDiagConsumer,
98+
Compiler.createDiagnostics(Files->getVirtualFileSystem(),
99+
new clang::IgnoringDiagConsumer,
99100
/*ShouldOwnClient=*/true);
100101
Compiler.createSourceManager(*Files);
101102

clang-tools-extra/clangd/Compiler.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ buildCompilerInvocation(const ParseInputs &Inputs, clang::DiagnosticConsumer &D,
110110
CIOpts.VFS = Inputs.TFS->view(Inputs.CompileCommand.Directory);
111111
CIOpts.CC1Args = CC1Args;
112112
CIOpts.RecoverOnError = true;
113-
CIOpts.Diags =
114-
CompilerInstance::createDiagnostics(new DiagnosticOptions, &D, false);
113+
CIOpts.Diags = CompilerInstance::createDiagnostics(
114+
*CIOpts.VFS, new DiagnosticOptions, &D, false);
115115
CIOpts.ProbePrecompiled = false;
116116
std::unique_ptr<CompilerInvocation> CI = createInvocation(ArgStrs, CIOpts);
117117
if (!CI)
@@ -148,7 +148,7 @@ prepareCompilerInstance(std::unique_ptr<clang::CompilerInvocation> CI,
148148
auto Clang = std::make_unique<CompilerInstance>(
149149
std::make_shared<PCHContainerOperations>());
150150
Clang->setInvocation(std::move(CI));
151-
Clang->createDiagnostics(&DiagsClient, false);
151+
Clang->createDiagnostics(*VFS, &DiagsClient, false);
152152

153153
if (auto VFSWithRemapping = createVFSFromCompilerInvocation(
154154
Clang->getInvocation(), Clang->getDiagnostics(), VFS))

clang-tools-extra/clangd/ModulesBuilder.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ bool IsModuleFileUpToDate(PathRef ModuleFilePath,
188188

189189
clang::clangd::IgnoreDiagnostics IgnoreDiags;
190190
IntrusiveRefCntPtr<DiagnosticsEngine> Diags =
191-
CompilerInstance::createDiagnostics(new DiagnosticOptions, &IgnoreDiags,
191+
CompilerInstance::createDiagnostics(*VFS, new DiagnosticOptions,
192+
&IgnoreDiags,
192193
/*ShouldOwnClient=*/false);
193194

194195
LangOptions LangOpts;

clang-tools-extra/clangd/Preamble.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -613,8 +613,9 @@ buildPreamble(PathRef FileName, CompilerInvocation CI,
613613
for (const auto &L : ASTListeners)
614614
L->sawDiagnostic(D, Diag);
615615
});
616+
auto VFS = Inputs.TFS->view(Inputs.CompileCommand.Directory);
616617
llvm::IntrusiveRefCntPtr<DiagnosticsEngine> PreambleDiagsEngine =
617-
CompilerInstance::createDiagnostics(&CI.getDiagnosticOpts(),
618+
CompilerInstance::createDiagnostics(*VFS, &CI.getDiagnosticOpts(),
618619
&PreambleDiagnostics,
619620
/*ShouldOwnClient=*/false);
620621
const Config &Cfg = Config::current();
@@ -651,7 +652,6 @@ buildPreamble(PathRef FileName, CompilerInvocation CI,
651652
for (const auto &L : ASTListeners)
652653
L->beforeExecute(CI);
653654
});
654-
auto VFS = Inputs.TFS->view(Inputs.CompileCommand.Directory);
655655
llvm::SmallString<32> AbsFileName(FileName);
656656
VFS->makeAbsolute(AbsFileName);
657657
auto StatCache = std::make_shared<PreambleFileStatusCache>(AbsFileName);

clang-tools-extra/include-cleaner/unittests/RecordTest.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -609,15 +609,6 @@ TEST_F(PragmaIncludeTest, ExportInUnnamedBuffer) {
609609
)cpp";
610610
Inputs.ExtraFiles["foo.h"] = "";
611611

612-
auto Clang = std::make_unique<CompilerInstance>(
613-
std::make_shared<PCHContainerOperations>());
614-
Clang->createDiagnostics();
615-
616-
Clang->setInvocation(std::make_unique<CompilerInvocation>());
617-
ASSERT_TRUE(CompilerInvocation::CreateFromArgs(
618-
Clang->getInvocation(), {Filename.data()}, Clang->getDiagnostics(),
619-
"clang"));
620-
621612
// Create unnamed memory buffers for all the files.
622613
auto VFS = llvm::makeIntrusiveRefCnt<llvm::vfs::InMemoryFileSystem>();
623614
VFS->addFile(Filename, /*ModificationTime=*/0,
@@ -626,6 +617,16 @@ TEST_F(PragmaIncludeTest, ExportInUnnamedBuffer) {
626617
VFS->addFile(Extra.getKey(), /*ModificationTime=*/0,
627618
llvm::MemoryBuffer::getMemBufferCopy(Extra.getValue(),
628619
/*BufferName=*/""));
620+
621+
auto Clang = std::make_unique<CompilerInstance>(
622+
std::make_shared<PCHContainerOperations>());
623+
Clang->createDiagnostics(*VFS);
624+
625+
Clang->setInvocation(std::make_unique<CompilerInvocation>());
626+
ASSERT_TRUE(CompilerInvocation::CreateFromArgs(
627+
Clang->getInvocation(), {Filename.data()}, Clang->getDiagnostics(),
628+
"clang"));
629+
629630
auto *FM = Clang->createFileManager(VFS);
630631
ASSERT_TRUE(Clang->ExecuteAction(*Inputs.MakeAction()));
631632
EXPECT_THAT(

clang/include/clang/Frontend/CompilerInstance.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -675,13 +675,17 @@ class CompilerInstance : public ModuleLoader {
675675
/// Note that this routine also replaces the diagnostic client,
676676
/// allocating one if one is not provided.
677677
///
678+
/// \param VFS is used for any IO needed when creating DiagnosticsEngine. It
679+
/// doesn't replace VFS in the CompilerInstance (if any).
680+
///
678681
/// \param Client If non-NULL, a diagnostic client that will be
679682
/// attached to (and, then, owned by) the DiagnosticsEngine inside this AST
680683
/// unit.
681684
///
682685
/// \param ShouldOwnClient If Client is non-NULL, specifies whether
683686
/// the diagnostic object should take ownership of the client.
684-
void createDiagnostics(DiagnosticConsumer *Client = nullptr,
687+
void createDiagnostics(llvm::vfs::FileSystem &VFS,
688+
DiagnosticConsumer *Client = nullptr,
685689
bool ShouldOwnClient = true);
686690

687691
/// Create a DiagnosticsEngine object with a the TextDiagnosticPrinter.
@@ -702,10 +706,11 @@ class CompilerInstance : public ModuleLoader {
702706
/// used by some diagnostics printers (for logging purposes only).
703707
///
704708
/// \return The new object on success, or null on failure.
705-
static IntrusiveRefCntPtr<DiagnosticsEngine> createDiagnostics(
706-
DiagnosticOptions *Opts, DiagnosticConsumer *Client = nullptr,
707-
bool ShouldOwnClient = true, const CodeGenOptions *CodeGenOpts = nullptr,
708-
IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr);
709+
static IntrusiveRefCntPtr<DiagnosticsEngine>
710+
createDiagnostics(llvm::vfs::FileSystem &VFS, DiagnosticOptions *Opts,
711+
DiagnosticConsumer *Client = nullptr,
712+
bool ShouldOwnClient = true,
713+
const CodeGenOptions *CodeGenOpts = nullptr);
709714

710715
/// Create the file manager and replace any existing one with it.
711716
///

clang/lib/Frontend/CompilerInstance.cpp

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -332,23 +332,20 @@ static void SetupSerializedDiagnostics(DiagnosticOptions *DiagOpts,
332332
}
333333
}
334334

335-
void CompilerInstance::createDiagnostics(DiagnosticConsumer *Client,
335+
void CompilerInstance::createDiagnostics(llvm::vfs::FileSystem &VFS,
336+
DiagnosticConsumer *Client,
336337
bool ShouldOwnClient) {
337-
Diagnostics = createDiagnostics(
338-
&getDiagnosticOpts(), Client, ShouldOwnClient, &getCodeGenOpts(),
339-
FileMgr ? FileMgr->getVirtualFileSystemPtr() : nullptr);
338+
Diagnostics = createDiagnostics(VFS, &getDiagnosticOpts(), Client,
339+
ShouldOwnClient, &getCodeGenOpts());
340340
}
341341

342342
IntrusiveRefCntPtr<DiagnosticsEngine> CompilerInstance::createDiagnostics(
343-
DiagnosticOptions *Opts, DiagnosticConsumer *Client, bool ShouldOwnClient,
344-
const CodeGenOptions *CodeGenOpts,
345-
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS) {
343+
llvm::vfs::FileSystem &VFS, DiagnosticOptions *Opts,
344+
DiagnosticConsumer *Client, bool ShouldOwnClient,
345+
const CodeGenOptions *CodeGenOpts) {
346346
IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
347-
IntrusiveRefCntPtr<DiagnosticsEngine>
348-
Diags(new DiagnosticsEngine(DiagID, Opts));
349-
350-
if (!VFS)
351-
VFS = llvm::vfs::getRealFileSystem();
347+
IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
348+
new DiagnosticsEngine(DiagID, Opts));
352349

353350
// Create the diagnostic client for reporting errors or for
354351
// implementing -verify.
@@ -372,7 +369,7 @@ IntrusiveRefCntPtr<DiagnosticsEngine> CompilerInstance::createDiagnostics(
372369
Opts->DiagnosticSerializationFile);
373370

374371
// Configure our handling of diagnostics.
375-
ProcessWarningOptions(*Diags, *Opts, *VFS);
372+
ProcessWarningOptions(*Diags, *Opts, VFS);
376373

377374
return Diags;
378375
}
@@ -1240,9 +1237,10 @@ compileModuleImpl(CompilerInstance &ImportingInstance, SourceLocation ImportLoc,
12401237
auto &Inv = *Invocation;
12411238
Instance.setInvocation(std::move(Invocation));
12421239

1243-
Instance.createDiagnostics(new ForwardingDiagnosticConsumer(
1244-
ImportingInstance.getDiagnosticClient()),
1245-
/*ShouldOwnClient=*/true);
1240+
Instance.createDiagnostics(
1241+
ImportingInstance.getVirtualFileSystem(),
1242+
new ForwardingDiagnosticConsumer(ImportingInstance.getDiagnosticClient()),
1243+
/*ShouldOwnClient=*/true);
12461244

12471245
if (llvm::is_contained(DiagOpts.SystemHeaderWarningsModules, ModuleName))
12481246
Instance.getDiagnostics().setSuppressSystemWarnings(false);

clang/lib/Frontend/CreateInvocationFromCommandLine.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "llvm/ADT/STLExtras.h"
2323
#include "llvm/ADT/StringRef.h"
2424
#include "llvm/Option/ArgList.h"
25+
#include "llvm/Support/VirtualFileSystem.h"
2526
#include "llvm/TargetParser/Host.h"
2627
using namespace clang;
2728
using namespace llvm::opt;
@@ -32,7 +33,9 @@ clang::createInvocation(ArrayRef<const char *> ArgList,
3233
assert(!ArgList.empty());
3334
auto Diags = Opts.Diags
3435
? std::move(Opts.Diags)
35-
: CompilerInstance::createDiagnostics(new DiagnosticOptions);
36+
: CompilerInstance::createDiagnostics(
37+
Opts.VFS ? *Opts.VFS : *llvm::vfs::getRealFileSystem(),
38+
new DiagnosticOptions);
3639

3740
SmallVector<const char *, 16> Args(ArgList);
3841

clang/lib/Frontend/Rewrite/FrontendActions.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ class RewriteIncludesAction::RewriteImportsListener : public ASTReaderListener {
247247
Instance.setInvocation(
248248
std::make_shared<CompilerInvocation>(CI.getInvocation()));
249249
Instance.createDiagnostics(
250+
CI.getVirtualFileSystem(),
250251
new ForwardingDiagnosticConsumer(CI.getDiagnosticClient()),
251252
/*ShouldOwnClient=*/true);
252253
Instance.getFrontendOpts().DisableFree = false;

clang/lib/Interpreter/Interpreter.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "IncrementalExecutor.h"
1616
#include "IncrementalParser.h"
1717
#include "InterpreterUtils.h"
18+
#include "llvm/Support/VirtualFileSystem.h"
1819
#ifdef __EMSCRIPTEN__
1920
#include "Wasm.h"
2021
#endif // __EMSCRIPTEN__
@@ -106,7 +107,7 @@ CreateCI(const llvm::opt::ArgStringList &Argv) {
106107
CompilerInvocation::GetResourcesPath(Argv[0], nullptr);
107108

108109
// Create the actual diagnostics engine.
109-
Clang->createDiagnostics();
110+
Clang->createDiagnostics(*llvm::vfs::getRealFileSystem());
110111
if (!Clang->hasDiagnostics())
111112
return llvm::createStringError(llvm::errc::not_supported,
112113
"Initialization failed. "

0 commit comments

Comments
 (0)