Skip to content

Commit 0944b25

Browse files
committed
[Multilib] Custom flags YAML parsing
This patch adds support for custom flags in the multilib YAML file. Details about this change can be found in this thread: https://discourse.llvm.org/t/rfc-multilib-custom-flags/81058
1 parent b2a6814 commit 0944b25

File tree

2 files changed

+39
-7
lines changed

2 files changed

+39
-7
lines changed

clang/include/clang/Driver/Multilib.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,17 +118,26 @@ class MultilibSet {
118118
std::vector<std::string> Flags;
119119
};
120120

121+
struct CustomFlagDeclaration {
122+
std::string Name;
123+
SmallVector<std::string> Values;
124+
std::string DefaultValue;
125+
};
126+
121127
private:
122128
multilib_list Multilibs;
123-
std::vector<FlagMatcher> FlagMatchers;
129+
SmallVector<FlagMatcher> FlagMatchers;
130+
SmallVector<CustomFlagDeclaration> CustomFlagDecls;
124131
IncludeDirsFunc IncludeCallback;
125132
IncludeDirsFunc FilePathsCallback;
126133

127134
public:
128135
MultilibSet() = default;
129136
MultilibSet(multilib_list &&Multilibs,
130-
std::vector<FlagMatcher> &&FlagMatchers = {})
131-
: Multilibs(Multilibs), FlagMatchers(FlagMatchers) {}
137+
SmallVector<FlagMatcher> &&FlagMatchers = {},
138+
SmallVector<CustomFlagDeclaration> &&CustomFlagDecls = {})
139+
: Multilibs(std::move(Multilibs)), FlagMatchers(std::move(FlagMatchers)),
140+
CustomFlagDecls(std::move(CustomFlagDecls)) {}
132141

133142
const multilib_list &getMultilibs() { return Multilibs; }
134143

clang/lib/Driver/Multilib.cpp

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,10 @@ struct MultilibGroupSerialization {
207207

208208
struct MultilibSetSerialization {
209209
llvm::VersionTuple MultilibVersion;
210-
std::vector<MultilibGroupSerialization> Groups;
211-
std::vector<MultilibSerialization> Multilibs;
212-
std::vector<MultilibSet::FlagMatcher> FlagMatchers;
210+
SmallVector<MultilibGroupSerialization> Groups;
211+
SmallVector<MultilibSerialization> Multilibs;
212+
SmallVector<MultilibSet::FlagMatcher> FlagMatchers;
213+
SmallVector<MultilibSet::CustomFlagDeclaration> CustomFlagDeclarations;
213214
};
214215

215216
} // end anonymous namespace
@@ -261,11 +262,31 @@ template <> struct llvm::yaml::MappingTraits<MultilibSet::FlagMatcher> {
261262
}
262263
};
263264

265+
template <>
266+
struct llvm::yaml::MappingTraits<MultilibSet::CustomFlagDeclaration> {
267+
static void mapping(llvm::yaml::IO &io,
268+
MultilibSet::CustomFlagDeclaration &V) {
269+
io.mapRequired("Name", V.Name);
270+
io.mapRequired("Values", V.Values);
271+
io.mapRequired("Default", V.DefaultValue);
272+
}
273+
static std::string validate(IO &io, MultilibSet::CustomFlagDeclaration &V) {
274+
if (V.Name.empty())
275+
return "name required for custom flag";
276+
if (V.Values.empty())
277+
return "at least one value is expected";
278+
if (!llvm::is_contained(V.Values, V.DefaultValue))
279+
return "default value is not one of the possible listed values";
280+
return {};
281+
}
282+
};
283+
264284
template <> struct llvm::yaml::MappingTraits<MultilibSetSerialization> {
265285
static void mapping(llvm::yaml::IO &io, MultilibSetSerialization &M) {
266286
io.mapRequired("MultilibVersion", M.MultilibVersion);
267287
io.mapRequired("Variants", M.Multilibs);
268288
io.mapOptional("Groups", M.Groups);
289+
io.mapOptional("Flags", M.CustomFlagDeclarations);
269290
io.mapOptional("Mappings", M.FlagMatchers);
270291
}
271292
static std::string validate(IO &io, MultilibSetSerialization &M) {
@@ -297,6 +318,7 @@ template <> struct llvm::yaml::MappingTraits<MultilibSetSerialization> {
297318
LLVM_YAML_IS_SEQUENCE_VECTOR(MultilibSerialization)
298319
LLVM_YAML_IS_SEQUENCE_VECTOR(MultilibGroupSerialization)
299320
LLVM_YAML_IS_SEQUENCE_VECTOR(MultilibSet::FlagMatcher)
321+
LLVM_YAML_IS_SEQUENCE_VECTOR(MultilibSet::CustomFlagDeclaration)
300322

301323
llvm::ErrorOr<MultilibSet>
302324
MultilibSet::parseYaml(llvm::MemoryBufferRef Input,
@@ -325,7 +347,8 @@ MultilibSet::parseYaml(llvm::MemoryBufferRef Input,
325347
}
326348
}
327349

328-
return MultilibSet(std::move(Multilibs), std::move(MS.FlagMatchers));
350+
return MultilibSet(std::move(Multilibs), std::move(MS.FlagMatchers),
351+
std::move(MS.CustomFlagDeclarations));
329352
}
330353

331354
LLVM_DUMP_METHOD void MultilibSet::dump() const {

0 commit comments

Comments
 (0)