From f4459474708982c89056bda0b420fb8099eecea7 Mon Sep 17 00:00:00 2001 From: Yunfei Li Date: Thu, 23 Mar 2023 17:24:04 +0800 Subject: [PATCH 1/2] [Gcc Compat] Add option -fgcc-compatible to clang Add -fgcc-compatible and -fno-gcc-compatible to clang compile options --- clang/include/clang/Basic/DiagnosticOptions.def | 2 ++ clang/include/clang/Basic/LangOptions.def | 2 ++ clang/include/clang/Driver/Options.td | 6 ++++++ clang/lib/Driver/ToolChains/Clang.cpp | 6 ++++++ 4 files changed, 16 insertions(+) diff --git a/clang/include/clang/Basic/DiagnosticOptions.def b/clang/include/clang/Basic/DiagnosticOptions.def index 7be81f6b6a95..4ad691188a69 100644 --- a/clang/include/clang/Basic/DiagnosticOptions.def +++ b/clang/include/clang/Basic/DiagnosticOptions.def @@ -95,6 +95,8 @@ VALUE_DIAGOPT(TabStop, 32, DefaultTabStop) /// The distance between tab stops. /// Column limit for formatting message diagnostics, or 0 if unused. VALUE_DIAGOPT(MessageLength, 32, 0) +DIAGOPT(GccCompatible, 1, 0) /// -fgcc_compatible + #undef DIAGOPT #undef ENUM_DIAGOPT #undef VALUE_DIAGOPT diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index ad366821f3cb..ee547b38130f 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -449,6 +449,8 @@ ENUM_LANGOPT(ExtendIntArgs, ExtendArgsKind, 1, ExtendArgsKind::ExtendTo32, VALUE_LANGOPT(FuchsiaAPILevel, 32, 0, "Fuchsia API level") +LANGOPT(GccCompatible, 1, 0, "Enable gcc compatibility.") + // This option will be removed in the future once the backend // supports all operations (like division or float-to-integer conversion) // on large _BitInts. diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 3cab37b21aaf..cffa38d83d0e 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -522,6 +522,12 @@ defvar std = !strconcat("LangStandard::getLangStandardForKind(", lang_std.KeyPat // Developer Driver Options +def fgcc_compatible : Flag<["-"], "fgcc-compatible">, Group, + MarshallingInfoFlag>, Flags<[CC1Option, NoArgumentUnused]>, + HelpText<"Enable gcc compatibility.">; +def fno_gcc_compatible : Flag<["-"], "fno-gcc-compatible">, Group, + Flags<[CC1Option, NoArgumentUnused]>; + def internal_Group : OptionGroup<"">, Flags<[HelpHidden]>; def internal_driver_Group : OptionGroup<"">, Group, HelpText<"DRIVER OPTIONS">; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 3704ed858668..fc0e4752856a 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4542,6 +4542,12 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-triple"); CmdArgs.push_back(Args.MakeArgString(TripleStr)); + if (Args.hasFlag(options::OPT_fgcc_compatible, + options::OPT_fno_gcc_compatible, false)) { + Args.AddLastArg(CmdArgs, options::OPT_fgcc_compatible, + options::OPT_fno_gcc_compatible); + } + if (const Arg *MJ = Args.getLastArg(options::OPT_MJ)) { DumpCompilationDatabase(C, MJ->getValue(), TripleStr, Output, Input, Args); Args.ClaimAllArgs(options::OPT_MJ); -- Gitee From a13d75218c554b4e892ff7dfe100a6ac940208e0 Mon Sep 17 00:00:00 2001 From: Yunfei Li Date: Sat, 25 Mar 2023 09:11:20 +0800 Subject: [PATCH 2/2] [Gcc Compat] Add -fgcc-compatible for openeuler embedded packages Solve some of the problems when building openeuler embedded packages with clang. --- clang/lib/Basic/Warnings.cpp | 9 +++++++++ clang/lib/Driver/ToolChains/Clang.cpp | 5 +++++ clang/lib/Frontend/CompilerInvocation.cpp | 7 +++++++ clang/lib/Lex/Preprocessor.cpp | 3 +++ 4 files changed, 24 insertions(+) diff --git a/clang/lib/Basic/Warnings.cpp b/clang/lib/Basic/Warnings.cpp index cc8c138233ca..8d0095b6645e 100644 --- a/clang/lib/Basic/Warnings.cpp +++ b/clang/lib/Basic/Warnings.cpp @@ -29,6 +29,10 @@ #include using namespace clang; +#include +std::set GccCompatibleWhitelist{"stringop-overflow", + "maybe-uninitialized"}; + // EmitUnknownDiagWarning - Emit a warning and typo hint for unknown warning // opts static void EmitUnknownDiagWarning(DiagnosticsEngine &Diags, @@ -129,6 +133,11 @@ void clang::ProcessWarningOptions(DiagnosticsEngine &Diags, continue; } + if (Opts.GccCompatible) { + if (GccCompatibleWhitelist.find(std::string(Opt)) != GccCompatibleWhitelist.end()) + continue; + } + // -Werror/-Wno-error is a special case, not controlled by the option // table. It also has the "specifier" form of -Werror=foo. GCC supports // the deprecated -Werror-implicit-function-declaration which is used by diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index fc0e4752856a..6dbe535bea37 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4544,6 +4544,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (Args.hasFlag(options::OPT_fgcc_compatible, options::OPT_fno_gcc_compatible, false)) { + CmdArgs.push_back("-Wno-error=int-conversion"); + CmdArgs.push_back("-Wno-unused-private-field"); + CmdArgs.push_back("-Wno-empty-body"); + CmdArgs.push_back("-Wno-pointer-to-enum-cast"); + CmdArgs.push_back("-Wno-unused-but-set-variable"); Args.AddLastArg(CmdArgs, options::OPT_fgcc_compatible, options::OPT_fno_gcc_compatible); } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 2dd96e68bb92..62924edcade0 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3557,6 +3557,9 @@ void CompilerInvocation::GenerateLangArgs(const LangOptions &Opts, if (!Opts.RandstructSeed.empty()) GenerateArg(Args, OPT_frandomize_layout_seed_EQ, Opts.RandstructSeed, SA); + + if(Opts.GccCompatible) + GenerateArg(Args, OPT_fgcc_compatible, SA); } bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, @@ -4107,6 +4110,10 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, if (const Arg *A = Args.getLastArg(OPT_frandomize_layout_seed_EQ)) Opts.RandstructSeed = A->getValue(0); + Opts.GccCompatible = Args.hasArg(options::OPT_fgcc_compatible, + options::OPT_fno_gcc_compatible, + /*Default=*/false); + return Diags.getNumErrors() == NumErrorsBefore; } diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp index 5310db3c882b..2921a22cc73e 100644 --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -1448,6 +1448,9 @@ void Preprocessor::emitMacroDeprecationWarning(const Token &Identifier) const { assert(A.DeprecationInfo && "Macro deprecation warning without recorded annotation!"); const MacroAnnotationInfo &Info = *A.DeprecationInfo; + if (getLangOpts().GccCompatible) + if (Identifier.getIdentifierInfo()->isStr("ATOMIC_VAR_INIT")) + return; if (Info.Message.empty()) Diag(Identifier, diag::warn_pragma_deprecated_macro_use) << Identifier.getIdentifierInfo() << 0; -- Gitee