diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 060f96118364d5cee84c08bbf9f98e53fca149bc..2bc75bd7538a9f533f0a37e3d1fecc783682c139 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -387,6 +387,11 @@ def err_drv_print_header_env_var_combination_cc1 : Error< def warn_O4_is_O3 : Warning<"-O4 is equivalent to -O3">, InGroup; def warn_drv_optimization_value : Warning<"optimization level '%0' is not supported; using '%1%2' instead">, InGroup; +def warn_ignored_gnu_functionality : Warning<"GNU functionality flag '%0' is not supported " + "Since -fgcc-compatible is enabled, the compiler will ignore it automatically">, + InGroup; +def error_ignored_gnu_functionality : Error<"GNU functionality flag '%0' is not supported, " + "Try -fgcc-compatible to ignore it.">; def warn_ignored_gcc_optimization : Warning<"optimization flag '%0' is not supported">, InGroup; def warn_ignored_clang_option : Warning<"the flag '%0' has been deprecated and will be ignored">, diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index dcecb473b516f1f151966f46d928c27ecd721b1c..7c65d820288122c55bb31106fdcc4acde57f090e 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -218,7 +218,9 @@ public: std::string AutoTuneOptions; #endif - +#ifdef BUILD_FOR_OPENEULER + bool EnableGccCompatible = false; +#endif /// The file to log CC_PRINT_PROC_STAT_FILE output to, if enabled. std::string CCPrintStatReportFilename; diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 296f9d47636a1701dc4d5adc085993d456a4833b..c6cdeecf28fe3c7ba664ac5ed368b874d1362f1e 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -274,7 +274,11 @@ def enable_trivial_var_init_zero : Flag<["-"], "enable-trivial-auto-var-init-zer // Group that ignores all gcc optimizations that won't be implemented def clang_ignored_gcc_optimization_f_Group : OptionGroup< "">, Group, Flags<[Ignored]>; +#ifdef BUILD_FOR_OPENEULER +def clang_ignored_gnu_functionality_Group : OptionGroup< + "">, Flags<[Ignored]>; +#endif class DiagnosticOpts : KeyPathAndMacro<"DiagnosticOpts->", base, "DIAG_"> {} class LangOpts @@ -7698,3 +7702,7 @@ def dxc_validator_path_EQ : Joined<["--"], "dxv-path=">, Group, HelpText<"DXIL validator installation path">; def dxc_disable_validation : DXCFlag<"Vd">, HelpText<"Disable validation">; +#ifdef BUILD_FOR_OPENEULER +defm canonical_system_headers_option : BooleanFFlag<"canonical-system-headers">, + Group; +#endif diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 7a54d27ef9d8ee2d407109606c644feca7b9cdf9..76273b032d4c4512f1e390868772cada3d92bae1 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -355,13 +355,22 @@ void DiagnosticsEngine::setSeverity(diag::kind Diag, diag::Severity Map, SourceLocation L) { assert(Diag < diag::DIAG_UPPER_LIMIT && "Can only map builtin diagnostics"); +#ifdef BUILD_FOR_OPENEULER + if (!(DiagOpts->GccCompatible)) { +#endif assert((Diags->isBuiltinWarningOrExtension(Diag) || (Map == diag::Severity::Fatal || Map == diag::Severity::Error)) && "Cannot map errors into warnings!"); +#ifdef BUILD_FOR_OPENEULER + } +#endif assert((L.isInvalid() || SourceMgr) && "No SourceMgr for valid location"); // Don't allow a mapping to a warning override an error/fatal mapping. bool WasUpgradedFromWarning = false; +#ifdef BUILD_FOR_OPENEULER + if (!(DiagOpts->GccCompatible)) { +#endif if (Map == diag::Severity::Warning) { DiagnosticMapping &Info = GetCurDiagState()->getOrAddMapping(Diag); if (Info.getSeverity() == diag::Severity::Error || @@ -370,6 +379,9 @@ void DiagnosticsEngine::setSeverity(diag::kind Diag, diag::Severity Map, WasUpgradedFromWarning = true; } } +#ifdef BUILD_FOR_OPENEULER + } +#endif DiagnosticMapping Mapping = makeUserMapping(Map, L); Mapping.setUpgradedFromWarning(WasUpgradedFromWarning); diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 4e5f689498d69b35aba7e843b73405bf4fab71ee..4b8c5ab8971120d65459d26923368d056b803587 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6096,6 +6096,17 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args); A->claim(); } +#ifdef BUILD_FOR_OPENEULER + // Warn about ignored GNU functionality + for (const Arg &A : + Args.filtered(options::OPT_clang_ignored_gnu_functionality_Group)) { + if (Args.hasArg(options::OPT_fgcc_compatible)) + D.Diag(diag::warn_ignored_gnu_functionality) << A->getAsString(Args); + else + D.Diag(diag::error_ignored_gnu_functionality) << A->getAsString(Args); + A->claim(); + } +#endif for (const Arg *A : Args.filtered(options::OPT_clang_ignored_legacy_options_Group)) { diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp index 0bd4b01ff79dbbf475697609b688144577f54456..726b605785fa7452cf536834e31e542a30be1f40 100644 --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -31,6 +31,7 @@ #include "clang/Parse/ParseAST.h" #include "clang/Sema/HLSLExternalSemaSource.h" #include "clang/Sema/MultiplexExternalSemaSource.h" +#include "clang/Sema/SemaDiagnostic.h" #include "clang/Serialization/ASTDeserializationListener.h" #include "clang/Serialization/ASTReader.h" #include "clang/Serialization/GlobalModuleIndex.h" @@ -1169,7 +1170,7 @@ void ASTFrontendAction::ExecuteAction() { if (!CI.hasSema()) CI.createSema(getTranslationUnitKind(), CompletionConsumer); - + ParseAST(CI.getSema(), CI.getFrontendOpts().ShowStats, CI.getFrontendOpts().SkipFunctionBodies); }