mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
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:
@@ -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.");
|
||||
|
||||
Reference in New Issue
Block a user