@@ -889,14 +889,16 @@ static void runIRGenPreparePasses(SILModule &Module,
889889
890890// / Generates LLVM IR, runs the LLVM passes and produces the output file.
891891// / All this is done in a single thread.
892- static GeneratedModule
893- performIRGeneration (const IRGenOptions &Opts, ModuleDecl *M,
894- std::unique_ptr<SILModule> SILMod, StringRef ModuleName,
895- const PrimarySpecificPaths &PSPs,
896- StringRef PrivateDiscriminator,
897- SourceFile *SF = nullptr ,
898- llvm::GlobalVariable **outModuleHash = nullptr ,
899- llvm::StringSet<> *linkerDirectives = nullptr ) {
892+ GeneratedModule IRGenRequest::evaluate (Evaluator &evaluator,
893+ IRGenDescriptor desc) const {
894+ const auto &Opts = desc.Opts ;
895+ const auto &PSPs = desc.PSPs ;
896+
897+ auto SILMod = std::unique_ptr<SILModule>(desc.SILMod );
898+ auto *M = desc.getParentModule ();
899+ auto filesToEmit = desc.getFiles ();
900+ auto *primaryFile = desc.Ctx .dyn_cast <SourceFile *>();
901+
900902 auto &Ctx = M->getASTContext ();
901903 assert (!Ctx.hadError ());
902904
@@ -906,9 +908,9 @@ performIRGeneration(const IRGenOptions &Opts, ModuleDecl *M,
906908 if (!targetMachine) return GeneratedModule::null ();
907909
908910 // Create the IR emitter.
909- IRGenModule IGM (irgen, std::move (targetMachine), SF, ModuleName,
911+ IRGenModule IGM (irgen, std::move (targetMachine), primaryFile, desc. ModuleName ,
910912 PSPs.OutputFilename , PSPs.MainInputFilenameForDebugInfo ,
911- PrivateDiscriminator);
913+ desc. PrivateDiscriminator );
912914
913915 initLLVMModule (IGM, *SILMod);
914916
@@ -919,25 +921,17 @@ performIRGeneration(const IRGenOptions &Opts, ModuleDecl *M,
919921 FrontendStatsTracer tracer (Ctx.Stats , " IRGen" );
920922
921923 // Emit the module contents.
922- irgen.emitGlobalTopLevel (linkerDirectives);
923-
924- if (SF) {
925- IGM.emitSourceFile (*SF);
926- // Emit synthesized file unit, if it exists.
927- if (auto *synthesizedFile = SF->getSynthesizedFile ())
928- IGM.emitSynthesizedFileUnit (*synthesizedFile);
929- } else {
930- for (auto *File : M->getFiles ()) {
931- if (auto *nextSF = dyn_cast<SourceFile>(File)) {
932- if (nextSF->ASTStage >= SourceFile::TypeChecked)
933- IGM.emitSourceFile (*nextSF);
934- } else if (auto *nextSFU = dyn_cast<SynthesizedFileUnit>(File)) {
935- IGM.emitSynthesizedFileUnit (*nextSFU);
936- } else {
937- File->collectLinkLibraries ([&IGM](LinkLibrary LinkLib) {
938- IGM.addLinkLibrary (LinkLib);
939- });
940- }
924+ irgen.emitGlobalTopLevel (desc.LinkerDirectives );
925+
926+ for (auto *file : filesToEmit) {
927+ if (auto *nextSF = dyn_cast<SourceFile>(file)) {
928+ IGM.emitSourceFile (*nextSF);
929+ } else if (auto *nextSFU = dyn_cast<SynthesizedFileUnit>(file)) {
930+ IGM.emitSynthesizedFileUnit (*nextSFU);
931+ } else {
932+ file->collectLinkLibraries ([&IGM](LinkLibrary LinkLib) {
933+ IGM.addLinkLibrary (LinkLib);
934+ });
941935 }
942936 }
943937
@@ -990,7 +984,7 @@ performIRGeneration(const IRGenOptions &Opts, ModuleDecl *M,
990984
991985 embedBitcode (IGM.getModule (), Opts);
992986
993- if (outModuleHash) {
987+ if (auto **outModuleHash = desc. outModuleHash ) {
994988 *outModuleHash = IGM.ModuleHash ;
995989 } else {
996990 FrontendStatsTracer tracer (Ctx.Stats , " LLVM pipeline" );
@@ -1138,7 +1132,7 @@ static void performParallelIRGeneration(
11381132 bool DidRunSILCodeGenPreparePasses = false ;
11391133 for (auto *File : M->getFiles ()) {
11401134 auto nextSF = dyn_cast<SourceFile>(File);
1141- if (!nextSF || nextSF-> ASTStage < SourceFile::TypeChecked )
1135+ if (!nextSF)
11421136 continue ;
11431137
11441138 // There must be an output filename for each source file.
@@ -1286,7 +1280,7 @@ static void performParallelIRGeneration(
12861280
12871281 // Start all the threads and do the LLVM compilation.
12881282
1289- LLVMCodeGenThreads codeGenThreads (&irgen, &DiagMutex, SILMod-> getOptions () .NumThreads - 1 );
1283+ LLVMCodeGenThreads codeGenThreads (&irgen, &DiagMutex, Opts .NumThreads - 1 );
12901284 codeGenThreads.startThreads ();
12911285
12921286 // Free the memory occupied by the SILModule.
@@ -1307,30 +1301,19 @@ GeneratedModule swift::performIRGeneration(
13071301 const PrimarySpecificPaths &PSPs,
13081302 ArrayRef<std::string> parallelOutputFilenames,
13091303 llvm::GlobalVariable **outModuleHash, llvm::StringSet<> *LinkerDirectives) {
1310- auto desc = IRGenDescriptor::forWholeModule (
1311- Opts, M, std::move (SILMod), ModuleName, PSPs,
1312- parallelOutputFilenames, outModuleHash, LinkerDirectives);
1313- return llvm::cantFail (
1314- M->getASTContext ().evaluator (IRGenWholeModuleRequest{desc}));
1315- }
1316-
1317- GeneratedModule
1318- IRGenWholeModuleRequest::evaluate (Evaluator &evaluator,
1319- IRGenDescriptor desc) const {
1320- auto *M = desc.Ctx .get <ModuleDecl *>();
1321- if (desc.SILMod ->getOptions ().shouldPerformIRGenerationInParallel () &&
1322- !desc.parallelOutputFilenames .empty ()) {
1323- ::performParallelIRGeneration (
1324- desc.Opts, M, std::unique_ptr<SILModule>(desc.SILMod), desc.ModuleName,
1325- desc.parallelOutputFilenames, desc.LinkerDirectives);
1304+ if (Opts.shouldPerformIRGenerationInParallel () &&
1305+ !parallelOutputFilenames.empty ()) {
1306+ ::performParallelIRGeneration (Opts, M, std::move(SILMod), ModuleName,
1307+ parallelOutputFilenames, LinkerDirectives);
13261308 // TODO: Parallel LLVM compilation cannot be used if a (single) module is
13271309 // needed as return value.
13281310 return GeneratedModule::null ();
13291311 }
1330- return ::performIRGeneration (
1331- desc.Opts , M, std::unique_ptr<SILModule>(desc.SILMod ), desc.ModuleName ,
1332- desc.PSPs , " " , nullptr , desc.outModuleHash ,
1333- desc.LinkerDirectives );
1312+
1313+ auto desc = IRGenDescriptor::forWholeModule (
1314+ Opts, M, std::move (SILMod), ModuleName, PSPs, parallelOutputFilenames,
1315+ outModuleHash, LinkerDirectives);
1316+ return llvm::cantFail (M->getASTContext ().evaluator (IRGenRequest{desc}));
13341317}
13351318
13361319GeneratedModule swift::
@@ -1343,18 +1326,7 @@ performIRGeneration(const IRGenOptions &Opts, SourceFile &SF,
13431326 auto desc = IRGenDescriptor::forFile (Opts, SF, std::move (SILMod), ModuleName,
13441327 PSPs, PrivateDiscriminator,
13451328 outModuleHash, LinkerDirectives);
1346- return llvm::cantFail (
1347- SF.getASTContext ().evaluator (IRGenSourceFileRequest{desc}));
1348- }
1349-
1350- GeneratedModule
1351- IRGenSourceFileRequest::evaluate (Evaluator &evaluator,
1352- IRGenDescriptor desc) const {
1353- auto *SF = desc.Ctx .get <SourceFile *>();
1354- return ::performIRGeneration (
1355- desc.Opts , SF->getParentModule (), std::unique_ptr<SILModule>(desc.SILMod ),
1356- desc.ModuleName , desc.PSPs , desc.PrivateDiscriminator ,
1357- SF, desc.outModuleHash , desc.LinkerDirectives );
1329+ return llvm::cantFail (SF.getASTContext ().evaluator (IRGenRequest{desc}));
13581330}
13591331
13601332void
0 commit comments