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