Skip to content

Commit a8982e0

Browse files
authored
Merge pull request swiftlang#78117 from swiftlang/walk-in-align-with-compiler-6.1
🍒[6.1] FineModuleTracing: only collect fine-grained tracing for those source files that compiler promises to type check.
2 parents 90c6854 + f93ed00 commit a8982e0

File tree

4 files changed

+66
-29
lines changed

4 files changed

+66
-29
lines changed

lib/FrontendTool/Dependencies.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class DependencyTracker;
2323
class FrontendOptions;
2424
class InputFile;
2525
class ModuleDecl;
26+
class CompilerInstance;
2627

2728
/// Emit the names of the modules imported by \c mainModule.
2829
bool emitImportedModules(ModuleDecl *mainModule, const FrontendOptions &opts,
@@ -32,7 +33,7 @@ bool emitLoadedModuleTraceIfNeeded(ModuleDecl *mainModule,
3233
const FrontendOptions &opts,
3334
const InputFile &input);
3435

35-
bool emitFineModuleTraceIfNeeded(ModuleDecl *mainModule,
36+
bool emitFineModuleTraceIfNeeded(CompilerInstance &Instance,
3637
const FrontendOptions &opts);
3738

3839
} // end namespace swift

lib/FrontendTool/FrontendTool.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1001,7 +1001,7 @@ static void performEndOfPipelineActions(CompilerInstance &Instance) {
10011001
Instance.getMainModule(), Instance.getDependencyTracker(), opts);
10021002

10031003
dumpAPIIfNeeded(Instance);
1004-
swift::emitFineModuleTraceIfNeeded(Instance.getMainModule(), opts);
1004+
swift::emitFineModuleTraceIfNeeded(Instance, opts);
10051005
}
10061006

10071007
// Contains the hadError checks internally, we still want to output the

lib/FrontendTool/LoadedModuleTrace.cpp

Lines changed: 60 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "swift/Basic/FileTypes.h"
2323
#include "swift/Basic/JSONSerialization.h"
2424
#include "swift/Basic/SourceManager.h"
25+
#include "swift/Frontend/Frontend.h"
2526
#include "swift/Frontend/FrontendOptions.h"
2627
#include "swift/Frontend/ModuleInterfaceSupport.h"
2728
#include "swift/IDE/SourceEntityWalker.h"
@@ -853,7 +854,8 @@ class ObjcMethodReferenceCollector: public SourceEntityWalker {
853854
}
854855
};
855856

856-
static void createFineModuleTraceFile(const InputFile &input, ModuleDecl *MD) {
857+
static void createFineModuleTraceFile(CompilerInstance &instance,
858+
const InputFile &input) {
857859
StringRef tracePath = input.getFineModuleTracePath();
858860
if (tracePath.empty()) {
859861
// we basically rely on the passing down of module trace file path
@@ -862,27 +864,8 @@ static void createFineModuleTraceFile(const InputFile &input, ModuleDecl *MD) {
862864
// specifically.
863865
return;
864866
}
867+
ModuleDecl *MD = instance.getMainModule();
865868
auto &ctx = MD->getASTContext();
866-
std::vector<SourceFile*> filesToWalk;
867-
for (auto *FU : MD->getFiles()) {
868-
if (auto *SF = dyn_cast<SourceFile>(FU)) {
869-
switch (SF->Kind) {
870-
case swift::SourceFileKind::Library:
871-
case swift::SourceFileKind::Main:
872-
case swift::SourceFileKind::MacroExpansion:
873-
case swift::SourceFileKind::DefaultArgument:
874-
filesToWalk.push_back(SF);
875-
LLVM_FALLTHROUGH;
876-
case swift::SourceFileKind::SIL:
877-
case swift::SourceFileKind::Interface:
878-
continue;
879-
}
880-
}
881-
}
882-
// No source files to walk, abort.
883-
if (filesToWalk.empty()) {
884-
return;
885-
}
886869
// Write output via atomic append.
887870
llvm::vfs::OutputConfig config;
888871
config.setAppend().setAtomicWrite();
@@ -893,10 +876,11 @@ static void createFineModuleTraceFile(const InputFile &input, ModuleDecl *MD) {
893876
return;
894877
}
895878
ObjcMethodReferenceCollector collector(MD);
896-
for (auto *SF: filesToWalk) {
897-
collector.setFileBeforeVisiting(SF);
898-
collector.walk(*SF);
899-
}
879+
instance.forEachFileToTypeCheck([&](SourceFile& SF) {
880+
collector.setFileBeforeVisiting(&SF);
881+
collector.walk(SF);
882+
return false;
883+
});
900884

901885
// print this json line.
902886
std::string stringBuffer;
@@ -915,14 +899,63 @@ static void createFineModuleTraceFile(const InputFile &input, ModuleDecl *MD) {
915899
}
916900
}
917901

918-
bool swift::emitFineModuleTraceIfNeeded(ModuleDecl *mainModule,
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+
947+
bool swift::emitFineModuleTraceIfNeeded(CompilerInstance &Instance,
919948
const FrontendOptions &opts) {
949+
if (!shouldActionTypeEmitFineModuleTrace(opts.RequestedAction)) {
950+
return false;
951+
}
952+
ModuleDecl *mainModule = Instance.getMainModule();
920953
ASTContext &ctxt = mainModule->getASTContext();
921954
assert(!ctxt.hadError() &&
922955
"We should've already exited earlier if there was an error.");
923956

924957
opts.InputsAndOutputs.forEachInput([&](const InputFile &input) {
925-
createFineModuleTraceFile(input, mainModule);
958+
createFineModuleTraceFile(Instance, input);
926959
return true;
927960
});
928961
return false;

test/IDE/objc_send_collector_1.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
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 -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
11+
// RUN: not ls %t/given_trace_2.json
12+
1013
// REQUIRES: objc_interop
1114

1215
import Foo

0 commit comments

Comments
 (0)