Skip to content

Commit 3f69aed

Browse files
committed
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.
1 parent c868515 commit 3f69aed

File tree

2 files changed

+49
-5
lines changed

2 files changed

+49
-5
lines changed

lib/FrontendTool/LoadedModuleTrace.cpp

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -899,13 +899,57 @@ static void createFineModuleTraceFile(CompilerInstance &instance,
899899
}
900900
}
901901

902+
static bool shouldActionTypeEmitFineModuleTrace(FrontendOptions::ActionType action) {
903+
// Only full compilation jobs should emit fine module tracing file.
904+
// Other partial compilation jobs, such as emitting modules, only typecheck partially
905+
// so walking into every function bodies may be risky.
906+
switch(action) {
907+
case swift::FrontendOptions::ActionType::Typecheck:
908+
case swift::FrontendOptions::ActionType::EmitSILGen:
909+
case swift::FrontendOptions::ActionType::EmitSIL:
910+
case swift::FrontendOptions::ActionType::EmitAssembly:
911+
case swift::FrontendOptions::ActionType::EmitLoweredSIL:
912+
case swift::FrontendOptions::ActionType::EmitIRGen:
913+
case swift::FrontendOptions::ActionType::EmitIR:
914+
case swift::FrontendOptions::ActionType::EmitBC:
915+
case swift::FrontendOptions::ActionType::EmitObject:
916+
return true;
917+
case swift::FrontendOptions::ActionType::NoneAction:
918+
case swift::FrontendOptions::ActionType::Parse:
919+
case swift::FrontendOptions::ActionType::ResolveImports:
920+
case swift::FrontendOptions::ActionType::DumpParse:
921+
case swift::FrontendOptions::ActionType::DumpInterfaceHash:
922+
case swift::FrontendOptions::ActionType::DumpAST:
923+
case swift::FrontendOptions::ActionType::PrintAST:
924+
case swift::FrontendOptions::ActionType::PrintASTDecl:
925+
case swift::FrontendOptions::ActionType::DumpScopeMaps:
926+
case swift::FrontendOptions::ActionType::DumpAvailabilityScopes:
927+
case swift::FrontendOptions::ActionType::EmitImportedModules:
928+
case swift::FrontendOptions::ActionType::EmitPCH:
929+
case swift::FrontendOptions::ActionType::EmitModuleOnly:
930+
case swift::FrontendOptions::ActionType::MergeModules:
931+
case swift::FrontendOptions::ActionType::CompileModuleFromInterface:
932+
case swift::FrontendOptions::ActionType::TypecheckModuleFromInterface:
933+
case swift::FrontendOptions::ActionType::EmitSIBGen:
934+
case swift::FrontendOptions::ActionType::EmitSIB:
935+
case swift::FrontendOptions::ActionType::Immediate:
936+
case swift::FrontendOptions::ActionType::REPL:
937+
case swift::FrontendOptions::ActionType::DumpTypeInfo:
938+
case swift::FrontendOptions::ActionType::EmitPCM:
939+
case swift::FrontendOptions::ActionType::DumpPCM:
940+
case swift::FrontendOptions::ActionType::ScanDependencies:
941+
case swift::FrontendOptions::ActionType::PrintVersion:
942+
case swift::FrontendOptions::ActionType::PrintFeature:
943+
return false;
944+
}
945+
}
946+
902947
bool swift::emitFineModuleTraceIfNeeded(CompilerInstance &Instance,
903948
const FrontendOptions &opts) {
904-
ModuleDecl *mainModule = Instance.getMainModule();
905-
// When lazy type checking is enabled, we may end up with a partial AST.
906-
// Walking on these partial AST completely may expose latent bugs.
907-
if (mainModule->getASTContext().TypeCheckerOpts.EnableLazyTypecheck)
949+
if (!shouldActionTypeEmitFineModuleTrace(opts.RequestedAction)) {
908950
return false;
951+
}
952+
ModuleDecl *mainModule = Instance.getMainModule();
909953
ASTContext &ctxt = mainModule->getASTContext();
910954
assert(!ctxt.hadError() &&
911955
"We should've already exited earlier if there was an error.");

test/IDE/objc_send_collector_1.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
// RUN: SWIFT_COMPILER_FINE_GRAINED_TRACE_PATH=%t/given_trace.json %target-swift-frontend -I %t/lib/swift -typecheck %s %S/Inputs/objc_send_collector_2.swift -module-name main -swift-version 5 -F %S/Inputs/mock-sdk -emit-loaded-module-trace-path %t/.MODULE_TRACE
88
// RUN: cat %t/given_trace.json | %{python} -c 'import json, sys; json.dump(json.loads(sys.stdin.read()), sys.stdout, sort_keys=True, indent=2)' | %FileCheck %s
99

10-
// RUN: SWIFT_COMPILER_FINE_GRAINED_TRACE_PATH=%t/given_trace_2.json %target-swift-frontend -I %t/lib/swift -typecheck %s %S/Inputs/objc_send_collector_2.swift -module-name main -swift-version 5 -F %S/Inputs/mock-sdk -emit-loaded-module-trace-path %t/.MODULE_TRACE -enable-library-evolution -experimental-lazy-typecheck
10+
// RUN: SWIFT_COMPILER_FINE_GRAINED_TRACE_PATH=%t/given_trace_2.json %target-swift-frontend -I %t/lib/swift -emit-module %s %S/Inputs/objc_send_collector_2.swift -module-name main -swift-version 5 -F %S/Inputs/mock-sdk -emit-loaded-module-trace-path %t/.MODULE_TRACE -enable-library-evolution
1111
// RUN: not ls %t/given_trace_2.json
1212

1313
// REQUIRES: objc_interop

0 commit comments

Comments
 (0)