From 57db4823e5c1c0447eb9f514031ca6ff21297caa Mon Sep 17 00:00:00 2001 From: qinghaonan Date: Thu, 5 Dec 2024 14:18:22 +0800 Subject: [PATCH] supported ignoring gnu flags by compiler --- clang/include/clang/Basic/DiagnosticDriverKinds.td | 5 +++++ clang/include/clang/Driver/Driver.h | 4 +++- clang/include/clang/Driver/Options.td | 8 ++++++++ clang/lib/Basic/Diagnostic.cpp | 12 ++++++++++++ clang/lib/Driver/ToolChains/Clang.cpp | 11 +++++++++++ clang/lib/Frontend/FrontendAction.cpp | 3 ++- 6 files changed, 41 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 060f96118364..2bc75bd7538a 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 dcecb473b516..7c65d8202881 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 296f9d47636a..c6cdeecf28fe 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 7a54d27ef9d8..76273b032d4c 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 4e5f689498d6..4b8c5ab89711 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 0bd4b01ff79d..726b605785fa 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); } -- Gitee