Skip to content

Commit

Permalink
[Caching] Add fast swift instance setup for cache replay
Browse files Browse the repository at this point in the history
Add a fast path to create swift CompilerInstance when it is only used to
replay output when there is a cache hit. The normal `setup` function is
very expensive to call, especially in cache mode to setup inputs, and it
needs to be called once per input file from libSwiftScan API due to the
current caching granularity.

The fast path will only construct the part that is needed for output
replay, including the CAS, the output backend and caching diagnostic
processor.

rdar://127062609
  • Loading branch information
cachemeifyoucan committed Apr 25, 2024
1 parent 3fe8b71 commit facfe45
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 1 deletion.
4 changes: 4 additions & 0 deletions include/swift/Frontend/Frontend.h
Original file line number Diff line number Diff line change
Expand Up @@ -691,6 +691,10 @@ class CompilerInstance {
bool setup(const CompilerInvocation &Invocation, std::string &Error,
ArrayRef<const char *> Args = {});

/// The fast setup function for cache replay.
bool setupForReplay(const CompilerInvocation &Invocation, std::string &Error,
ArrayRef<const char *> Args = {});

const CompilerInvocation &getInvocation() const { return Invocation; }

/// If a IDE inspection buffer has been set, returns the corresponding source
Expand Down
17 changes: 17 additions & 0 deletions lib/Frontend/Frontend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,23 @@ bool CompilerInstance::setup(const CompilerInvocation &Invoke,
return false;
}

bool CompilerInstance::setupForReplay(const CompilerInvocation &Invoke,
std::string &Error,
ArrayRef<const char *> Args) {
// This is the fast path for setup an instance for replay but cannot run
// regular compilation.
Invocation = Invoke;

if (setupCASIfNeeded(Args)) {
Error = "Setting up CAS failed";
return true;
}

setupOutputBackend();
setupCachingDiagnosticsProcessorIfNeeded();
return false;
}

bool CompilerInstance::setUpVirtualFileSystemOverlays() {
if (Invocation.getCASOptions().requireCASFS()) {
const auto &Opts = getInvocation().getCASOptions();
Expand Down
3 changes: 2 additions & 1 deletion tools/libSwiftScan/SwiftCaching.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -932,7 +932,8 @@ static llvm::Error replayCompilation(SwiftScanReplayInstance &Instance,
Invocation.getDiagnosticOptions().EmitMacroExpansionFiles);

std::string InstanceSetupError;
if (Inst.setup(Instance.Invocation, InstanceSetupError, Instance.Args))
if (Inst.setupForReplay(Instance.Invocation, InstanceSetupError,
Instance.Args))
return createStringError(inconvertibleErrorCode(), InstanceSetupError);

auto *CDP = Inst.getCachingDiagnosticsProcessor();
Expand Down

0 comments on commit facfe45

Please sign in to comment.