From 05eeda9752b393c074dd22716670bc3b9671270d Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Mon, 16 Nov 2020 14:30:54 +0100 Subject: [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 --- clang/lib/Frontend/CompilerInvocation.cpp | 68 ++++++++++++++++++------------- 1 file changed, 39 insertions(+), 29 deletions(-) (limited to 'clang/lib/Frontend/CompilerInvocation.cpp') 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 &Args, Args.push_back(NegSpelling); } +static Optional +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 +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 normalizeSimpleEnum(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args, @@ -183,9 +201,8 @@ static llvm::Optional 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 &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 &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 &Args, @@ -229,7 +256,7 @@ static Optional normalizeTriple(OptSpecifier Opt, int TableIndex, template static T mergeForwardValue(T KeyPath, U Value) { - return Value; + return static_cast(Value); } template 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 = -- cgit v1.1