Skip to content

Commit d185373

Browse files
Merge pull request #11098 from adrian-prantl/156647851
[lldb] Set module import callbacks more consistently in more places
2 parents 54ea957 + 666e07b commit d185373

File tree

5 files changed

+87
-68
lines changed

5 files changed

+87
-68
lines changed

lldb/source/Plugins/ExpressionParser/Swift/SwiftExpressionParser.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,18 +1272,22 @@ SwiftExpressionParser::ParseAndImport(
12721272
SwiftASTContext::ScopedDiagnostics &expr_diagnostics,
12731273
SwiftExpressionParser::SILVariableMap &variable_map, unsigned &buffer_id,
12741274
DiagnosticManager &diagnostic_manager) {
1275+
12751276
Log *log = GetLog(LLDBLog::Expressions);
12761277
bool repl = m_options.GetREPLEnabled();
12771278
bool playground = m_options.GetPlaygroundTransformEnabled();
1279+
1280+
// Install a progress meter.
1281+
auto progress_raii = m_swift_ast_ctx.GetModuleImportProgressRAII(
1282+
"Importing modules used in expression");
1283+
12781284
// If we are using the playground, hand import the necessary
12791285
// modules.
12801286
//
12811287
// FIXME: We won't have to do this once the playground adds import
12821288
// statements for the things it needs itself.
12831289
if (playground) {
1284-
SourceModule module_info;
1285-
module_info.path.emplace_back("Swift");
1286-
auto module_or_err = m_swift_ast_ctx.GetModule(module_info);
1290+
auto module_or_err = m_swift_ast_ctx.ImportStdlib();
12871291

12881292
if (!module_or_err) {
12891293
LLDB_LOG(log, "couldn't load Swift Standard Library");

lldb/source/Plugins/ExpressionParser/Swift/SwiftUserExpression.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -840,9 +840,7 @@ bool SwiftUserExpression::Parse(DiagnosticManager &diagnostic_manager,
840840
if (!persistent_state)
841841
return error("could not start parsing (no persistent data)");
842842

843-
SourceModule module_info;
844-
module_info.path.emplace_back("Swift");
845-
auto module_decl_or_err = m_swift_ast_ctx->GetModule(module_info);
843+
auto module_decl_or_err = m_swift_ast_ctx->ImportStdlib();
846844
if (!module_decl_or_err)
847845
return error("could not load Swift Standard Library",
848846
llvm::toString(module_decl_or_err.takeError()).c_str());

lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp

Lines changed: 61 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -3871,6 +3871,54 @@ void SwiftASTContext::CacheModule(std::string module_name,
38713871
m_swift_module_cache.insert({module_name, *module});
38723872
}
38733873

3874+
/// An RAII object to install a progress report callback.
3875+
SwiftASTContext::ModuleImportProgressRAII::ModuleImportProgressRAII(
3876+
SwiftASTContext &ctx, std::string category)
3877+
: m_ts(ctx.shared_from_this()), m_progress(category) {
3878+
if (!m_ts)
3879+
return;
3880+
ThreadSafeASTContext ast = ctx.GetASTContext();
3881+
if (!ast)
3882+
return;
3883+
ast->SetPreModuleImportCallback(
3884+
[&](llvm::StringRef name, swift::ASTContext::ModuleImportKind kind) {
3885+
switch (kind) {
3886+
case swift::ASTContext::Module:
3887+
m_progress.Increment(1, name.str());
3888+
break;
3889+
case swift::ASTContext::Overlay:
3890+
m_progress.Increment(1, name.str() + " (overlay)");
3891+
break;
3892+
case swift::ASTContext::BridgingHeader: {
3893+
// Module imports generate remarks, which are logged, but bridging
3894+
// headers don't.
3895+
auto &m_description = ctx.GetDescription();
3896+
HEALTH_LOG_PRINTF("Compiling bridging header: %s",
3897+
name.str().c_str());
3898+
m_progress.Increment(1, "Compiling bridging header: " + name.str());
3899+
break;
3900+
}
3901+
}
3902+
});
3903+
}
3904+
3905+
SwiftASTContext::ModuleImportProgressRAII::~ModuleImportProgressRAII() {
3906+
if (!m_ts)
3907+
return;
3908+
ThreadSafeASTContext ast =
3909+
llvm::cast<SwiftASTContext>(m_ts.get())->GetASTContext();
3910+
if (!ast)
3911+
return;
3912+
ast->SetPreModuleImportCallback(
3913+
[](llvm::StringRef, swift::ASTContext::ModuleImportKind) {});
3914+
}
3915+
3916+
std::unique_ptr<SwiftASTContext::ModuleImportProgressRAII>
3917+
SwiftASTContext::GetModuleImportProgressRAII(std::string category) {
3918+
return std::make_unique<SwiftASTContext::ModuleImportProgressRAII>(*this,
3919+
category);
3920+
}
3921+
38743922
llvm::Expected<swift::ModuleDecl &>
38753923
SwiftASTContext::GetModule(const SourceModule &module, bool *cached) {
38763924
if (cached)
@@ -3910,36 +3958,6 @@ SwiftASTContext::GetModule(const SourceModule &module, bool *cached) {
39103958
// Create a diagnostic consumer for the diagnostics produced by the import.
39113959
auto import_diags = getScopedDiagnosticConsumer();
39123960

3913-
// Report progress on module importing by using a callback function in
3914-
// swift::ASTContext.
3915-
std::unique_ptr<Progress> progress;
3916-
ast->SetPreModuleImportCallback(
3917-
[&progress](llvm::StringRef module_name,
3918-
swift::ASTContext::ModuleImportKind kind) {
3919-
if (!progress)
3920-
progress = std::make_unique<Progress>("Importing Swift modules");
3921-
switch (kind) {
3922-
case swift::ASTContext::Module:
3923-
progress->Increment(1, module_name.str());
3924-
break;
3925-
case swift::ASTContext::Overlay:
3926-
progress->Increment(1, module_name.str() + " (overlay)");
3927-
break;
3928-
case swift::ASTContext::BridgingHeader:
3929-
progress->Increment(1, "Compiling bridging header: " +
3930-
module_name.str());
3931-
break;
3932-
}
3933-
});
3934-
3935-
// Clear the callback function on scope exit to prevent an out-of-scope access
3936-
// of the progress local variable
3937-
auto on_exit = llvm::make_scope_exit([&]() {
3938-
ast->SetPreModuleImportCallback(
3939-
[](llvm::StringRef module_name,
3940-
swift::ASTContext::ModuleImportKind kind) {});
3941-
});
3942-
39433961
swift::ModuleDecl *module_decl = ast->getModuleByName(module_name);
39443962

39453963
// Error handling.
@@ -3966,6 +3984,13 @@ SwiftASTContext::GetModule(const SourceModule &module, bool *cached) {
39663984
return *module_decl;
39673985
}
39683986

3987+
llvm::Expected<swift::ModuleDecl &>
3988+
SwiftASTContext::ImportStdlib() {
3989+
SourceModule module_info;
3990+
module_info.path.emplace_back(swift::STDLIB_NAME);
3991+
return GetModule(module_info);
3992+
}
3993+
39693994
llvm::Expected<swift::ModuleDecl &>
39703995
SwiftASTContext::GetModule(const FileSpec &module_spec) {
39713996
VALID_OR_RETURN(llvm::createStringError("no context"));
@@ -4520,15 +4545,9 @@ void SwiftASTContext::ImportSectionModules(
45204545
Module &module, const std::vector<std::string> &module_names) {
45214546
VALID_OR_RETURN();
45224547

4523-
Progress progress("Loading Swift module dependencies",
4524-
module.GetFileSpec().GetFilename().GetString(),
4525-
module_names.size());
4526-
4527-
size_t completion = 0;
4548+
auto module_import_progress_raii =
4549+
GetModuleImportProgressRAII("Importing Swift section modules");
45284550
for (const std::string &module_name : module_names) {
4529-
// We have to increment the completion value even if we can't get the module
4530-
// object to stay in-sync with the total progress reporting.
4531-
progress.Increment(++completion, module_name);
45324551
SourceModule module_info;
45334552
module_info.path.push_back(ConstString(module_name));
45344553
auto module_or_err = GetModule(module_info);
@@ -9128,9 +9147,6 @@ bool SwiftASTContextForExpressions::CacheUserImports(
91289147

91299148
auto src_file_imports = source_file.getImports();
91309149

9131-
Progress progress("Importing modules used in expression");
9132-
size_t completion = 0;
9133-
91349150
/// Find all explicit imports in the expression.
91359151
struct UserImportFinder : public swift::ASTWalker {
91369152
llvm::SmallDenseSet<swift::ModuleDecl*, 1> imports;
@@ -9146,9 +9162,6 @@ bool SwiftASTContextForExpressions::CacheUserImports(
91469162
source_file.walk(import_finder);
91479163

91489164
for (const auto &attributed_import : src_file_imports) {
9149-
progress.Increment(
9150-
++completion,
9151-
attributed_import.module.importedModule->getModuleFilename().str());
91529165
swift::ModuleDecl *module = attributed_import.module.importedModule;
91539166
if (module && import_finder.imports.count(module)) {
91549167
std::string module_name;
@@ -9248,7 +9261,7 @@ bool SwiftASTContext::GetCompileUnitImportsImpl(
92489261

92499262
// Import the Swift standard library and its dependencies.
92509263
SourceModule swift_module;
9251-
swift_module.path.emplace_back("Swift");
9264+
swift_module.path.emplace_back(swift::STDLIB_NAME);
92529265
auto *stdlib = LoadOneModule(swift_module, *this, process_sp,
92539266
/*import_dylibs=*/true, error);
92549267
if (!stdlib)
@@ -9297,13 +9310,11 @@ bool SwiftASTContext::GetCompileUnitImportsImpl(
92979310
}
92989311

92999312
LOG_PRINTF(GetLog(LLDBLog::Types), "Importing dependencies of current CU");
9300-
9301-
std::string category = "Importing Swift module dependencies for ";
9313+
std::string category = "Importing dependencies for ";
93029314
category += compile_unit->GetPrimaryFile().GetFilename().GetString();
9303-
Progress progress(category, "", cu_imports.size());
9304-
size_t completion = 0;
9315+
auto module_import_progress_raii = GetModuleImportProgressRAII(category);
9316+
93059317
for (const SourceModule &module : cu_imports) {
9306-
progress.Increment(++completion, llvm::join(module.path, "."));
93079318
// When building the Swift stdlib with debug info these will
93089319
// show up in "Swift.o", but we already imported them and
93099320
// manually importing them will fail.

lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "Plugins/TypeSystem/Swift/TypeSystemSwift.h"
1818
#include "Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h"
1919

20+
#include "lldb/Core/Progress.h"
2021
#include "lldb/Core/SwiftForward.h"
2122
#include "lldb/Core/ThreadSafeDenseSet.h"
2223
#include "lldb/Expression/DiagnosticManager.h"
@@ -325,13 +326,28 @@ class SwiftASTContext : public TypeSystemSwift {
325326
CreateModule(std::string module_name, swift::ImplicitImportInfo importInfo,
326327
swift::ModuleDecl::PopulateFilesFn populateFiles);
327328

329+
/// An RAII object to install a progress report callback.
330+
class ModuleImportProgressRAII {
331+
lldb::TypeSystemSP m_ts;
332+
Progress m_progress;
333+
334+
public:
335+
ModuleImportProgressRAII(SwiftASTContext &ctx, std::string category);
336+
~ModuleImportProgressRAII();
337+
};
338+
339+
/// Install and return a module import RAII object.
340+
std::unique_ptr<ModuleImportProgressRAII>
341+
GetModuleImportProgressRAII(std::string category);
342+
328343
// This function should only be called when all search paths
329344
// for all items in a swift::ASTContext have been setup to
330345
// allow for imports to happen correctly. Use with caution,
331346
// or use the GetModule() call that takes a FileSpec.
332347
llvm::Expected<swift::ModuleDecl &> GetModule(const SourceModule &module,
333348
bool *cached = nullptr);
334349
llvm::Expected<swift::ModuleDecl &> GetModule(const FileSpec &module_spec);
350+
llvm::Expected<swift::ModuleDecl &> ImportStdlib();
335351

336352
void CacheModule(std::string module_name, swift::ModuleDecl *module);
337353

lldb/test/API/functionalities/progress_reporting/swift_progress_reporting/TestSwiftProgressReporting.py

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,11 @@ def test_swift_progress_report(self):
3535
self.runCmd("v s")
3636

3737
beacons = [
38-
"Loading Swift module",
3938
"Compiling bridging header",
4039
"Importing modules used in expression",
4140
"Setting up Swift reflection",
42-
"Importing Swift module dependencies for main.swift",
43-
"Importing Swift modules",
41+
"Importing dependencies for main.swift",
42+
"Importing dependencies for main.swift: Foundation",
4443
"Importing Swift standard library",
4544
]
4645

@@ -51,15 +50,6 @@ def test_swift_progress_report(self):
5150
if self.TraceOn():
5251
print(ret_args[0])
5352

54-
# When importing Swift modules, make sure that we don't get two reports
55-
# in a row with the title "Importing Swift modules", i.e. there should be
56-
# a report with that title followed by a report with that title and details
57-
# attached.
58-
if ret_args[0] == "Importing Swift modules":
59-
next_event = lldbutil.fetch_next_event(self, self.listener, self.broadcaster)
60-
next_ret_args = lldb.SBDebugger.GetProgressFromEvent(next_event)
61-
self.assertRegexpMatches(next_ret_args[0], r"Importing Swift modules:+")
62-
6353
for beacon in beacons:
6454
if beacon in ret_args[0]:
6555
beacons.remove(beacon)

0 commit comments

Comments
 (0)