Skip to content

Commit c65246f

Browse files
committed
Merge the IRGen requests
Similar to SILGen, merge `IRGenSourceFileRequest` and `IRGenWholeModuleRequest` into a single `IRGenRequest`.
1 parent fa71582 commit c65246f

File tree

4 files changed

+78
-96
lines changed

4 files changed

+78
-96
lines changed

include/swift/AST/IRGenRequests.h

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,13 @@ struct IRGenDescriptor {
172172
outModuleHash,
173173
LinkerDirectives};
174174
}
175+
176+
/// Retrieves the files to perform IR generation for.
177+
TinyPtrVector<FileUnit *> getFiles() const;
178+
179+
/// For a single file, returns its parent module, otherwise returns the module
180+
/// itself.
181+
ModuleDecl *getParentModule() const;
175182
};
176183

177184
/// Report that a request of the given kind is being evaluated, so it
@@ -180,10 +187,10 @@ template<typename Request>
180187
void reportEvaluatedRequest(UnifiedStatsReporter &stats,
181188
const Request &request);
182189

183-
class IRGenSourceFileRequest
184-
: public SimpleRequest<IRGenSourceFileRequest,
185-
GeneratedModule(IRGenDescriptor),
186-
RequestFlags::Uncached|RequestFlags::DependencySource> {
190+
class IRGenRequest
191+
: public SimpleRequest<IRGenRequest, GeneratedModule(IRGenDescriptor),
192+
RequestFlags::Uncached |
193+
RequestFlags::DependencySource> {
187194
public:
188195
using SimpleRequest::SimpleRequest;
189196

@@ -194,33 +201,12 @@ class IRGenSourceFileRequest
194201
GeneratedModule
195202
evaluate(Evaluator &evaluator, IRGenDescriptor desc) const;
196203

197-
public:
198-
bool isCached() const { return true; }
199-
200204
public:
201205
// Incremental dependencies.
202206
evaluator::DependencySource
203207
readDependencySource(const evaluator::DependencyRecorder &) const;
204208
};
205209

206-
class IRGenWholeModuleRequest
207-
: public SimpleRequest<IRGenWholeModuleRequest,
208-
GeneratedModule(IRGenDescriptor),
209-
RequestFlags::Uncached> {
210-
public:
211-
using SimpleRequest::SimpleRequest;
212-
213-
private:
214-
friend SimpleRequest;
215-
216-
// Evaluation.
217-
GeneratedModule
218-
evaluate(Evaluator &evaluator, IRGenDescriptor desc) const;
219-
220-
public:
221-
bool isCached() const { return true; }
222-
};
223-
224210
void simple_display(llvm::raw_ostream &out, const IRGenDescriptor &d);
225211

226212
SourceLoc extractNearestSourceLoc(const IRGenDescriptor &desc);

include/swift/AST/IRGenTypeIDZone.def

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@
1414
//
1515
//===----------------------------------------------------------------------===//
1616

17-
SWIFT_REQUEST(IRGen, IRGenSourceFileRequest,
17+
SWIFT_REQUEST(IRGen, IRGenRequest,
1818
GeneratedModule(IRGenDescriptor),
1919
Uncached, NoLocationInfo)
20-
SWIFT_REQUEST(IRGen, IRGenWholeModuleRequest,
21-
GeneratedModule(IRGenDescriptor),
22-
Uncached, NoLocationInfo)
23-

lib/IRGen/IRGen.cpp

Lines changed: 34 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -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,24 +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-
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+
});
940935
}
941936
}
942937

@@ -989,7 +984,7 @@ performIRGeneration(const IRGenOptions &Opts, ModuleDecl *M,
989984

990985
embedBitcode(IGM.getModule(), Opts);
991986

992-
if (outModuleHash) {
987+
if (auto **outModuleHash = desc.outModuleHash) {
993988
*outModuleHash = IGM.ModuleHash;
994989
} else {
995990
FrontendStatsTracer tracer(Ctx.Stats, "LLVM pipeline");
@@ -1306,30 +1301,19 @@ GeneratedModule swift::performIRGeneration(
13061301
const PrimarySpecificPaths &PSPs,
13071302
ArrayRef<std::string> parallelOutputFilenames,
13081303
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);
13251308
// TODO: Parallel LLVM compilation cannot be used if a (single) module is
13261309
// needed as return value.
13271310
return GeneratedModule::null();
13281311
}
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}));
13331317
}
13341318

13351319
GeneratedModule swift::
@@ -1342,18 +1326,7 @@ performIRGeneration(const IRGenOptions &Opts, SourceFile &SF,
13421326
auto desc = IRGenDescriptor::forFile(Opts, SF, std::move(SILMod), ModuleName,
13431327
PSPs, PrivateDiscriminator,
13441328
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}));
13571330
}
13581331

13591332
void

lib/IRGen/IRGenRequests.cpp

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,40 @@ SourceLoc swift::extractNearestSourceLoc(const IRGenDescriptor &desc) {
5252
return SourceLoc();
5353
}
5454

55-
evaluator::DependencySource IRGenSourceFileRequest::readDependencySource(
55+
TinyPtrVector<FileUnit *> IRGenDescriptor::getFiles() const {
56+
// For a whole module, we emit IR for all files.
57+
if (auto *mod = Ctx.dyn_cast<ModuleDecl *>())
58+
return TinyPtrVector<FileUnit *>(mod->getFiles());
59+
60+
// For a primary source file, we emit IR for both it and potentially its
61+
// SynthesizedFileUnit.
62+
auto *SF = Ctx.get<SourceFile *>();
63+
TinyPtrVector<FileUnit *> files;
64+
files.push_back(SF);
65+
66+
if (auto *synthesizedFile = SF->getSynthesizedFile())
67+
files.push_back(synthesizedFile);
68+
69+
return files;
70+
}
71+
72+
ModuleDecl *IRGenDescriptor::getParentModule() const {
73+
if (auto *SF = Ctx.dyn_cast<SourceFile *>())
74+
return SF->getParentModule();
75+
return Ctx.get<ModuleDecl *>();
76+
}
77+
78+
evaluator::DependencySource IRGenRequest::readDependencySource(
5679
const evaluator::DependencyRecorder &e) const {
5780
auto &desc = std::get<0>(getStorage());
58-
return {
59-
desc.Ctx.dyn_cast<SourceFile *>(),
60-
evaluator::DependencyScope::Cascading
61-
};
81+
82+
// We don't track dependencies in whole-module mode.
83+
if (auto *mod = desc.Ctx.dyn_cast<ModuleDecl *>()) {
84+
return {nullptr, e.getActiveSourceScope()};
85+
}
86+
87+
auto *SF = desc.Ctx.get<SourceFile *>();
88+
return {SF, evaluator::DependencyScope::Cascading};
6289
}
6390

6491
// Define request evaluation functions for each of the IRGen requests.

0 commit comments

Comments
 (0)