forked from OSchip/llvm-project
[clang][cli] NFC: Use Diags to report parsing success/failure
`Success` is set to `false` whenever `Diags.Report(diag::err_)` is called. Remove the duplication and use `Diags` as the source of truth when deciding whether to report parsing success/failure. Reviewed By: dexonsmith Differential Revision: https://reviews.llvm.org/D100644
This commit is contained in:
parent
26bbb8700b
commit
64e4dfd72b
|
@ -152,9 +152,10 @@ CompilerInvocationRefBase::~CompilerInvocationRefBase() = default;
|
|||
#include "clang/Driver/Options.inc"
|
||||
#undef SIMPLE_ENUM_VALUE_TABLE
|
||||
|
||||
static llvm::Optional<bool>
|
||||
normalizeSimpleFlag(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args,
|
||||
DiagnosticsEngine &Diags, bool &Success) {
|
||||
static llvm::Optional<bool> normalizeSimpleFlag(OptSpecifier Opt,
|
||||
unsigned TableIndex,
|
||||
const ArgList &Args,
|
||||
DiagnosticsEngine &Diags) {
|
||||
if (Args.hasArg(Opt))
|
||||
return true;
|
||||
return None;
|
||||
|
@ -162,8 +163,7 @@ normalizeSimpleFlag(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args,
|
|||
|
||||
static Optional<bool> normalizeSimpleNegativeFlag(OptSpecifier Opt, unsigned,
|
||||
const ArgList &Args,
|
||||
DiagnosticsEngine &,
|
||||
bool &Success) {
|
||||
DiagnosticsEngine &) {
|
||||
if (Args.hasArg(Opt))
|
||||
return false;
|
||||
return None;
|
||||
|
@ -189,7 +189,7 @@ template <typename T,
|
|||
std::enable_if_t<!is_uint64_t_convertible<T>(), bool> = false>
|
||||
static auto makeFlagToValueNormalizer(T Value) {
|
||||
return [Value](OptSpecifier Opt, unsigned, const ArgList &Args,
|
||||
DiagnosticsEngine &, bool &Success) -> Optional<T> {
|
||||
DiagnosticsEngine &) -> Optional<T> {
|
||||
if (Args.hasArg(Opt))
|
||||
return Value;
|
||||
return None;
|
||||
|
@ -205,8 +205,8 @@ static auto makeFlagToValueNormalizer(T Value) {
|
|||
static auto makeBooleanOptionNormalizer(bool Value, bool OtherValue,
|
||||
OptSpecifier OtherOpt) {
|
||||
return [Value, OtherValue, OtherOpt](OptSpecifier Opt, unsigned,
|
||||
const ArgList &Args, DiagnosticsEngine &,
|
||||
bool &Success) -> Optional<bool> {
|
||||
const ArgList &Args,
|
||||
DiagnosticsEngine &) -> Optional<bool> {
|
||||
if (const Arg *A = Args.getLastArg(Opt, OtherOpt)) {
|
||||
return A->getOption().matches(Opt) ? Value : OtherValue;
|
||||
}
|
||||
|
@ -271,9 +271,10 @@ findValueTableByValue(const SimpleEnumValueTable &Table, unsigned Value) {
|
|||
return None;
|
||||
}
|
||||
|
||||
static llvm::Optional<unsigned>
|
||||
normalizeSimpleEnum(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args,
|
||||
DiagnosticsEngine &Diags, bool &Success) {
|
||||
static llvm::Optional<unsigned> normalizeSimpleEnum(OptSpecifier Opt,
|
||||
unsigned TableIndex,
|
||||
const ArgList &Args,
|
||||
DiagnosticsEngine &Diags) {
|
||||
assert(TableIndex < SimpleEnumValueTablesSize);
|
||||
const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
|
||||
|
||||
|
@ -285,7 +286,6 @@ normalizeSimpleEnum(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args,
|
|||
if (auto MaybeEnumVal = findValueTableByName(Table, ArgValue))
|
||||
return MaybeEnumVal->Value;
|
||||
|
||||
Success = false;
|
||||
Diags.Report(diag::err_drv_invalid_value)
|
||||
<< Arg->getAsString(Args) << ArgValue;
|
||||
return None;
|
||||
|
@ -319,8 +319,7 @@ static void denormalizeSimpleEnum(SmallVectorImpl<const char *> &Args,
|
|||
|
||||
static Optional<std::string> normalizeString(OptSpecifier Opt, int TableIndex,
|
||||
const ArgList &Args,
|
||||
DiagnosticsEngine &Diags,
|
||||
bool &Success) {
|
||||
DiagnosticsEngine &Diags) {
|
||||
auto *Arg = Args.getLastArg(Opt);
|
||||
if (!Arg)
|
||||
return None;
|
||||
|
@ -328,15 +327,14 @@ static Optional<std::string> normalizeString(OptSpecifier Opt, int TableIndex,
|
|||
}
|
||||
|
||||
template <typename IntTy>
|
||||
static Optional<IntTy>
|
||||
normalizeStringIntegral(OptSpecifier Opt, int, const ArgList &Args,
|
||||
DiagnosticsEngine &Diags, bool &Success) {
|
||||
static Optional<IntTy> normalizeStringIntegral(OptSpecifier Opt, int,
|
||||
const ArgList &Args,
|
||||
DiagnosticsEngine &Diags) {
|
||||
auto *Arg = Args.getLastArg(Opt);
|
||||
if (!Arg)
|
||||
return None;
|
||||
IntTy Res;
|
||||
if (StringRef(Arg->getValue()).getAsInteger(0, Res)) {
|
||||
Success = false;
|
||||
Diags.Report(diag::err_drv_invalid_int_value)
|
||||
<< Arg->getAsString(Args) << Arg->getValue();
|
||||
return None;
|
||||
|
@ -346,7 +344,7 @@ normalizeStringIntegral(OptSpecifier Opt, int, const ArgList &Args,
|
|||
|
||||
static Optional<std::vector<std::string>>
|
||||
normalizeStringVector(OptSpecifier Opt, int, const ArgList &Args,
|
||||
DiagnosticsEngine &, bool &Success) {
|
||||
DiagnosticsEngine &) {
|
||||
return Args.getAllArgValues(Opt);
|
||||
}
|
||||
|
||||
|
@ -384,8 +382,7 @@ static void denormalizeStringVector(SmallVectorImpl<const char *> &Args,
|
|||
|
||||
static Optional<std::string> normalizeTriple(OptSpecifier Opt, int TableIndex,
|
||||
const ArgList &Args,
|
||||
DiagnosticsEngine &Diags,
|
||||
bool &Success) {
|
||||
DiagnosticsEngine &Diags) {
|
||||
auto *Arg = Args.getLastArg(Opt);
|
||||
if (!Arg)
|
||||
return None;
|
||||
|
@ -410,17 +407,15 @@ static T extractMaskValue(T KeyPath) {
|
|||
return ((KeyPath & Value) == Value) ? static_cast<T>(Value) : T();
|
||||
}
|
||||
|
||||
#define PARSE_OPTION_WITH_MARSHALLING(ARGS, DIAGS, SUCCESS, ID, FLAGS, PARAM, \
|
||||
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, \
|
||||
NORMALIZER, MERGER, TABLE_INDEX) \
|
||||
#define PARSE_OPTION_WITH_MARSHALLING( \
|
||||
ARGS, DIAGS, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) \
|
||||
if ((FLAGS)&options::CC1Option) { \
|
||||
KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \
|
||||
if (IMPLIED_CHECK) \
|
||||
KEYPATH = MERGER(KEYPATH, IMPLIED_VALUE); \
|
||||
if (SHOULD_PARSE) \
|
||||
if (auto MaybeValue = \
|
||||
NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS, SUCCESS)) \
|
||||
if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS)) \
|
||||
KEYPATH = \
|
||||
MERGER(KEYPATH, static_cast<decltype(KEYPATH)>(*MaybeValue)); \
|
||||
}
|
||||
|
@ -878,18 +873,18 @@ static void GenerateAnalyzerArgs(AnalyzerOptions &Opts,
|
|||
|
||||
static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
|
||||
DiagnosticsEngine &Diags) {
|
||||
unsigned NumErrorsBefore = Diags.getNumErrors();
|
||||
|
||||
AnalyzerOptions *AnalyzerOpts = &Opts;
|
||||
bool Success = true;
|
||||
|
||||
#define ANALYZER_OPTION_WITH_MARSHALLING( \
|
||||
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
|
||||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
|
||||
MERGER, EXTRACTOR, TABLE_INDEX) \
|
||||
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
|
||||
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
|
||||
MERGER, TABLE_INDEX)
|
||||
PARSE_OPTION_WITH_MARSHALLING( \
|
||||
Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX)
|
||||
#include "clang/Driver/Options.inc"
|
||||
#undef ANALYZER_OPTION_WITH_MARSHALLING
|
||||
|
||||
|
@ -903,7 +898,6 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
|
|||
if (Value == NumStores) {
|
||||
Diags.Report(diag::err_drv_invalid_value)
|
||||
<< A->getAsString(Args) << Name;
|
||||
Success = false;
|
||||
} else {
|
||||
Opts.AnalysisStoreOpt = Value;
|
||||
}
|
||||
|
@ -919,7 +913,6 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
|
|||
if (Value == NumConstraints) {
|
||||
Diags.Report(diag::err_drv_invalid_value)
|
||||
<< A->getAsString(Args) << Name;
|
||||
Success = false;
|
||||
} else {
|
||||
Opts.AnalysisConstraintsOpt = Value;
|
||||
}
|
||||
|
@ -935,7 +928,6 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
|
|||
if (Value == NUM_ANALYSIS_DIAG_CLIENTS) {
|
||||
Diags.Report(diag::err_drv_invalid_value)
|
||||
<< A->getAsString(Args) << Name;
|
||||
Success = false;
|
||||
} else {
|
||||
Opts.AnalysisDiagOpt = Value;
|
||||
}
|
||||
|
@ -951,7 +943,6 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
|
|||
if (Value == NumPurgeModes) {
|
||||
Diags.Report(diag::err_drv_invalid_value)
|
||||
<< A->getAsString(Args) << Name;
|
||||
Success = false;
|
||||
} else {
|
||||
Opts.AnalysisPurgeOpt = Value;
|
||||
}
|
||||
|
@ -967,7 +958,6 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
|
|||
if (Value == NumInliningModes) {
|
||||
Diags.Report(diag::err_drv_invalid_value)
|
||||
<< A->getAsString(Args) << Name;
|
||||
Success = false;
|
||||
} else {
|
||||
Opts.InliningMode = Value;
|
||||
}
|
||||
|
@ -1002,24 +992,20 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
|
|||
if (val.empty()) {
|
||||
Diags.Report(SourceLocation(),
|
||||
diag::err_analyzer_config_no_value) << configVal;
|
||||
Success = false;
|
||||
break;
|
||||
}
|
||||
if (val.find('=') != StringRef::npos) {
|
||||
Diags.Report(SourceLocation(),
|
||||
diag::err_analyzer_config_multiple_values)
|
||||
<< configVal;
|
||||
Success = false;
|
||||
break;
|
||||
}
|
||||
|
||||
// TODO: Check checker options too, possibly in CheckerRegistry.
|
||||
// Leave unknown non-checker configs unclaimed.
|
||||
if (!key.contains(":") && Opts.isUnknownAnalyzerConfig(key)) {
|
||||
if (Opts.ShouldEmitErrorsOnInvalidConfigValue) {
|
||||
if (Opts.ShouldEmitErrorsOnInvalidConfigValue)
|
||||
Diags.Report(diag::err_analyzer_config_unknown) << key;
|
||||
Success = false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1041,7 +1027,7 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
|
|||
}
|
||||
os.flush();
|
||||
|
||||
return Success;
|
||||
return Diags.getNumErrors() == NumErrorsBefore;
|
||||
}
|
||||
|
||||
static StringRef getStringOption(AnalyzerOptions::ConfigTable &Config,
|
||||
|
@ -1564,8 +1550,6 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
|
|||
const LangOptions &LangOptsRef) {
|
||||
unsigned NumErrorsBefore = Diags.getNumErrors();
|
||||
|
||||
bool Success = true;
|
||||
|
||||
unsigned OptimizationLevel = getOptimizationLevel(Args, IK, Diags);
|
||||
// TODO: This could be done in Driver
|
||||
unsigned MaxOptLevel = 3;
|
||||
|
@ -1590,10 +1574,9 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
|
|||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
|
||||
MERGER, EXTRACTOR, TABLE_INDEX) \
|
||||
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
|
||||
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
|
||||
MERGER, TABLE_INDEX)
|
||||
PARSE_OPTION_WITH_MARSHALLING( \
|
||||
Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX)
|
||||
#include "clang/Driver/Options.inc"
|
||||
#undef CODEGEN_OPTION_WITH_MARSHALLING
|
||||
|
||||
|
@ -1801,10 +1784,8 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
|
|||
Opts.CFProtectionReturn = 1;
|
||||
else if (Name == "branch")
|
||||
Opts.CFProtectionBranch = 1;
|
||||
else if (Name != "none") {
|
||||
else if (Name != "none")
|
||||
Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
|
||||
Success = false;
|
||||
}
|
||||
}
|
||||
|
||||
for (auto *A :
|
||||
|
@ -1962,7 +1943,7 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
|
|||
else if (Args.hasArg(options::OPT_fno_finite_loops))
|
||||
Opts.FiniteLoops = CodeGenOptions::FiniteLoopsKind::Never;
|
||||
|
||||
return Success && Diags.getNumErrors() == NumErrorsBefore;
|
||||
return Diags.getNumErrors() == NumErrorsBefore;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2009,7 +1990,6 @@ static bool ParseDependencyOutputArgs(DependencyOutputOptions &Opts,
|
|||
frontend::ActionKind Action,
|
||||
bool ShowLineMarkers) {
|
||||
unsigned NumErrorsBefore = Diags.getNumErrors();
|
||||
bool Success = true;
|
||||
|
||||
DependencyOutputOptions &DependencyOutputOpts = Opts;
|
||||
#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING( \
|
||||
|
@ -2017,10 +1997,9 @@ static bool ParseDependencyOutputArgs(DependencyOutputOptions &Opts,
|
|||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
|
||||
MERGER, EXTRACTOR, TABLE_INDEX) \
|
||||
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
|
||||
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
|
||||
MERGER, TABLE_INDEX)
|
||||
PARSE_OPTION_WITH_MARSHALLING( \
|
||||
Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX)
|
||||
#include "clang/Driver/Options.inc"
|
||||
#undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING
|
||||
|
||||
|
@ -2069,7 +2048,7 @@ static bool ParseDependencyOutputArgs(DependencyOutputOptions &Opts,
|
|||
Opts.ExtraDeps.emplace_back(std::string(Val), EDK_ModuleFile);
|
||||
}
|
||||
|
||||
return Success && Diags.getNumErrors() == NumErrorsBefore;
|
||||
return Diags.getNumErrors() == NumErrorsBefore;
|
||||
}
|
||||
|
||||
static bool parseShowColorsArgs(const ArgList &Args, bool DefaultColor) {
|
||||
|
@ -2142,29 +2121,28 @@ static void GenerateFileSystemArgs(const FileSystemOptions &Opts,
|
|||
|
||||
static bool ParseFileSystemArgs(FileSystemOptions &Opts, const ArgList &Args,
|
||||
DiagnosticsEngine &Diags) {
|
||||
unsigned NumErrorsBefore = Diags.getNumErrors();
|
||||
|
||||
FileSystemOptions &FileSystemOpts = Opts;
|
||||
bool Success = true;
|
||||
|
||||
#define FILE_SYSTEM_OPTION_WITH_MARSHALLING( \
|
||||
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
|
||||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
|
||||
MERGER, EXTRACTOR, TABLE_INDEX) \
|
||||
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
|
||||
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
|
||||
MERGER, TABLE_INDEX)
|
||||
PARSE_OPTION_WITH_MARSHALLING( \
|
||||
Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX)
|
||||
#include "clang/Driver/Options.inc"
|
||||
#undef FILE_SYSTEM_OPTION_WITH_MARSHALLING
|
||||
|
||||
return Success;
|
||||
return Diags.getNumErrors() == NumErrorsBefore;
|
||||
}
|
||||
|
||||
static void GenerateMigratorArgs(const MigratorOptions &Opts,
|
||||
SmallVectorImpl<const char *> &Args,
|
||||
CompilerInvocation::StringAllocator SA) {
|
||||
const MigratorOptions &MigratorOpts = Opts;
|
||||
|
||||
#define MIGRATOR_OPTION_WITH_MARSHALLING( \
|
||||
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
|
||||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
|
@ -2179,22 +2157,22 @@ static void GenerateMigratorArgs(const MigratorOptions &Opts,
|
|||
|
||||
static bool ParseMigratorArgs(MigratorOptions &Opts, const ArgList &Args,
|
||||
DiagnosticsEngine &Diags) {
|
||||
unsigned NumErrorsBefore = Diags.getNumErrors();
|
||||
|
||||
MigratorOptions &MigratorOpts = Opts;
|
||||
bool Success = true;
|
||||
|
||||
#define MIGRATOR_OPTION_WITH_MARSHALLING( \
|
||||
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
|
||||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
|
||||
MERGER, EXTRACTOR, TABLE_INDEX) \
|
||||
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
|
||||
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
|
||||
MERGER, TABLE_INDEX)
|
||||
PARSE_OPTION_WITH_MARSHALLING( \
|
||||
Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX)
|
||||
#include "clang/Driver/Options.inc"
|
||||
#undef MIGRATOR_OPTION_WITH_MARSHALLING
|
||||
|
||||
return Success;
|
||||
return Diags.getNumErrors() == NumErrorsBefore;
|
||||
}
|
||||
|
||||
void CompilerInvocation::GenerateDiagnosticArgs(
|
||||
|
@ -2273,20 +2251,20 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
|
|||
Diags = &*IgnoringDiags;
|
||||
}
|
||||
|
||||
unsigned NumErrorsBefore = Diags->getNumErrors();
|
||||
|
||||
// The key paths of diagnostic options defined in Options.td start with
|
||||
// "DiagnosticOpts->". Let's provide the expected variable name and type.
|
||||
DiagnosticOptions *DiagnosticOpts = &Opts;
|
||||
bool Success = true;
|
||||
|
||||
#define DIAG_OPTION_WITH_MARSHALLING( \
|
||||
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
|
||||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
|
||||
MERGER, EXTRACTOR, TABLE_INDEX) \
|
||||
PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, Success, ID, FLAGS, PARAM, \
|
||||
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
|
||||
MERGER, TABLE_INDEX)
|
||||
PARSE_OPTION_WITH_MARSHALLING( \
|
||||
Args, *Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX)
|
||||
#include "clang/Driver/Options.inc"
|
||||
#undef DIAG_OPTION_WITH_MARSHALLING
|
||||
|
||||
|
@ -2303,16 +2281,14 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
|
|||
Opts.VerifyPrefixes.push_back("expected");
|
||||
// Keep VerifyPrefixes in its original order for the sake of diagnostics, and
|
||||
// then sort it to prepare for fast lookup using std::binary_search.
|
||||
if (!checkVerifyPrefixes(Opts.VerifyPrefixes, *Diags)) {
|
||||
if (!checkVerifyPrefixes(Opts.VerifyPrefixes, *Diags))
|
||||
Opts.VerifyDiagnostics = false;
|
||||
Success = false;
|
||||
}
|
||||
else
|
||||
llvm::sort(Opts.VerifyPrefixes);
|
||||
DiagnosticLevelMask DiagMask = DiagnosticLevelMask::None;
|
||||
Success &= parseDiagnosticLevelMask("-verify-ignore-unexpected=",
|
||||
Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ),
|
||||
*Diags, DiagMask);
|
||||
parseDiagnosticLevelMask(
|
||||
"-verify-ignore-unexpected=",
|
||||
Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask);
|
||||
if (Args.hasArg(OPT_verify_ignore_unexpected))
|
||||
DiagMask = DiagnosticLevelMask::All;
|
||||
Opts.setVerifyIgnoreUnexpected(DiagMask);
|
||||
|
@ -2325,7 +2301,7 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
|
|||
addDiagnosticArgs(Args, OPT_W_Group, OPT_W_value_Group, Opts.Warnings);
|
||||
addDiagnosticArgs(Args, OPT_R_Group, OPT_R_value_Group, Opts.Remarks);
|
||||
|
||||
return Success;
|
||||
return Diags->getNumErrors() == NumErrorsBefore;
|
||||
}
|
||||
|
||||
/// Parse the argument to the -ftest-module-file-extension
|
||||
|
@ -2587,18 +2563,18 @@ static void GenerateFrontendArgs(const FrontendOptions &Opts,
|
|||
|
||||
static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
|
||||
DiagnosticsEngine &Diags, bool &IsHeaderFile) {
|
||||
FrontendOptions &FrontendOpts = Opts;
|
||||
bool Success = true;
|
||||
unsigned NumErrorsBefore = Diags.getNumErrors();
|
||||
|
||||
FrontendOptions &FrontendOpts = Opts;
|
||||
|
||||
#define FRONTEND_OPTION_WITH_MARSHALLING( \
|
||||
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
|
||||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
|
||||
MERGER, EXTRACTOR, TABLE_INDEX) \
|
||||
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
|
||||
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
|
||||
MERGER, TABLE_INDEX)
|
||||
PARSE_OPTION_WITH_MARSHALLING( \
|
||||
Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX)
|
||||
#include "clang/Driver/Options.inc"
|
||||
#undef FRONTEND_OPTION_WITH_MARSHALLING
|
||||
|
||||
|
@ -2942,18 +2918,18 @@ static void GenerateHeaderSearchArgs(HeaderSearchOptions &Opts,
|
|||
static bool ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args,
|
||||
DiagnosticsEngine &Diags,
|
||||
const std::string &WorkingDir) {
|
||||
unsigned NumErrorsBefore = Diags.getNumErrors();
|
||||
|
||||
HeaderSearchOptions *HeaderSearchOpts = &Opts;
|
||||
bool Success = true;
|
||||
|
||||
#define HEADER_SEARCH_OPTION_WITH_MARSHALLING( \
|
||||
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
|
||||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
|
||||
MERGER, EXTRACTOR, TABLE_INDEX) \
|
||||
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
|
||||
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
|
||||
MERGER, TABLE_INDEX)
|
||||
PARSE_OPTION_WITH_MARSHALLING( \
|
||||
Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX)
|
||||
#include "clang/Driver/Options.inc"
|
||||
#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
|
||||
|
||||
|
@ -3071,7 +3047,7 @@ static bool ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args,
|
|||
for (const auto *A : Args.filtered(OPT_ivfsoverlay))
|
||||
Opts.AddVFSOverlayFile(A->getValue());
|
||||
|
||||
return Success;
|
||||
return Diags.getNumErrors() == NumErrorsBefore;
|
||||
}
|
||||
|
||||
void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
|
||||
|
@ -3596,17 +3572,15 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
|
|||
// The key paths of codegen options defined in Options.td start with
|
||||
// "LangOpts->". Let's provide the expected variable name and type.
|
||||
LangOptions *LangOpts = &Opts;
|
||||
bool Success = true;
|
||||
|
||||
#define LANG_OPTION_WITH_MARSHALLING( \
|
||||
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
|
||||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
|
||||
MERGER, EXTRACTOR, TABLE_INDEX) \
|
||||
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
|
||||
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
|
||||
MERGER, TABLE_INDEX)
|
||||
PARSE_OPTION_WITH_MARSHALLING( \
|
||||
Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX)
|
||||
#include "clang/Driver/Options.inc"
|
||||
#undef LANG_OPTION_WITH_MARSHALLING
|
||||
|
||||
|
@ -3981,7 +3955,7 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
|
|||
}
|
||||
}
|
||||
|
||||
return Success && Diags.getNumErrors() == NumErrorsBefore;
|
||||
return Diags.getNumErrors() == NumErrorsBefore;
|
||||
}
|
||||
|
||||
static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) {
|
||||
|
@ -4103,18 +4077,18 @@ static bool ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
|
|||
DiagnosticsEngine &Diags,
|
||||
frontend::ActionKind Action,
|
||||
const FrontendOptions &FrontendOpts) {
|
||||
unsigned NumErrorsBefore = Diags.getNumErrors();
|
||||
|
||||
PreprocessorOptions *PreprocessorOpts = &Opts;
|
||||
bool Success = true;
|
||||
|
||||
#define PREPROCESSOR_OPTION_WITH_MARSHALLING( \
|
||||
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
|
||||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
|
||||
MERGER, EXTRACTOR, TABLE_INDEX) \
|
||||
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
|
||||
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
|
||||
MERGER, TABLE_INDEX)
|
||||
PARSE_OPTION_WITH_MARSHALLING( \
|
||||
Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX)
|
||||
#include "clang/Driver/Options.inc"
|
||||
#undef PREPROCESSOR_OPTION_WITH_MARSHALLING
|
||||
|
||||
|
@ -4189,7 +4163,7 @@ static bool ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
|
|||
if (isStrictlyPreprocessorAction(Action))
|
||||
Opts.LexEditorPlaceholders = false;
|
||||
|
||||
return Success;
|
||||
return Diags.getNumErrors() == NumErrorsBefore;
|
||||
}
|
||||
|
||||
static void GeneratePreprocessorOutputArgs(
|
||||
|
@ -4218,26 +4192,25 @@ static void GeneratePreprocessorOutputArgs(
|
|||
static bool ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts,
|
||||
ArgList &Args, DiagnosticsEngine &Diags,
|
||||
frontend::ActionKind Action) {
|
||||
PreprocessorOutputOptions &PreprocessorOutputOpts = Opts;
|
||||
unsigned NumErrorsBefore = Diags.getNumErrors();
|
||||
bool Success = true;
|
||||
|
||||
PreprocessorOutputOptions &PreprocessorOutputOpts = Opts;
|
||||
|
||||
#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING( \
|
||||
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
|
||||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
|
||||
MERGER, EXTRACTOR, TABLE_INDEX) \
|
||||
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
|
||||
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
|
||||
MERGER, TABLE_INDEX)
|
||||
PARSE_OPTION_WITH_MARSHALLING( \
|
||||
Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX)
|
||||
#include "clang/Driver/Options.inc"
|
||||
#undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING
|
||||
|
||||
Opts.ShowCPP = isStrictlyPreprocessorAction(Action) && !Args.hasArg(OPT_dM);
|
||||
Opts.ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
|
||||
|
||||
return Success && Diags.getNumErrors() == NumErrorsBefore;
|
||||
return Diags.getNumErrors() == NumErrorsBefore;
|
||||
}
|
||||
|
||||
static void GenerateTargetArgs(const TargetOptions &Opts,
|
||||
|
@ -4262,19 +4235,18 @@ static void GenerateTargetArgs(const TargetOptions &Opts,
|
|||
|
||||
static bool ParseTargetArgs(TargetOptions &Opts, ArgList &Args,
|
||||
DiagnosticsEngine &Diags) {
|
||||
TargetOptions *TargetOpts = &Opts;
|
||||
unsigned NumErrorsBefore = Diags.getNumErrors();
|
||||
bool Success = true;
|
||||
|
||||
TargetOptions *TargetOpts = &Opts;
|
||||
|
||||
#define TARGET_OPTION_WITH_MARSHALLING( \
|
||||
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
|
||||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
|
||||
MERGER, EXTRACTOR, TABLE_INDEX) \
|
||||
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
|
||||
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
|
||||
MERGER, TABLE_INDEX)
|
||||
PARSE_OPTION_WITH_MARSHALLING( \
|
||||
Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX)
|
||||
#include "clang/Driver/Options.inc"
|
||||
#undef TARGET_OPTION_WITH_MARSHALLING
|
||||
|
||||
|
@ -4287,13 +4259,13 @@ static bool ParseTargetArgs(TargetOptions &Opts, ArgList &Args,
|
|||
Opts.SDKVersion = Version;
|
||||
}
|
||||
|
||||
return Success && Diags.getNumErrors() == NumErrorsBefore;
|
||||
return Diags.getNumErrors() == NumErrorsBefore;
|
||||
}
|
||||
|
||||
bool CompilerInvocation::CreateFromArgsImpl(
|
||||
CompilerInvocation &Res, ArrayRef<const char *> CommandLineArgs,
|
||||
DiagnosticsEngine &Diags, const char *Argv0) {
|
||||
bool Success = true;
|
||||
unsigned NumErrorsBefore = Diags.getNumErrors();
|
||||
|
||||
// Parse the arguments.
|
||||
const OptTable &Opts = getDriverOptTable();
|
||||
|
@ -4304,11 +4276,9 @@ bool CompilerInvocation::CreateFromArgsImpl(
|
|||
LangOptions &LangOpts = *Res.getLangOpts();
|
||||
|
||||
// Check for missing argument error.
|
||||
if (MissingArgCount) {
|
||||
if (MissingArgCount)
|
||||
Diags.Report(diag::err_drv_missing_argument)
|
||||
<< Args.getArgString(MissingArgIndex) << MissingArgCount;
|
||||
Success = false;
|
||||
}
|
||||
|
||||
// Issue errors on unknown arguments.
|
||||
for (const auto *A : Args.filtered(OPT_UNKNOWN)) {
|
||||
|
@ -4319,19 +4289,17 @@ bool CompilerInvocation::CreateFromArgsImpl(
|
|||
else
|
||||
Diags.Report(diag::err_drv_unknown_argument_with_suggestion)
|
||||
<< ArgString << Nearest;
|
||||
Success = false;
|
||||
}
|
||||
|
||||
Success &= ParseFileSystemArgs(Res.getFileSystemOpts(), Args, Diags);
|
||||
Success &= ParseMigratorArgs(Res.getMigratorOpts(), Args, Diags);
|
||||
Success &= ParseAnalyzerArgs(*Res.getAnalyzerOpts(), Args, Diags);
|
||||
Success &= ParseDiagnosticArgs(Res.getDiagnosticOpts(), Args, &Diags,
|
||||
ParseFileSystemArgs(Res.getFileSystemOpts(), Args, Diags);
|
||||
ParseMigratorArgs(Res.getMigratorOpts(), Args, Diags);
|
||||
ParseAnalyzerArgs(*Res.getAnalyzerOpts(), Args, Diags);
|
||||
ParseDiagnosticArgs(Res.getDiagnosticOpts(), Args, &Diags,
|
||||
/*DefaultDiagColor=*/false);
|
||||
Success &= ParseFrontendArgs(Res.getFrontendOpts(), Args, Diags,
|
||||
LangOpts.IsHeaderFile);
|
||||
ParseFrontendArgs(Res.getFrontendOpts(), Args, Diags, LangOpts.IsHeaderFile);
|
||||
// FIXME: We shouldn't have to pass the DashX option around here
|
||||
InputKind DashX = Res.getFrontendOpts().DashX;
|
||||
Success &= ParseTargetArgs(Res.getTargetOpts(), Args, Diags);
|
||||
ParseTargetArgs(Res.getTargetOpts(), Args, Diags);
|
||||
llvm::Triple T(Res.getTargetOpts().Triple);
|
||||
ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args, Diags,
|
||||
Res.getFileSystemOpts().WorkingDir);
|
||||
|
@ -4351,8 +4319,8 @@ bool CompilerInvocation::CreateFromArgsImpl(
|
|||
} else {
|
||||
// Other LangOpts are only initialized when the input is not AST or LLVM IR.
|
||||
// FIXME: Should we really be calling this for an Language::Asm input?
|
||||
Success &= ParseLangArgs(LangOpts, Args, DashX, T,
|
||||
Res.getPreprocessorOpts().Includes, Diags);
|
||||
ParseLangArgs(LangOpts, Args, DashX, T, Res.getPreprocessorOpts().Includes,
|
||||
Diags);
|
||||
if (Res.getFrontendOpts().ProgramAction == frontend::RewriteObjC)
|
||||
LangOpts.ObjCExceptions = 1;
|
||||
}
|
||||
|
@ -4368,7 +4336,7 @@ bool CompilerInvocation::CreateFromArgsImpl(
|
|||
if (LangOpts.OpenMPIsDevice)
|
||||
Res.getTargetOpts().HostTriple = Res.getFrontendOpts().AuxTriple;
|
||||
|
||||
Success &= ParseCodeGenArgs(Res.getCodeGenOpts(), Args, DashX, Diags, T,
|
||||
ParseCodeGenArgs(Res.getCodeGenOpts(), Args, DashX, Diags, T,
|
||||
Res.getFrontendOpts().OutputFile, LangOpts);
|
||||
|
||||
// FIXME: Override value name discarding when asan or msan is used because the
|
||||
|
@ -4390,10 +4358,8 @@ bool CompilerInvocation::CreateFromArgsImpl(
|
|||
Res.getFrontendOpts().ProgramAction,
|
||||
Res.getPreprocessorOutputOpts().ShowLineMarkers);
|
||||
if (!Res.getDependencyOutputOpts().OutputFile.empty() &&
|
||||
Res.getDependencyOutputOpts().Targets.empty()) {
|
||||
Res.getDependencyOutputOpts().Targets.empty())
|
||||
Diags.Report(diag::err_fe_dependency_file_requires_MT);
|
||||
Success = false;
|
||||
}
|
||||
|
||||
// If sanitizer is enabled, disable OPT_ffine_grained_bitfield_accesses.
|
||||
if (Res.getCodeGenOpts().FineGrainedBitfieldAccesses &&
|
||||
|
@ -4406,9 +4372,9 @@ bool CompilerInvocation::CreateFromArgsImpl(
|
|||
Res.getCodeGenOpts().Argv0 = Argv0;
|
||||
Res.getCodeGenOpts().CommandLineArgs = CommandLineArgs;
|
||||
|
||||
Success &= FixupInvocation(Res, Diags, Args, DashX);
|
||||
FixupInvocation(Res, Diags, Args, DashX);
|
||||
|
||||
return Success;
|
||||
return Diags.getNumErrors() == NumErrorsBefore;
|
||||
}
|
||||
|
||||
bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Invocation,
|
||||
|
|
Loading…
Reference in New Issue