Skip to content

Commit ec184e9

Browse files
committed
[Macros] Make 'PluginSearchOption' a external union
Create a 'Kind' enum so that deserialization can use the kind instead of a string option name.
1 parent 706985d commit ec184e9

File tree

7 files changed

+138
-55
lines changed

7 files changed

+138
-55
lines changed

include/swift/AST/SearchPathOptions.h

Lines changed: 76 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
#define SWIFT_AST_SEARCHPATHOPTIONS_H
1515

1616
#include "swift/Basic/ArrayRefView.h"
17+
#include "swift/Basic/ExternalUnion.h"
1718
#include "swift/Basic/PathRemapper.h"
18-
#include "swift/Basic/TaggedUnion.h"
1919
#include "llvm/ADT/Hashing.h"
2020
#include "llvm/ADT/IntrusiveRefCntPtr.h"
2121
#include "llvm/ADT/StringMap.h"
@@ -187,25 +187,81 @@ struct ExternalPluginSearchPathAndServerPath {
187187
std::string ServerPath;
188188
};
189189

190-
namespace PluginSearchOption {
191-
struct LoadPluginLibrary {
192-
std::string LibraryPath;
193-
};
194-
struct LoadPluginExecutable {
195-
std::string ExecutablePath;
196-
std::vector<std::string> ModuleNames;
197-
};
198-
struct PluginPath {
199-
std::string SearchPath;
200-
};
201-
struct ExternalPluginPath {
202-
std::string SearchPath;
203-
std::string ServerPath;
204-
};
190+
class PluginSearchOption {
191+
public:
192+
struct LoadPluginLibrary {
193+
std::string LibraryPath;
194+
};
195+
struct LoadPluginExecutable {
196+
std::string ExecutablePath;
197+
std::vector<std::string> ModuleNames;
198+
};
199+
struct PluginPath {
200+
std::string SearchPath;
201+
};
202+
struct ExternalPluginPath {
203+
std::string SearchPath;
204+
std::string ServerPath;
205+
};
206+
207+
enum class Kind : uint8_t {
208+
LoadPluginLibrary,
209+
LoadPluginExecutable,
210+
PluginPath,
211+
ExternalPluginPath,
212+
};
205213

206-
using Value = TaggedUnion<LoadPluginLibrary, LoadPluginExecutable, PluginPath,
207-
ExternalPluginPath>;
208-
} // namespace PluginSearchOption
214+
private:
215+
using Members = ExternalUnionMembers<LoadPluginLibrary, LoadPluginExecutable,
216+
PluginPath, ExternalPluginPath>;
217+
static Members::Index getIndexForKind(Kind kind) {
218+
switch (kind) {
219+
case Kind::LoadPluginLibrary:
220+
return Members::indexOf<LoadPluginLibrary>();
221+
case Kind::LoadPluginExecutable:
222+
return Members::indexOf<LoadPluginExecutable>();
223+
case Kind::PluginPath:
224+
return Members::indexOf<PluginPath>();
225+
case Kind::ExternalPluginPath:
226+
return Members::indexOf<ExternalPluginPath>();
227+
}
228+
};
229+
using Storage = ExternalUnion<Kind, Members, getIndexForKind>;
230+
231+
Kind kind;
232+
Storage storage;
233+
234+
public:
235+
PluginSearchOption(const LoadPluginLibrary &v)
236+
: kind(Kind::LoadPluginLibrary) {
237+
storage.emplace<LoadPluginLibrary>(kind, v);
238+
}
239+
PluginSearchOption(const LoadPluginExecutable &v)
240+
: kind(Kind::LoadPluginExecutable) {
241+
storage.emplace<LoadPluginExecutable>(kind, v);
242+
}
243+
PluginSearchOption(const PluginPath &v) : kind(Kind::PluginPath) {
244+
storage.emplace<PluginPath>(kind, v);
245+
}
246+
PluginSearchOption(const ExternalPluginPath &v)
247+
: kind(Kind::ExternalPluginPath) {
248+
storage.emplace<ExternalPluginPath>(kind, v);
249+
}
250+
251+
Kind getKind() const { return kind; }
252+
253+
template <typename T>
254+
const T *dyn_cast() const {
255+
if (Members::indexOf<T>() != getIndexForKind(kind))
256+
return nullptr;
257+
return &storage.get<T>(kind);
258+
}
259+
260+
template <typename T>
261+
const T &get() const {
262+
return storage.get<T>(kind);
263+
}
264+
};
209265

210266
/// Options for controlling search path behavior.
211267
class SearchPathOptions {
@@ -383,7 +439,7 @@ class SearchPathOptions {
383439
std::vector<std::string> RuntimeLibraryPaths;
384440

385441
/// Plugin search path options.
386-
std::vector<PluginSearchOption::Value> PluginSearchOpts;
442+
std::vector<PluginSearchOption> PluginSearchOpts;
387443

388444
/// Don't look in for compiler-provided modules.
389445
bool SkipRuntimeLibraryImportPaths = false;

include/swift/Serialization/SerializationOptions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ namespace swift {
4444
StringRef ModuleLinkName;
4545
StringRef ModuleInterface;
4646
std::vector<std::string> ExtraClangOptions;
47-
std::vector<swift::PluginSearchOption::Value> PluginSearchOptions;
47+
std::vector<swift::PluginSearchOption> PluginSearchOptions;
4848

4949
/// Path prefixes that should be rewritten in debug info.
5050
PathRemapper DebuggingOptionsPrefixMap;

include/swift/Serialization/Validation.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ struct ValidationInfo {
111111
class ExtendedValidationInfo {
112112
SmallVector<StringRef, 4> ExtraClangImporterOpts;
113113

114-
SmallVector<std::pair<StringRef, StringRef>, 2> PluginSearchOptions;
114+
SmallVector<std::pair<PluginSearchOption::Kind, StringRef>, 2>
115+
PluginSearchOptions;
115116

116117
std::string SDKPath;
117118
StringRef ModuleABIName;
@@ -146,10 +147,12 @@ class ExtendedValidationInfo {
146147
ExtraClangImporterOpts.push_back(option);
147148
}
148149

149-
ArrayRef<std::pair<StringRef, StringRef>> getPluginSearchOptions() const {
150+
ArrayRef<std::pair<PluginSearchOption::Kind, StringRef>>
151+
getPluginSearchOptions() const {
150152
return PluginSearchOptions;
151153
}
152-
void addPluginSearchOption(const std::pair<StringRef, StringRef> &opt) {
154+
void addPluginSearchOption(
155+
const std::pair<PluginSearchOption::Kind, StringRef> &opt) {
153156
PluginSearchOptions.push_back(opt);
154157
}
155158

lib/AST/PluginLoader.cpp

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,27 +61,31 @@ PluginLoader::lookupPluginByModuleName(Identifier moduleName) {
6161

6262
// FIXME: Should we create a lookup table keyed by module name?
6363
for (auto &entry : Ctx.SearchPathOpts.PluginSearchOpts) {
64-
using namespace PluginSearchOption;
64+
switch (entry.getKind()) {
6565
// Try '-load-plugin-library'.
66-
if (auto *val = entry.dyn_cast<LoadPluginLibrary>()) {
67-
if (llvm::sys::path::filename(val->LibraryPath) == pluginLibBasename) {
68-
return {val->LibraryPath, ""};
66+
case PluginSearchOption::Kind::LoadPluginLibrary: {
67+
auto &val = entry.get<PluginSearchOption::LoadPluginLibrary>();
68+
if (llvm::sys::path::filename(val.LibraryPath) == pluginLibBasename) {
69+
return {val.LibraryPath, ""};
6970
}
7071
continue;
7172
}
7273

7374
// Try '-load-plugin-executable'.
74-
if (auto *v = entry.dyn_cast<LoadPluginExecutable>()) {
75+
case PluginSearchOption::Kind::LoadPluginExecutable: {
76+
auto &val = entry.get<PluginSearchOption::LoadPluginExecutable>();
7577
auto found = ExecutablePluginPaths.find(moduleName);
76-
if (found != ExecutablePluginPaths.end()) {
77-
return {"", std::string(found->second)};
78+
if (found != ExecutablePluginPaths.end() &&
79+
found->second == val.ExecutablePath) {
80+
return {"", val.ExecutablePath};
7881
}
7982
continue;
8083
}
8184

8285
// Try '-plugin-path'.
83-
if (auto *v = entry.dyn_cast<PluginPath>()) {
84-
SmallString<128> fullPath(v->SearchPath);
86+
case PluginSearchOption::Kind::PluginPath: {
87+
auto &val = entry.get<PluginSearchOption::PluginPath>();
88+
SmallString<128> fullPath(val.SearchPath);
8589
llvm::sys::path::append(fullPath, pluginLibBasename);
8690
if (fs->exists(fullPath)) {
8791
return {std::string(fullPath), ""};
@@ -90,14 +94,16 @@ PluginLoader::lookupPluginByModuleName(Identifier moduleName) {
9094
}
9195

9296
// Try '-external-plugin-path'.
93-
if (auto *v = entry.dyn_cast<ExternalPluginPath>()) {
94-
SmallString<128> fullPath(v->SearchPath);
97+
case PluginSearchOption::Kind::ExternalPluginPath: {
98+
auto &val = entry.get<PluginSearchOption::ExternalPluginPath>();
99+
SmallString<128> fullPath(val.SearchPath);
95100
llvm::sys::path::append(fullPath, pluginLibBasename);
96101
if (fs->exists(fullPath)) {
97-
return {std::string(fullPath), v->ServerPath};
102+
return {std::string(fullPath), val.ServerPath};
98103
}
99104
continue;
100105
}
106+
}
101107
}
102108

103109
return {};

lib/Serialization/ModuleFileSharedCore.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,24 +127,24 @@ static bool readOptionsBlock(llvm::BitstreamCursor &cursor,
127127
extendedInfo.addExtraClangImporterOption(blobData);
128128
break;
129129
case options_block::PLUGIN_SEARCH_OPTION: {
130-
unsigned optKind;
130+
PluginSearchOption::Kind optKind;
131131
StringRef optStr;
132132
options_block::ResilienceStrategyLayout::readRecord(scratch, optKind);
133133
switch (PluginSearchOptionKind(optKind)) {
134134
case PluginSearchOptionKind::PluginPath:
135-
optStr = "-plugin-path";
135+
optKind = PluginSearchOption::Kind::PluginPath;
136136
break;
137137
case PluginSearchOptionKind::ExternalPluginPath:
138-
optStr = "-external-plugin-path";
138+
optKind = PluginSearchOption::Kind::ExternalPluginPath;
139139
break;
140140
case PluginSearchOptionKind::LoadPluginLibrary:
141-
optStr = "-load-plugin-library";
141+
optKind = PluginSearchOption::Kind::LoadPluginLibrary;
142142
break;
143143
case PluginSearchOptionKind::LoadPluginExecutable:
144-
optStr = "-load-plugin-executable";
144+
optKind = PluginSearchOption::Kind::LoadPluginExecutable;
145145
break;
146146
}
147-
extendedInfo.addPluginSearchOption({optStr, blobData});
147+
extendedInfo.addPluginSearchOption({optKind, blobData});
148148
break;
149149
}
150150
case options_block::IS_SIB:

lib/Serialization/Serialization.cpp

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,39 +1137,42 @@ void Serializer::writeHeader(const SerializationOptions &options) {
11371137
// Macro plugins
11381138
options_block::PluginSearchOptionLayout PluginSearchOpt(Out);
11391139
for (auto &elem : options.PluginSearchOptions) {
1140-
if (auto *opt = elem.dyn_cast<PluginSearchOption::PluginPath>()) {
1140+
switch (elem.getKind()) {
1141+
case PluginSearchOption::Kind::PluginPath: {
1142+
auto &opt = elem.get<PluginSearchOption::PluginPath>();
11411143
PluginSearchOpt.emit(ScratchRecord,
11421144
uint8_t(PluginSearchOptionKind::PluginPath),
1143-
opt->SearchPath);
1145+
opt.SearchPath);
11441146
continue;
11451147
}
1146-
if (auto *opt =
1147-
elem.dyn_cast<PluginSearchOption::ExternalPluginPath>()) {
1148+
case PluginSearchOption::Kind::ExternalPluginPath: {
1149+
auto &opt = elem.get<PluginSearchOption::ExternalPluginPath>();
11481150
PluginSearchOpt.emit(
11491151
ScratchRecord,
11501152
uint8_t(PluginSearchOptionKind::ExternalPluginPath),
1151-
opt->SearchPath + "#" + opt->ServerPath);
1153+
opt.SearchPath + "#" + opt.ServerPath);
11521154
continue;
11531155
}
1154-
if (auto *opt =
1155-
elem.dyn_cast<PluginSearchOption::LoadPluginLibrary>()) {
1156+
case PluginSearchOption::Kind::LoadPluginLibrary: {
1157+
auto &opt = elem.get<PluginSearchOption::LoadPluginLibrary>();
11561158
PluginSearchOpt.emit(
11571159
ScratchRecord,
11581160
uint8_t(PluginSearchOptionKind::LoadPluginLibrary),
1159-
opt->LibraryPath);
1161+
opt.LibraryPath);
11601162
continue;
11611163
}
1162-
if (auto *opt =
1163-
elem.dyn_cast<PluginSearchOption::LoadPluginExecutable>()) {
1164-
std::string optStr = opt->ExecutablePath + "#";
1164+
case PluginSearchOption::Kind::LoadPluginExecutable: {
1165+
auto &opt = elem.get<PluginSearchOption::LoadPluginExecutable>();
1166+
std::string optStr = opt.ExecutablePath + "#";
11651167
llvm::interleave(
1166-
opt->ModuleNames, [&](auto &name) { optStr += name; },
1168+
opt.ModuleNames, [&](auto &name) { optStr += name; },
11671169
[&]() { optStr += ","; });
11681170
PluginSearchOpt.emit(
11691171
ScratchRecord,
11701172
uint8_t(PluginSearchOptionKind::LoadPluginExecutable), optStr);
11711173
continue;
11721174
}
1175+
}
11731176
}
11741177
}
11751178
}

tools/lldb-moduleimport-test/lldb-moduleimport-test.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,22 @@ static bool validateModule(
9191
}
9292
llvm::outs() << "- Plugin Search Options:\n";
9393
for (auto opt : extendedInfo.getPluginSearchOptions()) {
94-
llvm::outs() << " " << opt.first << " " << opt.second << "\n";
94+
StringRef optStr;
95+
switch (opt.first) {
96+
case swift::PluginSearchOption::Kind::PluginPath:
97+
optStr = "-plugin-path";
98+
break;
99+
case swift::PluginSearchOption::Kind::ExternalPluginPath:
100+
optStr = "-external-plugin-path";
101+
break;
102+
case swift::PluginSearchOption::Kind::LoadPluginLibrary:
103+
optStr = "-load-plugin-library";
104+
break;
105+
case swift::PluginSearchOption::Kind::LoadPluginExecutable:
106+
optStr = "-load-plugin-executable";
107+
break;
108+
}
109+
llvm::outs() << " " << optStr << " " << opt.second << "\n";
95110
}
96111
}
97112

0 commit comments

Comments
 (0)