diff options
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 68 |
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 = |