@@ -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,24 +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
- IGM.emitSourceFile (*nextSF);
933
- } else if (auto *nextSFU = dyn_cast<SynthesizedFileUnit>(File)) {
934
- IGM.emitSynthesizedFileUnit (*nextSFU);
935
- } else {
936
- File->collectLinkLibraries ([&IGM](LinkLibrary LinkLib) {
937
- IGM.addLinkLibrary (LinkLib);
938
- });
939
- }
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
+ });
940
935
}
941
936
}
942
937
@@ -989,7 +984,7 @@ performIRGeneration(const IRGenOptions &Opts, ModuleDecl *M,
989
984
990
985
embedBitcode (IGM.getModule (), Opts);
991
986
992
- if (outModuleHash) {
987
+ if (auto **outModuleHash = desc. outModuleHash ) {
993
988
*outModuleHash = IGM.ModuleHash ;
994
989
} else {
995
990
FrontendStatsTracer tracer (Ctx.Stats , " LLVM pipeline" );
@@ -1306,30 +1301,19 @@ GeneratedModule swift::performIRGeneration(
1306
1301
const PrimarySpecificPaths &PSPs,
1307
1302
ArrayRef<std::string> parallelOutputFilenames,
1308
1303
llvm::GlobalVariable **outModuleHash, llvm::StringSet<> *LinkerDirectives) {
1309
- auto desc = IRGenDescriptor::forWholeModule (
1310
- Opts, M, std::move (SILMod), ModuleName, PSPs,
1311
- parallelOutputFilenames, outModuleHash, LinkerDirectives);
1312
- return llvm::cantFail (
1313
- M->getASTContext ().evaluator (IRGenWholeModuleRequest{desc}));
1314
- }
1315
-
1316
- GeneratedModule
1317
- IRGenWholeModuleRequest::evaluate (Evaluator &evaluator,
1318
- IRGenDescriptor desc) const {
1319
- auto *M = desc.Ctx .get <ModuleDecl *>();
1320
- if (desc.SILMod ->getOptions ().shouldPerformIRGenerationInParallel () &&
1321
- !desc.parallelOutputFilenames .empty ()) {
1322
- ::performParallelIRGeneration (
1323
- desc.Opts, M, std::unique_ptr<SILModule>(desc.SILMod), desc.ModuleName,
1324
- desc.parallelOutputFilenames, desc.LinkerDirectives);
1304
+ if (SILMod->getOptions ().shouldPerformIRGenerationInParallel () &&
1305
+ !parallelOutputFilenames.empty ()) {
1306
+ ::performParallelIRGeneration (Opts, M, std::move(SILMod), ModuleName,
1307
+ parallelOutputFilenames, LinkerDirectives);
1325
1308
// TODO: Parallel LLVM compilation cannot be used if a (single) module is
1326
1309
// needed as return value.
1327
1310
return GeneratedModule::null ();
1328
1311
}
1329
- return ::performIRGeneration (
1330
- desc.Opts , M, std::unique_ptr<SILModule>(desc.SILMod ), desc.ModuleName ,
1331
- desc.PSPs , " " , nullptr , desc.outModuleHash ,
1332
- 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}));
1333
1317
}
1334
1318
1335
1319
GeneratedModule swift::
@@ -1342,18 +1326,7 @@ performIRGeneration(const IRGenOptions &Opts, SourceFile &SF,
1342
1326
auto desc = IRGenDescriptor::forFile (Opts, SF, std::move (SILMod), ModuleName,
1343
1327
PSPs, PrivateDiscriminator,
1344
1328
outModuleHash, LinkerDirectives);
1345
- return llvm::cantFail (
1346
- SF.getASTContext ().evaluator (IRGenSourceFileRequest{desc}));
1347
- }
1348
-
1349
- GeneratedModule
1350
- IRGenSourceFileRequest::evaluate (Evaluator &evaluator,
1351
- IRGenDescriptor desc) const {
1352
- auto *SF = desc.Ctx .get <SourceFile *>();
1353
- return ::performIRGeneration (
1354
- desc.Opts , SF->getParentModule (), std::unique_ptr<SILModule>(desc.SILMod ),
1355
- desc.ModuleName , desc.PSPs , desc.PrivateDiscriminator ,
1356
- SF, desc.outModuleHash , desc.LinkerDirectives );
1329
+ return llvm::cantFail (SF.getASTContext ().evaluator (IRGenRequest{desc}));
1357
1330
}
1358
1331
1359
1332
void
0 commit comments