diff --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td b/clang/include/clang/Basic/DiagnosticCommonKinds.td --- a/clang/include/clang/Basic/DiagnosticCommonKinds.td +++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td @@ -297,6 +297,8 @@ // Targets +def warn_target_unknown_triple_components : Warning< + "unknown triple %0 '%1'">; def err_target_unknown_triple : Error< "unknown target triple '%0', please use -triple or -arch">; def err_target_unknown_cpu : Error<"unknown target CPU '%0'">; diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -691,6 +691,25 @@ } // namespace targets } // namespace clang + +static +void CheckTriple(DiagnosticsEngine &Diags, llvm::Triple const& Triple) +{ + auto IsUnrecognizedValue = [](StringRef Value) { + return !Value.empty() && Value != "unknown" && Value != "none"; + }; + + if (Triple.getVendor() == llvm::Triple::UnknownVendor && + IsUnrecognizedValue(Triple.getVendorName())) + Diags.Report(diag::warn_target_unknown_triple_components) << "vendor" << Triple.getVendorName(); + if (Triple.getOS() == llvm::Triple::UnknownOS && + IsUnrecognizedValue(Triple.getOSName())) + Diags.Report(diag::warn_target_unknown_triple_components) << "os" << Triple.getOSName(); + if (Triple.getEnvironment() == llvm::Triple::UnknownEnvironment && + IsUnrecognizedValue(Triple.getEnvironmentName())) + Diags.Report(diag::warn_target_unknown_triple_components) << "environment" << Triple.getEnvironmentName(); +} + using namespace clang::targets; /// CreateTargetInfo - Return the target info object for the specified target /// options. @@ -707,6 +726,9 @@ } Target->TargetOpts = Opts; + // Check after we created the target has it only raises warnings. + CheckTriple(Diags, Triple); + // Set the target CPU if specified. if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) { Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;