22
22
#include " swift/Basic/FileTypes.h"
23
23
#include " swift/Basic/JSONSerialization.h"
24
24
#include " swift/Basic/SourceManager.h"
25
+ #include " swift/Frontend/Frontend.h"
25
26
#include " swift/Frontend/FrontendOptions.h"
26
27
#include " swift/Frontend/ModuleInterfaceSupport.h"
27
28
#include " swift/IDE/SourceEntityWalker.h"
@@ -853,7 +854,8 @@ class ObjcMethodReferenceCollector: public SourceEntityWalker {
853
854
}
854
855
};
855
856
856
- static void createFineModuleTraceFile (const InputFile &input, ModuleDecl *MD) {
857
+ static void createFineModuleTraceFile (CompilerInstance &instance,
858
+ const InputFile &input) {
857
859
StringRef tracePath = input.getFineModuleTracePath ();
858
860
if (tracePath.empty ()) {
859
861
// we basically rely on the passing down of module trace file path
@@ -862,27 +864,8 @@ static void createFineModuleTraceFile(const InputFile &input, ModuleDecl *MD) {
862
864
// specifically.
863
865
return ;
864
866
}
867
+ ModuleDecl *MD = instance.getMainModule ();
865
868
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
- }
886
869
// Write output via atomic append.
887
870
llvm::vfs::OutputConfig config;
888
871
config.setAppend ().setAtomicWrite ();
@@ -893,10 +876,11 @@ static void createFineModuleTraceFile(const InputFile &input, ModuleDecl *MD) {
893
876
return ;
894
877
}
895
878
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
+ });
900
884
901
885
// print this json line.
902
886
std::string stringBuffer;
@@ -915,14 +899,63 @@ static void createFineModuleTraceFile(const InputFile &input, ModuleDecl *MD) {
915
899
}
916
900
}
917
901
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,
919
948
const FrontendOptions &opts) {
949
+ if (!shouldActionTypeEmitFineModuleTrace (opts.RequestedAction )) {
950
+ return false ;
951
+ }
952
+ ModuleDecl *mainModule = Instance.getMainModule ();
920
953
ASTContext &ctxt = mainModule->getASTContext ();
921
954
assert (!ctxt.hadError () &&
922
955
" We should've already exited earlier if there was an error." );
923
956
924
957
opts.InputsAndOutputs .forEachInput ([&](const InputFile &input) {
925
- createFineModuleTraceFile (input, mainModule );
958
+ createFineModuleTraceFile (Instance, input );
926
959
return true ;
927
960
});
928
961
return false ;
0 commit comments