@@ -889,14 +889,16 @@ static void runIRGenPreparePasses(SILModule &Module,
889
889
890
890
// / Generates LLVM IR, runs the LLVM passes and produces the output file.
891
891
// / 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
+
900
902
auto &Ctx = M->getASTContext ();
901
903
assert (!Ctx.hadError ());
902
904
@@ -906,9 +908,9 @@ performIRGeneration(const IRGenOptions &Opts, ModuleDecl *M,
906
908
if (!targetMachine) return GeneratedModule::null ();
907
909
908
910
// Create the IR emitter.
909
- IRGenModule IGM (irgen, std::move (targetMachine), SF, ModuleName,
911
+ IRGenModule IGM (irgen, std::move (targetMachine), primaryFile, desc. ModuleName ,
910
912
PSPs.OutputFilename , PSPs.MainInputFilenameForDebugInfo ,
911
- PrivateDiscriminator);
913
+ desc. PrivateDiscriminator );
912
914
913
915
initLLVMModule (IGM, *SILMod);
914
916
@@ -919,25 +921,17 @@ performIRGeneration(const IRGenOptions &Opts, ModuleDecl *M,
919
921
FrontendStatsTracer tracer (Ctx.Stats , " IRGen" );
920
922
921
923
// 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
+ });
941
935
}
942
936
}
943
937
@@ -990,7 +984,7 @@ performIRGeneration(const IRGenOptions &Opts, ModuleDecl *M,
990
984
991
985
embedBitcode (IGM.getModule (), Opts);
992
986
993
- if (outModuleHash) {
987
+ if (auto **outModuleHash = desc. outModuleHash ) {
994
988
*outModuleHash = IGM.ModuleHash ;
995
989
} else {
996
990
FrontendStatsTracer tracer (Ctx.Stats , " LLVM pipeline" );
@@ -1138,7 +1132,7 @@ static void performParallelIRGeneration(
1138
1132
bool DidRunSILCodeGenPreparePasses = false ;
1139
1133
for (auto *File : M->getFiles ()) {
1140
1134
auto nextSF = dyn_cast<SourceFile>(File);
1141
- if (!nextSF || nextSF-> ASTStage < SourceFile::TypeChecked )
1135
+ if (!nextSF)
1142
1136
continue ;
1143
1137
1144
1138
// There must be an output filename for each source file.
@@ -1286,7 +1280,7 @@ static void performParallelIRGeneration(
1286
1280
1287
1281
// Start all the threads and do the LLVM compilation.
1288
1282
1289
- LLVMCodeGenThreads codeGenThreads (&irgen, &DiagMutex, SILMod-> getOptions () .NumThreads - 1 );
1283
+ LLVMCodeGenThreads codeGenThreads (&irgen, &DiagMutex, Opts .NumThreads - 1 );
1290
1284
codeGenThreads.startThreads ();
1291
1285
1292
1286
// Free the memory occupied by the SILModule.
@@ -1307,30 +1301,19 @@ GeneratedModule swift::performIRGeneration(
1307
1301
const PrimarySpecificPaths &PSPs,
1308
1302
ArrayRef<std::string> parallelOutputFilenames,
1309
1303
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);
1326
1308
// TODO: Parallel LLVM compilation cannot be used if a (single) module is
1327
1309
// needed as return value.
1328
1310
return GeneratedModule::null ();
1329
1311
}
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}));
1334
1317
}
1335
1318
1336
1319
GeneratedModule swift::
@@ -1343,18 +1326,7 @@ performIRGeneration(const IRGenOptions &Opts, SourceFile &SF,
1343
1326
auto desc = IRGenDescriptor::forFile (Opts, SF, std::move (SILMod), ModuleName,
1344
1327
PSPs, PrivateDiscriminator,
1345
1328
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}));
1358
1330
}
1359
1331
1360
1332
void
0 commit comments