Skip to content

Commit c5cd19a

Browse files
committed
[TBDGen] Split off symbol collection from TBD file generation
Refactor `TBDGenVisitor` to accept a callback for when it discovers a symbol, and split off public symbol gathering into `PublicSymbolsRequest` such that we don't need to unnecessarily also build a TBD file which we immediately throw away.
1 parent c74057a commit c5cd19a

File tree

5 files changed

+101
-43
lines changed

5 files changed

+101
-43
lines changed

include/swift/AST/TBDGenRequests.h

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
#include "swift/AST/SimpleRequest.h"
2222

2323
namespace llvm {
24+
25+
class DataLayout;
26+
class Triple;
27+
2428
namespace MachO {
2529
class InterfaceFile;
2630
} // end namespace MachO
@@ -59,6 +63,9 @@ class TBDGenDescriptor final {
5963
/// Returns the TBDGen options.
6064
const TBDGenOptions &getOptions() const { return Opts; }
6165

66+
const llvm::DataLayout &getDataLayout() const;
67+
const llvm::Triple &getTarget() const;
68+
6269
bool operator==(const TBDGenDescriptor &other) const;
6370
bool operator!=(const TBDGenDescriptor &other) const {
6471
return !(*this == other);
@@ -77,13 +84,27 @@ llvm::hash_code hash_value(const TBDGenDescriptor &desc);
7784
void simple_display(llvm::raw_ostream &out, const TBDGenDescriptor &desc);
7885
SourceLoc extractNearestSourceLoc(const TBDGenDescriptor &desc);
7986

80-
using TBDFileAndSymbols =
81-
std::pair<llvm::MachO::InterfaceFile, std::vector<std::string>>;
87+
using TBDFile = llvm::MachO::InterfaceFile;
8288

83-
/// Computes the TBD file and public symbols for a given module or file.
89+
/// Computes the TBD file for a given Swift module or file.
8490
class GenerateTBDRequest
8591
: public SimpleRequest<GenerateTBDRequest,
86-
TBDFileAndSymbols(TBDGenDescriptor),
92+
TBDFile(TBDGenDescriptor),
93+
RequestFlags::Uncached> {
94+
public:
95+
using SimpleRequest::SimpleRequest;
96+
97+
private:
98+
friend SimpleRequest;
99+
100+
// Evaluation.
101+
TBDFile evaluate(Evaluator &evaluator, TBDGenDescriptor desc) const;
102+
};
103+
104+
/// Retrieve the public symbols for a file or module.
105+
class PublicSymbolsRequest
106+
: public SimpleRequest<PublicSymbolsRequest,
107+
std::vector<std::string>(TBDGenDescriptor),
87108
RequestFlags::Uncached> {
88109
public:
89110
using SimpleRequest::SimpleRequest;
@@ -92,7 +113,8 @@ class GenerateTBDRequest
92113
friend SimpleRequest;
93114

94115
// Evaluation.
95-
TBDFileAndSymbols evaluate(Evaluator &evaluator, TBDGenDescriptor desc) const;
116+
std::vector<std::string>
117+
evaluate(Evaluator &evaluator, TBDGenDescriptor desc) const;
96118
};
97119

98120
/// Report that a request of the given kind is being evaluated, so it

include/swift/AST/TBDGenTypeIDZone.def

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,8 @@
1414
//
1515
//===----------------------------------------------------------------------===//
1616

17-
SWIFT_REQUEST(TBDGen, GenerateTBDRequest, TBDFileAndSymbols(TBDGenDescriptor),
17+
SWIFT_REQUEST(TBDGen, GenerateTBDRequest, TBDFile(TBDGenDescriptor),
18+
Uncached, NoLocationInfo)
19+
SWIFT_REQUEST(TBDGen, PublicSymbolsRequest,
20+
std::vector<std::string>(TBDGenDescriptor),
1821
Uncached, NoLocationInfo)

lib/TBDGen/TBDGen.cpp

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,21 +61,27 @@ static bool isGlobalOrStaticVar(VarDecl *VD) {
6161
return VD->isStatic() || VD->getDeclContext()->isModuleScopeContext();
6262
}
6363

64+
TBDGenVisitor::TBDGenVisitor(TBDGenDescriptor desc,
65+
SymbolCallbackFn symbolCallback)
66+
: TBDGenVisitor(desc.getTarget(), desc.getDataLayout(),
67+
desc.getParentModule(), desc.getOptions(),
68+
symbolCallback) {}
69+
6470
void TBDGenVisitor::addSymbolInternal(StringRef name,
6571
llvm::MachO::SymbolKind kind,
6672
bool isLinkerDirective) {
6773
if (!isLinkerDirective && Opts.LinkerDirectivesOnly)
6874
return;
69-
Symbols.addSymbol(kind, name, Targets);
70-
if (kind == SymbolKind::GlobalSymbol) {
71-
StringSymbols.push_back(name);
75+
7276
#ifndef NDEBUG
77+
if (kind == SymbolKind::GlobalSymbol) {
7378
if (!DuplicateSymbolChecker.insert(name).second) {
7479
llvm::dbgs() << "TBDGen duplicate symbol: " << name << '\n';
7580
assert(false && "TBDGen symbol appears twice");
7681
}
77-
#endif
7882
}
83+
#endif
84+
SymbolCallback(name, kind);
7985
}
8086

8187
static std::vector<OriginallyDefinedInAttr::ActiveVersion>
@@ -1157,21 +1163,15 @@ static bool isApplicationExtensionSafe(const LangOptions &LangOpts) {
11571163
llvm::sys::Process::GetEnv("LD_APPLICATION_EXTENSION_SAFE");
11581164
}
11591165

1160-
TBDFileAndSymbols
1161-
GenerateTBDRequest::evaluate(Evaluator &evaluator,
1162-
TBDGenDescriptor desc) const {
1166+
TBDFile GenerateTBDRequest::evaluate(Evaluator &evaluator,
1167+
TBDGenDescriptor desc) const {
11631168
auto *M = desc.getParentModule();
11641169
auto &opts = desc.getOptions();
1165-
11661170
auto &ctx = M->getASTContext();
1167-
const auto &triple = ctx.LangOpts.Target;
1168-
UniversalLinkageInfo linkInfo(triple, opts.HasMultipleIGMs,
1169-
/*forcePublicDecls*/ false);
11701171

11711172
llvm::MachO::InterfaceFile file;
11721173
file.setFileType(llvm::MachO::FileType::TBD_V4);
1173-
file.setApplicationExtensionSafe(
1174-
isApplicationExtensionSafe(M->getASTContext().LangOpts));
1174+
file.setApplicationExtensionSafe(isApplicationExtensionSafe(ctx.LangOpts));
11751175
file.setInstallName(opts.InstallName);
11761176
file.setTwoLevelNamespace();
11771177
file.setSwiftABIVersion(irgen::getSwiftABIVersion());
@@ -1187,29 +1187,47 @@ GenerateTBDRequest::evaluate(Evaluator &evaluator,
11871187
file.setCompatibilityVersion(*packed);
11881188
}
11891189

1190-
llvm::MachO::Target target(triple);
1190+
llvm::MachO::Target target(ctx.LangOpts.Target);
11911191
file.addTarget(target);
11921192
// Add target variant
11931193
if (ctx.LangOpts.TargetVariant.hasValue()) {
11941194
llvm::MachO::Target targetVar(*ctx.LangOpts.TargetVariant);
11951195
file.addTarget(targetVar);
11961196
}
1197-
auto *clang = static_cast<ClangImporter *>(ctx.getClangModuleLoader());
1198-
TBDGenVisitor visitor(file, {target}, clang->getTargetInfo().getDataLayout(),
1199-
linkInfo, M, opts);
1197+
1198+
llvm::MachO::TargetList targets{target};
1199+
auto addSymbol = [&](StringRef symbol, SymbolKind kind) {
1200+
file.addSymbol(kind, symbol, targets);
1201+
};
1202+
1203+
TBDGenVisitor visitor(desc, addSymbol);
1204+
visitor.visit(desc);
1205+
return file;
1206+
}
1207+
1208+
std::vector<std::string>
1209+
PublicSymbolsRequest::evaluate(Evaluator &evaluator,
1210+
TBDGenDescriptor desc) const {
1211+
std::vector<std::string> symbols;
1212+
auto addSymbol = [&](StringRef symbol, SymbolKind kind) {
1213+
if (kind == SymbolKind::GlobalSymbol)
1214+
symbols.push_back(symbol.str());
1215+
};
1216+
1217+
TBDGenVisitor visitor(desc, addSymbol);
12001218
visitor.visit(desc);
1201-
return std::make_pair(std::move(file), std::move(visitor.StringSymbols));
1219+
return symbols;
12021220
}
12031221

12041222
std::vector<std::string> swift::getPublicSymbols(TBDGenDescriptor desc) {
12051223
auto &evaluator = desc.getParentModule()->getASTContext().evaluator;
1206-
return llvm::cantFail(evaluator(GenerateTBDRequest{desc})).second;
1224+
return llvm::cantFail(evaluator(PublicSymbolsRequest{desc}));
12071225
}
12081226
void swift::writeTBDFile(ModuleDecl *M, llvm::raw_ostream &os,
12091227
const TBDGenOptions &opts) {
12101228
auto &evaluator = M->getASTContext().evaluator;
12111229
auto desc = TBDGenDescriptor::forModule(M, opts);
1212-
auto file = llvm::cantFail(evaluator(GenerateTBDRequest{desc})).first;
1230+
auto file = llvm::cantFail(evaluator(GenerateTBDRequest{desc}));
12131231
llvm::cantFail(llvm::MachO::TextAPIWriter::writeToStream(os, file),
12141232
"YAML writing should be error-free");
12151233
}

lib/TBDGen/TBDGenRequests.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,14 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "swift/AST/TBDGenRequests.h"
14+
#include "swift/AST/ASTContext.h"
1415
#include "swift/AST/Evaluator.h"
1516
#include "swift/AST/FileUnit.h"
1617
#include "swift/AST/Module.h"
18+
#include "swift/ClangImporter/ClangImporter.h"
1719
#include "swift/Subsystems.h"
1820
#include "swift/TBDGen/TBDGen.h"
21+
#include "clang/Basic/TargetInfo.h"
1922
#include "llvm/TextAPI/MachO/InterfaceFile.h"
2023

2124
using namespace swift;
@@ -43,6 +46,16 @@ ModuleDecl *TBDGenDescriptor::getParentModule() const {
4346
return Input.get<FileUnit *>()->getParentModule();
4447
}
4548

49+
const llvm::DataLayout &TBDGenDescriptor::getDataLayout() const {
50+
auto &ctx = getParentModule()->getASTContext();
51+
auto *clang = static_cast<ClangImporter *>(ctx.getClangModuleLoader());
52+
return clang->getTargetInfo().getDataLayout();
53+
}
54+
55+
const llvm::Triple &TBDGenDescriptor::getTarget() const {
56+
return getParentModule()->getASTContext().LangOpts.Target;
57+
}
58+
4659
bool TBDGenDescriptor::operator==(const TBDGenDescriptor &other) const {
4760
return Input == other.Input && Opts == other.Opts;
4861
}

lib/TBDGen/TBDGenVisitor.h

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -61,21 +61,21 @@ struct InstallNameStore {
6161
};
6262

6363
class TBDGenVisitor : public ASTVisitor<TBDGenVisitor> {
64-
public:
65-
llvm::MachO::InterfaceFile &Symbols;
66-
llvm::MachO::TargetList Targets;
67-
std::vector<std::string> StringSymbols;
68-
const llvm::DataLayout &DataLayout;
69-
7064
#ifndef NDEBUG
7165
/// Tracks the symbols emitted to ensure we don't emit any duplicates.
7266
llvm::StringSet<> DuplicateSymbolChecker;
7367
#endif
7468

75-
const UniversalLinkageInfo &UniversalLinkInfo;
69+
const llvm::DataLayout &DataLayout;
70+
UniversalLinkageInfo UniversalLinkInfo;
7671
ModuleDecl *SwiftModule;
7772
const TBDGenOptions &Opts;
7873

74+
using SymbolKind = llvm::MachO::SymbolKind;
75+
using SymbolCallbackFn = llvm::function_ref<void(StringRef, SymbolKind)>;
76+
77+
SymbolCallbackFn SymbolCallback;
78+
7979
/// A set of original function and derivative configuration pairs for which
8080
/// derivative symbols have been emitted.
8181
///
@@ -84,7 +84,6 @@ class TBDGenVisitor : public ASTVisitor<TBDGenVisitor> {
8484
llvm::DenseSet<std::pair<AbstractFunctionDecl *, AutoDiffConfig>>
8585
AddedDerivatives;
8686

87-
private:
8887
std::vector<Decl*> DeclStack;
8988
std::unique_ptr<std::map<std::string, InstallNameStore>>
9089
previousInstallNameMap;
@@ -141,15 +140,18 @@ class TBDGenVisitor : public ASTVisitor<TBDGenVisitor> {
141140
AutoDiffConfig config);
142141

143142
public:
144-
TBDGenVisitor(llvm::MachO::InterfaceFile &symbols,
145-
llvm::MachO::TargetList targets,
146-
const llvm::DataLayout &dataLayout,
147-
const UniversalLinkageInfo &universalLinkInfo,
148-
ModuleDecl *swiftModule, const TBDGenOptions &opts)
149-
: Symbols(symbols), Targets(targets), DataLayout(dataLayout),
150-
UniversalLinkInfo(universalLinkInfo), SwiftModule(swiftModule),
151-
Opts(opts),
152-
previousInstallNameMap(parsePreviousModuleInstallNameMap()) {}
143+
TBDGenVisitor(const llvm::Triple &target, const llvm::DataLayout &dataLayout,
144+
ModuleDecl *swiftModule, const TBDGenOptions &opts,
145+
SymbolCallbackFn symbolCallback)
146+
: DataLayout(dataLayout),
147+
UniversalLinkInfo(target, opts.HasMultipleIGMs, /*forcePublic*/ false),
148+
SwiftModule(swiftModule), Opts(opts), SymbolCallback(symbolCallback),
149+
previousInstallNameMap(parsePreviousModuleInstallNameMap()) {}
150+
151+
/// Create a new visitor using the target and layout information from a
152+
/// TBDGenDescriptor.
153+
TBDGenVisitor(TBDGenDescriptor desc, SymbolCallbackFn symbolCallback);
154+
153155
~TBDGenVisitor() { assert(DeclStack.empty()); }
154156
void addMainIfNecessary(FileUnit *file) {
155157
// HACK: 'main' is a special symbol that's always emitted in SILGen if

0 commit comments

Comments
 (0)