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 ;
0 commit comments