aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorJan Svoboda <jan_svoboda@apple.com>2020-11-16 14:30:54 +0100
committerJan Svoboda <jan_svoboda@apple.com>2020-11-18 10:53:41 +0100
commit05eeda9752b393c074dd22716670bc3b9671270d (patch)
tree810e22f95cd7d761747f85f12e48392ca1a8a0e8 /clang/lib/Frontend/CompilerInvocation.cpp
parent052d24af2913e8e2a0183bcab8af9c8c9cad94f1 (diff)
downloadllvm-05eeda9752b393c074dd22716670bc3b9671270d.zip
llvm-05eeda9752b393c074dd22716670bc3b9671270d.tar.gz
llvm-05eeda9752b393c074dd22716670bc3b9671270d.tar.bz2
[clang][cli] Turn arcmt-* options into a single option
- The new option, -arcmt-action, is a simple enum based option. - The driver is modified to translate the existing -ccc-acmt-* options accordingly Depends on D83298 Reviewed By: Bigcheese Original patch by Daniel Grumberg. Differential Revision: https://reviews.llvm.org/D83315
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp68
1 files changed, 39 insertions, 29 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index 2ea1027..8916fe6 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -171,6 +171,24 @@ static void denormalizeBooleanFlag(SmallVectorImpl<const char *> &Args,
Args.push_back(NegSpelling);
}
+static Optional<SimpleEnumValue>
+findValueTableByName(const SimpleEnumValueTable &Table, StringRef Name) {
+ for (int I = 0, E = Table.Size; I != E; ++I)
+ if (Name == Table.Table[I].Name)
+ return Table.Table[I];
+
+ return None;
+}
+
+static Optional<SimpleEnumValue>
+findValueTableByValue(const SimpleEnumValueTable &Table, unsigned Value) {
+ for (int I = 0, E = Table.Size; I != E; ++I)
+ if (Value == Table.Table[I].Value)
+ return Table.Table[I];
+
+ return None;
+}
+
static llvm::Optional<unsigned> normalizeSimpleEnum(OptSpecifier Opt,
unsigned TableIndex,
const ArgList &Args,
@@ -183,9 +201,8 @@ static llvm::Optional<unsigned> normalizeSimpleEnum(OptSpecifier Opt,
return None;
StringRef ArgValue = Arg->getValue();
- for (int I = 0, E = Table.Size; I != E; ++I)
- if (ArgValue == Table.Table[I].Name)
- return Table.Table[I].Value;
+ if (auto MaybeEnumVal = findValueTableByName(Table, ArgValue))
+ return MaybeEnumVal->Value;
Diags.Report(diag::err_drv_invalid_value)
<< Arg->getAsString(Args) << ArgValue;
@@ -198,16 +215,26 @@ static void denormalizeSimpleEnum(SmallVectorImpl<const char *> &Args,
unsigned TableIndex, unsigned Value) {
assert(TableIndex < SimpleEnumValueTablesSize);
const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
- for (int I = 0, E = Table.Size; I != E; ++I) {
- if (Value == Table.Table[I].Value) {
- Args.push_back(Spelling);
- Args.push_back(Table.Table[I].Name);
- return;
- }
+ if (auto MaybeEnumVal = findValueTableByValue(Table, Value)) {
+ Args.push_back(Spelling);
+ Args.push_back(MaybeEnumVal->Name);
+ } else {
+ llvm_unreachable("The simple enum value was not correctly defined in "
+ "the tablegen option description");
}
+}
- llvm_unreachable("The simple enum value was not correctly defined in "
- "the tablegen option description");
+static void denormalizeSimpleEnumJoined(SmallVectorImpl<const char *> &Args,
+ const char *Spelling,
+ CompilerInvocation::StringAllocator SA,
+ unsigned TableIndex, unsigned Value) {
+ assert(TableIndex < SimpleEnumValueTablesSize);
+ const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
+ if (auto MaybeEnumVal = findValueTableByValue(Table, Value))
+ Args.push_back(SA(Twine(Spelling) + MaybeEnumVal->Name));
+ else
+ llvm_unreachable("The simple enum value was not correctly defined in "
+ "the tablegen option description");
}
static void denormalizeString(SmallVectorImpl<const char *> &Args,
@@ -229,7 +256,7 @@ static Optional<std::string> normalizeTriple(OptSpecifier Opt, int TableIndex,
template <typename T, typename U>
static T mergeForwardValue(T KeyPath, U Value) {
- return Value;
+ return static_cast<T>(Value);
}
template <typename T, typename U> static T mergeMaskValue(T KeyPath, U Value) {
@@ -2058,23 +2085,6 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
Opts.AuxTargetFeatures = Args.getAllArgValues(OPT_aux_target_feature);
Opts.StatsFile = std::string(Args.getLastArgValue(OPT_stats_file));
- if (const Arg *A = Args.getLastArg(OPT_arcmt_check,
- OPT_arcmt_modify,
- OPT_arcmt_migrate)) {
- switch (A->getOption().getID()) {
- default:
- llvm_unreachable("missed a case");
- case OPT_arcmt_check:
- Opts.ARCMTAction = FrontendOptions::ARCMT_Check;
- break;
- case OPT_arcmt_modify:
- Opts.ARCMTAction = FrontendOptions::ARCMT_Modify;
- break;
- case OPT_arcmt_migrate:
- Opts.ARCMTAction = FrontendOptions::ARCMT_Migrate;
- break;
- }
- }
Opts.MTMigrateDir =
std::string(Args.getLastArgValue(OPT_mt_migrate_directory));
Opts.ARCMTMigrateReportOut =