Skip to content

Commit a3660f2

Browse files
committed
[SILGen] Merge the two SILGen requests
They both do essentially the same thing, with the single-file request being the single-element case of the whole-module request, with only the call to `getAllForModule` really caring about the difference.
1 parent 9a940a7 commit a3660f2

File tree

4 files changed

+32
-73
lines changed

4 files changed

+32
-73
lines changed

include/swift/AST/SILGenRequests.h

+4-25
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,10 @@ void simple_display(llvm::raw_ostream &out, const SILGenDescriptor &d);
8787

8888
SourceLoc extractNearestSourceLoc(const SILGenDescriptor &desc);
8989

90-
class SILGenSourceFileRequest :
91-
public SimpleRequest<SILGenSourceFileRequest,
92-
std::unique_ptr<SILModule>(SILGenDescriptor),
93-
RequestFlags::Uncached|RequestFlags::DependencySource> {
90+
class SILGenerationRequest
91+
: public SimpleRequest<
92+
SILGenerationRequest, std::unique_ptr<SILModule>(SILGenDescriptor),
93+
RequestFlags::Uncached | RequestFlags::DependencySource> {
9494
public:
9595
using SimpleRequest::SimpleRequest;
9696

@@ -101,33 +101,12 @@ class SILGenSourceFileRequest :
101101
std::unique_ptr<SILModule>
102102
evaluate(Evaluator &evaluator, SILGenDescriptor desc) const;
103103

104-
public:
105-
bool isCached() const { return true; }
106-
107104
public:
108105
// Incremental dependencies.
109106
evaluator::DependencySource
110107
readDependencySource(const evaluator::DependencyCollector &) const;
111108
};
112109

113-
class SILGenWholeModuleRequest :
114-
public SimpleRequest<SILGenWholeModuleRequest,
115-
std::unique_ptr<SILModule>(SILGenDescriptor),
116-
RequestFlags::Uncached> {
117-
public:
118-
using SimpleRequest::SimpleRequest;
119-
120-
private:
121-
friend SimpleRequest;
122-
123-
// Evaluation.
124-
std::unique_ptr<SILModule>
125-
evaluate(Evaluator &evaluator, SILGenDescriptor desc) const;
126-
127-
public:
128-
bool isCached() const { return true; }
129-
};
130-
131110
/// Parses a .sil file into a SILModule.
132111
class ParseSILModuleRequest
133112
: public SimpleRequest<ParseSILModuleRequest,

include/swift/AST/SILGenTypeIDZone.def

+1-4
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@
1414
//
1515
//===----------------------------------------------------------------------===//
1616

17-
SWIFT_REQUEST(SILGen, SILGenSourceFileRequest,
18-
std::unique_ptr<SILModule>(SILGenDescriptor),
19-
Uncached, NoLocationInfo)
20-
SWIFT_REQUEST(SILGen, SILGenWholeModuleRequest,
17+
SWIFT_REQUEST(SILGen, SILGenerationRequest,
2118
std::unique_ptr<SILModule>(SILGenDescriptor),
2219
Uncached, NoLocationInfo)
2320
SWIFT_REQUEST(SILGen, ParseSILModuleRequest,

lib/SILGen/SILGen.cpp

+18-39
Original file line numberDiff line numberDiff line change
@@ -1837,7 +1837,7 @@ class SILGenModuleRAII {
18371837
}
18381838
}
18391839

1840-
SILGenModuleRAII(SILModule &M, ModuleDecl *SM) : SGM{M, SM} {}
1840+
explicit SILGenModuleRAII(SILModule &M) : SGM{M, M.getSwiftModule()} {}
18411841

18421842
~SILGenModuleRAII() {
18431843
// Emit any delayed definitions that were forced.
@@ -1860,70 +1860,49 @@ class SILGenModuleRAII {
18601860
} // end anonymous namespace
18611861

18621862
std::unique_ptr<SILModule>
1863-
SILGenSourceFileRequest::evaluate(Evaluator &evaluator,
1864-
SILGenDescriptor desc) const {
1863+
SILGenerationRequest::evaluate(Evaluator &evaluator,
1864+
SILGenDescriptor desc) const {
18651865
// If we have a .sil file to parse, defer to the parsing request.
18661866
if (desc.getSourceFileToParse()) {
18671867
return llvm::cantFail(evaluator(ParseSILModuleRequest{desc}));
18681868
}
18691869

1870-
auto *unit = desc.context.get<FileUnit *>();
1871-
auto *mod = unit->getParentModule();
1872-
auto M = SILModule::createEmptyModule(desc.context, desc.conv, desc.opts);
1873-
SILGenModuleRAII scope(*M, mod);
1870+
// Otherwise perform SIL generation of the passed SourceFiles.
1871+
auto silMod = SILModule::createEmptyModule(desc.context, desc.conv,
1872+
desc.opts);
1873+
SILGenModuleRAII scope(*silMod);
18741874

1875-
if (auto *file = dyn_cast<SourceFile>(unit)) {
1876-
scope.emitSourceFile(file);
1877-
} else if (auto *file = dyn_cast<SerializedASTFile>(unit)) {
1878-
if (file->isSIB())
1879-
M->getSILLoader()->getAllForModule(mod->getName(), file);
1880-
}
1881-
1882-
return M;
1883-
}
1884-
1885-
std::unique_ptr<SILModule>
1886-
SILGenWholeModuleRequest::evaluate(Evaluator &evaluator,
1887-
SILGenDescriptor desc) const {
1888-
// If we have a .sil file to parse, defer to the parsing request.
1889-
if (desc.getSourceFileToParse()) {
1890-
return llvm::cantFail(evaluator(ParseSILModuleRequest{desc}));
1891-
}
1892-
1893-
auto *mod = desc.context.get<ModuleDecl *>();
1894-
auto M = SILModule::createEmptyModule(desc.context, desc.conv, desc.opts);
1895-
SILGenModuleRAII scope(*M, mod);
1896-
1897-
for (auto file : mod->getFiles()) {
1875+
for (auto file : desc.getFiles()) {
18981876
if (auto *nextSF = dyn_cast<SourceFile>(file))
18991877
scope.emitSourceFile(nextSF);
19001878
}
19011879

1902-
// Also make sure to process any intermediate files that may contain SIL
1903-
bool hasSIB = std::any_of(mod->getFiles().begin(),
1904-
mod->getFiles().end(),
1905-
[](const FileUnit *File) -> bool {
1880+
// Also make sure to process any intermediate files that may contain SIL.
1881+
bool hasSIB = llvm::any_of(desc.getFiles(), [](const FileUnit *File) -> bool {
19061882
auto *SASTF = dyn_cast<SerializedASTFile>(File);
19071883
return SASTF && SASTF->isSIB();
19081884
});
1909-
if (hasSIB)
1910-
M->getSILLoader()->getAllForModule(mod->getName(), nullptr);
1885+
if (hasSIB) {
1886+
auto primary = desc.context.dyn_cast<FileUnit *>();
1887+
silMod->getSILLoader()->getAllForModule(silMod->getSwiftModule()->getName(),
1888+
primary);
1889+
}
19111890

1912-
return M;
1891+
return silMod;
19131892
}
19141893

19151894
std::unique_ptr<SILModule>
19161895
swift::performSILGeneration(ModuleDecl *mod, Lowering::TypeConverter &tc,
19171896
const SILOptions &options) {
19181897
auto desc = SILGenDescriptor::forWholeModule(mod, tc, options);
19191898
return llvm::cantFail(
1920-
mod->getASTContext().evaluator(SILGenWholeModuleRequest{desc}));
1899+
mod->getASTContext().evaluator(SILGenerationRequest{desc}));
19211900
}
19221901

19231902
std::unique_ptr<SILModule>
19241903
swift::performSILGeneration(FileUnit &sf, Lowering::TypeConverter &tc,
19251904
const SILOptions &options) {
19261905
auto desc = SILGenDescriptor::forFile(sf, tc, options);
19271906
return llvm::cantFail(
1928-
sf.getASTContext().evaluator(SILGenSourceFileRequest{desc}));
1907+
sf.getASTContext().evaluator(SILGenerationRequest{desc}));
19291908
}

lib/SILGen/SILGenRequests.cpp

+9-5
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,18 @@ SourceLoc swift::extractNearestSourceLoc(const SILGenDescriptor &desc) {
4646
return SourceLoc();
4747
}
4848

49-
evaluator::DependencySource SILGenSourceFileRequest::readDependencySource(
49+
evaluator::DependencySource SILGenerationRequest::readDependencySource(
5050
const evaluator::DependencyCollector &e) const {
5151
auto &desc = std::get<0>(getStorage());
52+
53+
// We don't track dependencies in whole-module mode.
54+
if (auto *mod = desc.context.dyn_cast<ModuleDecl *>()) {
55+
return {nullptr, e.getActiveSourceScope()};
56+
}
57+
58+
// If we have a single source file, it's the source of dependencies.
5259
auto *unit = desc.context.get<FileUnit *>();
53-
return {
54-
dyn_cast_or_null<SourceFile>(unit),
55-
evaluator::DependencyScope::Cascading
56-
};
60+
return {dyn_cast<SourceFile>(unit), evaluator::DependencyScope::Cascading};
5761
}
5862

5963
ArrayRef<FileUnit *> SILGenDescriptor::getFiles() const {

0 commit comments

Comments
 (0)