aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp53
1 files changed, 35 insertions, 18 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index f23d1e3..761f9eb 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -144,20 +144,44 @@ static Optional<bool> normalizeSimpleNegativeFlag(OptSpecifier Opt, unsigned,
return None;
}
-void denormalizeSimpleFlag(SmallVectorImpl<const char *> &Args,
- const char *Spelling,
- CompilerInvocation::StringAllocator SA,
- unsigned TableIndex, unsigned Value) {
+/// The tblgen-erated code passes in a fifth parameter of an arbitrary type, but
+/// denormalizeSimpleFlags never looks at it. Avoid bloating compile-time with
+/// unnecessary template instantiations and just ignore it with a variadic
+/// argument.
+static void denormalizeSimpleFlag(SmallVectorImpl<const char *> &Args,
+ const char *Spelling,
+ CompilerInvocation::StringAllocator, unsigned,
+ /*T*/...) {
Args.push_back(Spelling);
}
-template <typename T, T Value>
-static llvm::Optional<T>
-normalizeFlagToValue(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args,
- DiagnosticsEngine &Diags) {
- if (Args.hasArg(Opt))
- return Value;
- return None;
+namespace {
+template <typename T> struct FlagToValueNormalizer {
+ T Value;
+
+ Optional<T> operator()(OptSpecifier Opt, unsigned, const ArgList &Args,
+ DiagnosticsEngine &) {
+ if (Args.hasArg(Opt))
+ return Value;
+ return None;
+ }
+};
+} // namespace
+
+template <typename T> static constexpr bool is_int_convertible() {
+ return sizeof(T) <= sizeof(uint64_t) &&
+ std::is_trivially_constructible<T, uint64_t>::value &&
+ std::is_trivially_constructible<uint64_t, T>::value;
+}
+
+template <typename T, std::enable_if_t<is_int_convertible<T>(), bool> = false>
+static FlagToValueNormalizer<uint64_t> makeFlagToValueNormalizer(T Value) {
+ return FlagToValueNormalizer<uint64_t>{Value};
+}
+
+template <typename T, std::enable_if_t<!is_int_convertible<T>(), bool> = false>
+static FlagToValueNormalizer<T> makeFlagToValueNormalizer(T Value) {
+ return FlagToValueNormalizer<T>{std::move(Value)};
}
static Optional<bool> normalizeBooleanFlag(OptSpecifier PosOpt,
@@ -1590,13 +1614,8 @@ static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,
ArgList &Args) {
Opts.OutputFile = std::string(Args.getLastArgValue(OPT_dependency_file));
Opts.Targets = Args.getAllArgValues(OPT_MT);
- Opts.IncludeSystemHeaders = Args.hasArg(OPT_sys_header_deps);
- Opts.IncludeModuleFiles = Args.hasArg(OPT_module_file_deps);
- Opts.UsePhonyTargets = Args.hasArg(OPT_MP);
- Opts.ShowHeaderIncludes = Args.hasArg(OPT_H);
Opts.HeaderIncludeOutputFile =
std::string(Args.getLastArgValue(OPT_header_include_file));
- Opts.AddMissingHeaderDeps = Args.hasArg(OPT_MG);
if (Args.hasArg(OPT_show_includes)) {
// Writing both /showIncludes and preprocessor output to stdout
// would produce interleaved output, so use stderr for /showIncludes.
@@ -1611,8 +1630,6 @@ static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,
Opts.DOTOutputFile = std::string(Args.getLastArgValue(OPT_dependency_dot));
Opts.ModuleDependencyOutputDir =
std::string(Args.getLastArgValue(OPT_module_dependency_dir));
- if (Args.hasArg(OPT_MV))
- Opts.OutputFormat = DependencyOutputFormat::NMake;
// Add sanitizer blacklists as extra dependencies.
// They won't be discovered by the regular preprocessor, so
// we let make / ninja to know about this implicit dependency.