Skip to content

Commit fc49b5c

Browse files
committed
[AST] Add mechanism to notify module loading to other clients
This patch adds an optional callback function member to the AST Context. The callback gets invoked when a new module (or overlay module) gets loaded. This can be used for instance by other clients, such as lldb, to perform actions when a module gets loaded, like showing progress to the end-user. rdar://94165195 Signed-off-by: Med Ismail Bennani <[email protected]>
1 parent 28a2c60 commit fc49b5c

File tree

2 files changed

+60
-39
lines changed

2 files changed

+60
-39
lines changed

include/swift/AST/ASTContext.h

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,13 @@ class ASTContext final {
223223
ASTContext(const ASTContext&) = delete;
224224
void operator=(const ASTContext&) = delete;
225225

226-
ASTContext(LangOptions &langOpts, TypeCheckerOptions &typeckOpts,
227-
SILOptions &silOpts, SearchPathOptions &SearchPathOpts,
228-
ClangImporterOptions &ClangImporterOpts,
229-
symbolgraphgen::SymbolGraphOptions &SymbolGraphOpts,
230-
SourceManager &SourceMgr, DiagnosticEngine &Diags);
226+
ASTContext(
227+
LangOptions &langOpts, TypeCheckerOptions &typeckOpts,
228+
SILOptions &silOpts, SearchPathOptions &SearchPathOpts,
229+
ClangImporterOptions &ClangImporterOpts,
230+
symbolgraphgen::SymbolGraphOptions &SymbolGraphOpts,
231+
SourceManager &SourceMgr, DiagnosticEngine &Diags,
232+
std::function<bool(llvm::StringRef, bool)> PreModuleImportCallback = {});
231233

232234
public:
233235
// Members that should only be used by ASTContext.cpp.
@@ -238,11 +240,13 @@ class ASTContext final {
238240

239241
void operator delete(void *Data) throw();
240242

241-
static ASTContext *get(LangOptions &langOpts, TypeCheckerOptions &typeckOpts,
242-
SILOptions &silOpts, SearchPathOptions &SearchPathOpts,
243-
ClangImporterOptions &ClangImporterOpts,
244-
symbolgraphgen::SymbolGraphOptions &SymbolGraphOpts,
245-
SourceManager &SourceMgr, DiagnosticEngine &Diags);
243+
static ASTContext *
244+
get(LangOptions &langOpts, TypeCheckerOptions &typeckOpts,
245+
SILOptions &silOpts, SearchPathOptions &SearchPathOpts,
246+
ClangImporterOptions &ClangImporterOpts,
247+
symbolgraphgen::SymbolGraphOptions &SymbolGraphOpts,
248+
SourceManager &SourceMgr, DiagnosticEngine &Diags,
249+
std::function<bool(llvm::StringRef, bool)> PreModuleImportCallback = {});
246250
~ASTContext();
247251

248252
/// Optional table of counters to report, nullptr when not collecting.
@@ -374,6 +378,10 @@ class ASTContext final {
374378
llvm::BumpPtrAllocator &
375379
getAllocator(AllocationArena arena = AllocationArena::Permanent) const;
376380

381+
/// An optional generic callback function invoked prior to importing a module.
382+
mutable std::function<bool(llvm::StringRef ModuleName, bool IsOverlay)>
383+
PreModuleImportCallback;
384+
377385
public:
378386
/// Allocate - Allocate memory from the ASTContext bump pointer.
379387
void *Allocate(unsigned long bytes, unsigned alignment,
@@ -1107,6 +1115,9 @@ class ASTContext final {
11071115
/// If a module by this name has already been loaded, the existing module will
11081116
/// be returned.
11091117
///
1118+
/// \param ModulePath The module's \c ImportPath which describes
1119+
/// the name of the module being loaded, possibly including submodules.
1120+
11101121
/// \returns The requested module, or NULL if the module cannot be found.
11111122
ModuleDecl *getModule(ImportPath::Module ModulePath);
11121123

lib/AST/ASTContext.cpp

Lines changed: 39 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@
4242
#include "swift/AST/PropertyWrappers.h"
4343
#include "swift/AST/ProtocolConformance.h"
4444
#include "swift/AST/RawComment.h"
45-
#include "swift/AST/SearchPathOptions.h"
4645
#include "swift/AST/SILLayout.h"
46+
#include "swift/AST/SearchPathOptions.h"
4747
#include "swift/AST/SemanticAttrs.h"
4848
#include "swift/AST/SourceFile.h"
4949
#include "swift/AST/SubstitutionMap.h"
@@ -65,6 +65,7 @@
6565
#include "llvm/IR/LLVMContext.h"
6666
#include "llvm/Support/Allocator.h"
6767
#include "llvm/Support/Compiler.h"
68+
#include "llvm/Support/FormatVariadic.h"
6869
#include <algorithm>
6970
#include <memory>
7071

@@ -577,12 +578,12 @@ void ASTContext::operator delete(void *Data) throw() {
577578
AlignedFree(Data);
578579
}
579580

580-
ASTContext *ASTContext::get(LangOptions &langOpts,
581-
TypeCheckerOptions &typeckOpts, SILOptions &silOpts,
582-
SearchPathOptions &SearchPathOpts,
583-
ClangImporterOptions &ClangImporterOpts,
584-
symbolgraphgen::SymbolGraphOptions &SymbolGraphOpts,
585-
SourceManager &SourceMgr, DiagnosticEngine &Diags) {
581+
ASTContext *ASTContext::get(
582+
LangOptions &langOpts, TypeCheckerOptions &typeckOpts, SILOptions &silOpts,
583+
SearchPathOptions &SearchPathOpts, ClangImporterOptions &ClangImporterOpts,
584+
symbolgraphgen::SymbolGraphOptions &SymbolGraphOpts,
585+
SourceManager &SourceMgr, DiagnosticEngine &Diags,
586+
std::function<bool(llvm::StringRef, bool)> PreModuleImportCallback) {
586587
// If more than two data structures are concatentated, then the aggregate
587588
// size math needs to become more complicated due to per-struct alignment
588589
// constraints.
@@ -593,19 +594,21 @@ ASTContext *ASTContext::get(LangOptions &langOpts,
593594
impl = reinterpret_cast<void *>(
594595
llvm::alignAddr(impl, llvm::Align(alignof(Implementation))));
595596
new (impl) Implementation();
596-
return new (mem)
597-
ASTContext(langOpts, typeckOpts, silOpts, SearchPathOpts,
598-
ClangImporterOpts, SymbolGraphOpts, SourceMgr, Diags);
597+
return new (mem) ASTContext(langOpts, typeckOpts, silOpts, SearchPathOpts,
598+
ClangImporterOpts, SymbolGraphOpts, SourceMgr,
599+
Diags, PreModuleImportCallback);
599600
}
600601

601-
ASTContext::ASTContext(LangOptions &langOpts, TypeCheckerOptions &typeckOpts,
602-
SILOptions &silOpts, SearchPathOptions &SearchPathOpts,
603-
ClangImporterOptions &ClangImporterOpts,
604-
symbolgraphgen::SymbolGraphOptions &SymbolGraphOpts,
605-
SourceManager &SourceMgr, DiagnosticEngine &Diags)
602+
ASTContext::ASTContext(
603+
LangOptions &langOpts, TypeCheckerOptions &typeckOpts, SILOptions &silOpts,
604+
SearchPathOptions &SearchPathOpts, ClangImporterOptions &ClangImporterOpts,
605+
symbolgraphgen::SymbolGraphOptions &SymbolGraphOpts,
606+
SourceManager &SourceMgr, DiagnosticEngine &Diags,
607+
std::function<bool(llvm::StringRef, bool)> PreModuleImportCallback)
606608
: LangOpts(langOpts), TypeCheckerOpts(typeckOpts), SILOpts(silOpts),
607609
SearchPathOpts(SearchPathOpts), ClangImporterOpts(ClangImporterOpts),
608610
SymbolGraphOpts(SymbolGraphOpts), SourceMgr(SourceMgr), Diags(Diags),
611+
PreModuleImportCallback(PreModuleImportCallback),
609612
evaluator(Diags, langOpts), TheBuiltinModule(createBuiltinModule(*this)),
610613
StdlibModuleName(getIdentifier(STDLIB_NAME)),
611614
SwiftShimsModuleName(getIdentifier(SWIFT_SHIMS_NAME)),
@@ -621,18 +624,18 @@ ASTContext::ASTContext(LangOptions &langOpts, TypeCheckerOptions &typeckOpts,
621624
The##SHORT_ID##Type(new (*this, AllocationArena::Permanent) \
622625
ID##Type(*this)),
623626
#include "swift/AST/TypeNodes.def"
624-
TheIEEE32Type(new (*this, AllocationArena::Permanent)
625-
BuiltinFloatType(BuiltinFloatType::IEEE32,*this)),
626-
TheIEEE64Type(new (*this, AllocationArena::Permanent)
627-
BuiltinFloatType(BuiltinFloatType::IEEE64,*this)),
628-
TheIEEE16Type(new (*this, AllocationArena::Permanent)
629-
BuiltinFloatType(BuiltinFloatType::IEEE16,*this)),
630-
TheIEEE80Type(new (*this, AllocationArena::Permanent)
631-
BuiltinFloatType(BuiltinFloatType::IEEE80,*this)),
632-
TheIEEE128Type(new (*this, AllocationArena::Permanent)
633-
BuiltinFloatType(BuiltinFloatType::IEEE128, *this)),
634-
ThePPC128Type(new (*this, AllocationArena::Permanent)
635-
BuiltinFloatType(BuiltinFloatType::PPC128, *this)) {
627+
TheIEEE32Type(new (*this, AllocationArena::Permanent)
628+
BuiltinFloatType(BuiltinFloatType::IEEE32, *this)),
629+
TheIEEE64Type(new (*this, AllocationArena::Permanent)
630+
BuiltinFloatType(BuiltinFloatType::IEEE64, *this)),
631+
TheIEEE16Type(new (*this, AllocationArena::Permanent)
632+
BuiltinFloatType(BuiltinFloatType::IEEE16, *this)),
633+
TheIEEE80Type(new (*this, AllocationArena::Permanent)
634+
BuiltinFloatType(BuiltinFloatType::IEEE80, *this)),
635+
TheIEEE128Type(new (*this, AllocationArena::Permanent)
636+
BuiltinFloatType(BuiltinFloatType::IEEE128, *this)),
637+
ThePPC128Type(new (*this, AllocationArena::Permanent)
638+
BuiltinFloatType(BuiltinFloatType::PPC128, *this)) {
636639

637640
// Initialize all of the known identifiers.
638641
#define IDENTIFIER_WITH_NAME(Name, IdStr) Id_##Name = getIdentifier(IdStr);
@@ -2210,6 +2213,8 @@ ASTContext::getModule(ImportPath::Module ModulePath) {
22102213
return M;
22112214

22122215
auto moduleID = ModulePath[0];
2216+
if (PreModuleImportCallback)
2217+
PreModuleImportCallback(moduleID.Item.str(), false /*=IsOverlay*/);
22132218
for (auto &importer : getImpl().ModuleLoaders) {
22142219
if (ModuleDecl *M = importer->loadModule(moduleID.Loc, ModulePath)) {
22152220
if (LangOpts.EnableModuleLoadingRemarks) {
@@ -2234,12 +2239,17 @@ ModuleDecl *ASTContext::getOverlayModule(const FileUnit *FU) {
22342239
return Existing;
22352240
}
22362241

2242+
if (PreModuleImportCallback) {
2243+
SmallString<16> path;
2244+
ModPath.getString(path);
2245+
if (!path.empty())
2246+
PreModuleImportCallback(path.str(), /*IsOverlay=*/true);
2247+
}
22372248
for (auto &importer : getImpl().ModuleLoaders) {
22382249
if (importer.get() == getClangModuleLoader())
22392250
continue;
2240-
if (ModuleDecl *M = importer->loadModule(SourceLoc(), ModPath)) {
2251+
if (ModuleDecl *M = importer->loadModule(SourceLoc(), ModPath))
22412252
return M;
2242-
}
22432253
}
22442254

22452255
return nullptr;

0 commit comments

Comments
 (0)