@@ -125,6 +125,24 @@ CompilerInvocationBase::~CompilerInvocationBase() = default;
125
125
#include " clang/Driver/Options.inc"
126
126
#undef SIMPLE_ENUM_VALUE_TABLE
127
127
128
+ static llvm::Optional<bool > normalizeSimpleFlag (OptSpecifier Opt,
129
+ unsigned TableIndex,
130
+ const ArgList &Args,
131
+ DiagnosticsEngine &Diags) {
132
+ if (Args.hasArg (Opt))
133
+ return true ;
134
+ return None;
135
+ }
136
+
137
+ template <typename T, T Value>
138
+ static llvm::Optional<T>
139
+ normalizeFlagToValue (OptSpecifier Opt, unsigned TableIndex, const ArgList &Args,
140
+ DiagnosticsEngine &Diags) {
141
+ if (Args.hasArg (Opt))
142
+ return Value;
143
+ return None;
144
+ }
145
+
128
146
static llvm::Optional<unsigned > normalizeSimpleEnum (OptSpecifier Opt,
129
147
unsigned TableIndex,
130
148
const ArgList &Args,
@@ -146,22 +164,26 @@ static llvm::Optional<unsigned> normalizeSimpleEnum(OptSpecifier Opt,
146
164
return None;
147
165
}
148
166
149
- static const char *denormalizeSimpleEnum (CompilerInvocation::StringAllocator SA,
150
- unsigned TableIndex, unsigned Value) {
167
+ static void denormalizeSimpleEnum (SmallVectorImpl<const char *> &Args,
168
+ CompilerInvocation::StringAllocator SA,
169
+ unsigned TableIndex, unsigned Value) {
151
170
assert (TableIndex < SimpleEnumValueTablesSize);
152
171
const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
153
- for (int I = 0 , E = Table.Size ; I != E; ++I)
154
- if (Value == Table.Table [I].Value )
155
- return Table.Table [I].Name ;
172
+ for (int I = 0 , E = Table.Size ; I != E; ++I) {
173
+ if (Value == Table.Table [I].Value ) {
174
+ Args.push_back (Table.Table [I].Name );
175
+ return ;
176
+ }
177
+ }
156
178
157
179
llvm_unreachable (" The simple enum value was not correctly defined in "
158
180
" the tablegen option description" );
159
181
}
160
182
161
- static const char *denormalizeString (CompilerInvocation::StringAllocator SA ,
162
- unsigned TableIndex ,
163
- const std::string &Value) {
164
- return SA (Value);
183
+ static void denormalizeString (SmallVectorImpl< const char *> &Args ,
184
+ CompilerInvocation::StringAllocator SA ,
185
+ unsigned TableIndex, const std::string &Value) {
186
+ Args. push_back ( SA (Value) );
165
187
}
166
188
167
189
static Optional<std::string> normalizeTriple (OptSpecifier Opt, int TableIndex,
@@ -173,6 +195,24 @@ static Optional<std::string> normalizeTriple(OptSpecifier Opt, int TableIndex,
173
195
return llvm::Triple::normalize (Arg->getValue ());
174
196
}
175
197
198
+ template <typename T, typename U>
199
+ static T mergeForwardValue (T KeyPath, U Value) {
200
+ return Value;
201
+ }
202
+
203
+ template <typename T, typename U> static T mergeMaskValue (T KeyPath, U Value) {
204
+ return KeyPath | Value;
205
+ }
206
+
207
+ template <typename T> static T extractForwardValue (T KeyPath) {
208
+ return KeyPath;
209
+ }
210
+
211
+ template <typename T, typename U, U Value>
212
+ static T extractMaskValue (T KeyPath) {
213
+ return KeyPath & Value;
214
+ }
215
+
176
216
// ===----------------------------------------------------------------------===//
177
217
// Deserialization (from args)
178
218
// ===----------------------------------------------------------------------===//
@@ -2010,37 +2050,6 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
2010
2050
Opts.ARCMTMigrateEmitARCErrors
2011
2051
= Args.hasArg (OPT_arcmt_migrate_emit_arc_errors);
2012
2052
2013
- if (Args.hasArg (OPT_objcmt_migrate_literals))
2014
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Literals;
2015
- if (Args.hasArg (OPT_objcmt_migrate_subscripting))
2016
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Subscripting;
2017
- if (Args.hasArg (OPT_objcmt_migrate_property_dot_syntax))
2018
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_PropertyDotSyntax;
2019
- if (Args.hasArg (OPT_objcmt_migrate_property))
2020
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Property;
2021
- if (Args.hasArg (OPT_objcmt_migrate_readonly_property))
2022
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ReadonlyProperty;
2023
- if (Args.hasArg (OPT_objcmt_migrate_readwrite_property))
2024
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ReadwriteProperty;
2025
- if (Args.hasArg (OPT_objcmt_migrate_annotation))
2026
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Annotation;
2027
- if (Args.hasArg (OPT_objcmt_returns_innerpointer_property))
2028
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ReturnsInnerPointerProperty;
2029
- if (Args.hasArg (OPT_objcmt_migrate_instancetype))
2030
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Instancetype;
2031
- if (Args.hasArg (OPT_objcmt_migrate_nsmacros))
2032
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_NsMacros;
2033
- if (Args.hasArg (OPT_objcmt_migrate_protocol_conformance))
2034
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ProtocolConformance;
2035
- if (Args.hasArg (OPT_objcmt_atomic_property))
2036
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_AtomicProperty;
2037
- if (Args.hasArg (OPT_objcmt_ns_nonatomic_iosonly))
2038
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_NsAtomicIOSOnlyProperty;
2039
- if (Args.hasArg (OPT_objcmt_migrate_designated_init))
2040
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_DesignatedInitializer;
2041
- if (Args.hasArg (OPT_objcmt_migrate_all))
2042
- Opts.ObjCMTAction |= FrontendOptions::ObjCMT_MigrateDecls;
2043
-
2044
2053
Opts.ObjCMTWhiteListPath =
2045
2054
std::string (Args.getLastArgValue (OPT_objcmt_whitelist_dir_path));
2046
2055
@@ -3722,26 +3731,18 @@ static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args,
3722
3731
3723
3732
bool CompilerInvocation::parseSimpleArgs (const ArgList &Args,
3724
3733
DiagnosticsEngine &Diags) {
3725
- #define OPTION_WITH_MARSHALLING_FLAG (PREFIX_TYPE, NAME, ID, KIND, GROUP, \
3726
- ALIAS, ALIASARGS, FLAGS, PARAM, HELPTEXT, \
3727
- METAVAR, VALUES, SPELLING, ALWAYS_EMIT, \
3728
- KEYPATH, DEFAULT_VALUE, IS_POSITIVE) \
3729
- this ->KEYPATH = (Args.hasArg (OPT_##ID) && IS_POSITIVE) || (DEFAULT_VALUE);
3730
-
3731
- #define OPTION_WITH_MARSHALLING_STRING ( \
3734
+ #define OPTION_WITH_MARSHALLING ( \
3732
3735
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
3733
3736
HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
3734
- TYPE, NORMALIZER, DENORMALIZER, TABLE_INDEX) \
3737
+ TYPE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
3735
3738
{ \
3739
+ this ->KEYPATH = MERGER (this ->KEYPATH , DEFAULT_VALUE); \
3736
3740
if (auto MaybeValue = NORMALIZER (OPT_##ID, TABLE_INDEX, Args, Diags)) \
3737
- this ->KEYPATH = static_cast <TYPE>(*MaybeValue); \
3738
- else \
3739
- this ->KEYPATH = DEFAULT_VALUE; \
3741
+ this ->KEYPATH = MERGER (this ->KEYPATH , static_cast <TYPE>(*MaybeValue)); \
3740
3742
}
3741
3743
3742
3744
#include " clang/Driver/Options.inc"
3743
- #undef OPTION_WITH_MARSHALLING_STRING
3744
- #undef OPTION_WITH_MARSHALLING_FLAG
3745
+ #undef OPTION_WITH_MARSHALLING
3745
3746
return true ;
3746
3747
}
3747
3748
@@ -3996,29 +3997,23 @@ std::string CompilerInvocation::getModuleHash() const {
3996
3997
3997
3998
void CompilerInvocation::generateCC1CommandLine (
3998
3999
SmallVectorImpl<const char *> &Args, StringAllocator SA) const {
3999
- #define OPTION_WITH_MARSHALLING_FLAG (PREFIX_TYPE, NAME, ID, KIND, GROUP, \
4000
- ALIAS, ALIASARGS, FLAGS, PARAM, HELPTEXT, \
4001
- METAVAR, VALUES, SPELLING, ALWAYS_EMIT, \
4002
- KEYPATH, DEFAULT_VALUE, IS_POSITIVE) \
4003
- if ((FLAGS) & options::CC1Option && \
4004
- (ALWAYS_EMIT || this ->KEYPATH != (DEFAULT_VALUE))) \
4005
- Args.push_back (SPELLING);
4006
-
4007
- #define OPTION_WITH_MARSHALLING_STRING ( \
4000
+ #define OPTION_WITH_MARSHALLING ( \
4008
4001
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
4009
4002
HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
4010
- NORMALIZER_RET_TY , NORMALIZER, DENORMALIZER, TABLE_INDEX) \
4003
+ TYPE , NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
4011
4004
if (((FLAGS) & options::CC1Option) && \
4012
- (ALWAYS_EMIT || this ->KEYPATH != DEFAULT_VALUE)) { \
4005
+ (ALWAYS_EMIT || EXTRACTOR (this ->KEYPATH ) != (DEFAULT_VALUE))) { \
4006
+ if (Option::KIND##Class == Option::FlagClass) { \
4007
+ Args.push_back (SPELLING); \
4008
+ } \
4013
4009
if (Option::KIND##Class == Option::SeparateClass) { \
4014
4010
Args.push_back (SPELLING); \
4015
- Args. push_back ( DENORMALIZER (SA, TABLE_INDEX, this ->KEYPATH )); \
4011
+ DENORMALIZER (Args, SA, TABLE_INDEX, EXTRACTOR ( this ->KEYPATH )); \
4016
4012
} \
4017
4013
}
4018
4014
4019
4015
#include " clang/Driver/Options.inc"
4020
- #undef OPTION_WITH_MARSHALLING_STRING
4021
- #undef OPTION_WITH_MARSHALLING_FLAG
4016
+ #undef OPTION_WITH_MARSHALLING
4022
4017
}
4023
4018
4024
4019
IntrusiveRefCntPtr<llvm::vfs::FileSystem>
0 commit comments