FineModuleTracing: use requested action type to further gate whether emitting fine-grained module trace is supported.

Emitting fine-grained module tracing files during full compilation should be sufficient for the use case in design. Other
swift-frontend invocations, such as emitting modules, doesn't need fully type-checked AST to perform the action, therefore
requesting/walking the fully typechecked AST to emit those tracing files may introduce performance overhead.
This commit is contained in:
Xi Ge
2024-12-10 22:06:56 -08:00
parent c868515fae
commit 3f69aed0f8
2 changed files with 49 additions and 5 deletions

View File

@@ -899,13 +899,57 @@ static void createFineModuleTraceFile(CompilerInstance &instance,
}
}
static bool shouldActionTypeEmitFineModuleTrace(FrontendOptions::ActionType action) {
// Only full compilation jobs should emit fine module tracing file.
// Other partial compilation jobs, such as emitting modules, only typecheck partially
// so walking into every function bodies may be risky.
switch(action) {
case swift::FrontendOptions::ActionType::Typecheck:
case swift::FrontendOptions::ActionType::EmitSILGen:
case swift::FrontendOptions::ActionType::EmitSIL:
case swift::FrontendOptions::ActionType::EmitAssembly:
case swift::FrontendOptions::ActionType::EmitLoweredSIL:
case swift::FrontendOptions::ActionType::EmitIRGen:
case swift::FrontendOptions::ActionType::EmitIR:
case swift::FrontendOptions::ActionType::EmitBC:
case swift::FrontendOptions::ActionType::EmitObject:
return true;
case swift::FrontendOptions::ActionType::NoneAction:
case swift::FrontendOptions::ActionType::Parse:
case swift::FrontendOptions::ActionType::ResolveImports:
case swift::FrontendOptions::ActionType::DumpParse:
case swift::FrontendOptions::ActionType::DumpInterfaceHash:
case swift::FrontendOptions::ActionType::DumpAST:
case swift::FrontendOptions::ActionType::PrintAST:
case swift::FrontendOptions::ActionType::PrintASTDecl:
case swift::FrontendOptions::ActionType::DumpScopeMaps:
case swift::FrontendOptions::ActionType::DumpAvailabilityScopes:
case swift::FrontendOptions::ActionType::EmitImportedModules:
case swift::FrontendOptions::ActionType::EmitPCH:
case swift::FrontendOptions::ActionType::EmitModuleOnly:
case swift::FrontendOptions::ActionType::MergeModules:
case swift::FrontendOptions::ActionType::CompileModuleFromInterface:
case swift::FrontendOptions::ActionType::TypecheckModuleFromInterface:
case swift::FrontendOptions::ActionType::EmitSIBGen:
case swift::FrontendOptions::ActionType::EmitSIB:
case swift::FrontendOptions::ActionType::Immediate:
case swift::FrontendOptions::ActionType::REPL:
case swift::FrontendOptions::ActionType::DumpTypeInfo:
case swift::FrontendOptions::ActionType::EmitPCM:
case swift::FrontendOptions::ActionType::DumpPCM:
case swift::FrontendOptions::ActionType::ScanDependencies:
case swift::FrontendOptions::ActionType::PrintVersion:
case swift::FrontendOptions::ActionType::PrintFeature:
return false;
}
}
bool swift::emitFineModuleTraceIfNeeded(CompilerInstance &Instance,
const FrontendOptions &opts) {
ModuleDecl *mainModule = Instance.getMainModule();
// When lazy type checking is enabled, we may end up with a partial AST.
// Walking on these partial AST completely may expose latent bugs.
if (mainModule->getASTContext().TypeCheckerOpts.EnableLazyTypecheck)
if (!shouldActionTypeEmitFineModuleTrace(opts.RequestedAction)) {
return false;
}
ModuleDecl *mainModule = Instance.getMainModule();
ASTContext &ctxt = mainModule->getASTContext();
assert(!ctxt.hadError() &&
"We should've already exited earlier if there was an error.");