From f43206b017353c91742470754453db4aa3a26b55 Mon Sep 17 00:00:00 2001 From: liyunfei Date: Tue, 16 Jan 2024 14:47:02 +0800 Subject: [PATCH 01/15] add BUILD_FOR_OPENEULER build option to clang --- clang/CMakeLists.txt | 5 +++++ clang/include/clang/Driver/CMakeLists.txt | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt index c6496167d382..84d2e7fa10b2 100644 --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -355,6 +355,11 @@ if (LLVM_COMPILER_IS_GCC_COMPATIBLE) endif () endif () +option(BUILD_FOR_OPENEULER "Add gcc compatible options for openEuler toolchain" OFF) +if (BUILD_FOR_OPENEULER) + add_definitions( -DBUILD_FOR_OPENEULER ) +endif() + # Determine HOST_LINK_VERSION on Darwin. set(HOST_LINK_VERSION) if (APPLE AND NOT CMAKE_LINKER MATCHES ".*lld.*") diff --git a/clang/include/clang/Driver/CMakeLists.txt b/clang/include/clang/Driver/CMakeLists.txt index a9d988047920..ea55ba0f1f27 100644 --- a/clang/include/clang/Driver/CMakeLists.txt +++ b/clang/include/clang/Driver/CMakeLists.txt @@ -1,3 +1,7 @@ set(LLVM_TARGET_DEFINITIONS Options.td) +if (BUILD_FOR_OPENEULER) +tablegen(LLVM Options.inc -gen-opt-parser-defs -DBUILD_FOR_OPENEULER) +else() tablegen(LLVM Options.inc -gen-opt-parser-defs) +endif() add_public_tablegen_target(ClangDriverOptions) -- Gitee From bc1ba088556c302b6e7f7aba5ba6ceeacc353e6c Mon Sep 17 00:00:00 2001 From: liyunfei Date: Tue, 16 Jan 2024 14:48:53 +0800 Subject: [PATCH 02/15] add gcc compatible in BUILD_FOR_OPENEULER --- clang/include/clang/Driver/Options.td | 14 ++++++++++++++ clang/lib/Driver/Driver.cpp | 8 ++++++++ clang/lib/Driver/ToolChains/Clang.cpp | 11 +++++++++++ 3 files changed, 33 insertions(+) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 15f9ee75492e..5c8e7f88e14a 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2315,6 +2315,12 @@ def fmemory_profile_use_EQ : Joined<["-"], "fmemory-profile-use=">, HelpText<"Use memory profile for profile-guided memory optimization">, MarshallingInfoString>; +#ifdef BUILD_FOR_OPENEULER +def fgcc_compatible : Flag<["-"], "fgcc-compatible">, Group, + HelpText<"Enable gcc compatibility for openEuler.">; +def fno_gcc_compatible : Flag<["-"], "fno-gcc-compatible">, Group; +#endif + // Begin sanitizer flags. These should all be core options exposed in all driver // modes. let Visibility = [ClangOption, CC1Option, CLOption] in { @@ -6457,6 +6463,14 @@ def falign_jumps_EQ : Joined<["-"], "falign-jumps=">, Group, Group; +defm peephole2 : BooleanFFlag<"peephole2">, Group; +defm aggressive_loop_optiomizations : BooleanFFlag<"aggressive-loop-optiomizations">, Group; +def flto_partition_EQ : Joined<["-"], "flto-partition=">, Group; +#endif + defm check_new : BoolOption<"f", "check-new", LangOpts<"CheckNew">, DefaultFalse, PosFlag, diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index f9dc8ab24fa9..2c606d1d1af7 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1531,6 +1531,14 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) { // Populate the tool chains for the offloading devices, if any. CreateOffloadingDeviceToolChains(*C, Inputs); +#ifdef BUILD_FOR_OPENEULER + if(C->getArgs().hasFlag(options::OPT_fgcc_compatible, + options::OPT_fno_gcc_compatible, true)) { + getDiags().setDiagnosticGroupWarningAsError("unused-command-line-argument", 0); + getDiags().setDiagnosticGroupWarningAsError("ignored-optimization-argument", 0); + } +#endif + // Construct the list of abstract actions to perform for this compilation. On // MachO targets this uses the driver-driver and universal actions. if (TC.getTriple().isOSBinFormatMachO()) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 8858c318aba7..3edbe46c60d6 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4983,6 +4983,17 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-triple"); CmdArgs.push_back(Args.MakeArgString(TripleStr)); +#ifdef BUILD_FOR_OPENEULER + if (Args.hasFlag(options::OPT_fgcc_compatible, + options::OPT_fno_gcc_compatible, true)) { + CmdArgs.push_back("-Wno-error=unknown-warning-option"); + CmdArgs.push_back("-Wno-error=unused-parameter"); + CmdArgs.push_back("-Wno-error=unused-function"); + CmdArgs.push_back("-Wno-error=unused-but-set-parameter"); + CmdArgs.push_back("-Wno-error=unused-but-set-variable"); + } +#endif + if (const Arg *MJ = Args.getLastArg(options::OPT_MJ)) { DumpCompilationDatabase(C, MJ->getValue(), TripleStr, Output, Input, Args); Args.ClaimAllArgs(options::OPT_MJ); -- Gitee From ea48883b0271020ce9090d51c78144ca63018d67 Mon Sep 17 00:00:00 2001 From: liyunfei Date: Thu, 29 Feb 2024 16:55:42 +0800 Subject: [PATCH 03/15] switch fgcc_compatible default status to off Signed-off-by: liyunfei --- clang/lib/Driver/Driver.cpp | 2 +- clang/lib/Driver/ToolChains/Clang.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 2c606d1d1af7..fcc863532273 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1533,7 +1533,7 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) { #ifdef BUILD_FOR_OPENEULER if(C->getArgs().hasFlag(options::OPT_fgcc_compatible, - options::OPT_fno_gcc_compatible, true)) { + options::OPT_fno_gcc_compatible, false)) { getDiags().setDiagnosticGroupWarningAsError("unused-command-line-argument", 0); getDiags().setDiagnosticGroupWarningAsError("ignored-optimization-argument", 0); } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 3edbe46c60d6..5425cf89f1a2 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4985,7 +4985,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, #ifdef BUILD_FOR_OPENEULER if (Args.hasFlag(options::OPT_fgcc_compatible, - options::OPT_fno_gcc_compatible, true)) { + options::OPT_fno_gcc_compatible, false)) { CmdArgs.push_back("-Wno-error=unknown-warning-option"); CmdArgs.push_back("-Wno-error=unused-parameter"); CmdArgs.push_back("-Wno-error=unused-function"); -- Gitee From 6b5b119d7146f56c9417e6b761532a046bf68d95 Mon Sep 17 00:00:00 2001 From: liyunfei Date: Thu, 14 Mar 2024 16:04:40 +0800 Subject: [PATCH 04/15] add more warning options to -fgcc-compatible --- clang/lib/Driver/ToolChains/Clang.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 5425cf89f1a2..4c8f6e82a510 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4986,11 +4986,31 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, #ifdef BUILD_FOR_OPENEULER if (Args.hasFlag(options::OPT_fgcc_compatible, options::OPT_fno_gcc_compatible, false)) { + // compatibility relevent warnings CmdArgs.push_back("-Wno-error=unknown-warning-option"); + CmdArgs.push_back("-Wno-error=ignored-attributes"); + // By default, clang reports warnings, but gcc does not. CmdArgs.push_back("-Wno-error=unused-parameter"); CmdArgs.push_back("-Wno-error=unused-function"); CmdArgs.push_back("-Wno-error=unused-but-set-parameter"); CmdArgs.push_back("-Wno-error=unused-but-set-variable"); + CmdArgs.push_back("-Wno-error=deprecated-non-prototype"); + CmdArgs.push_back("-Wno-error=unsafe-buffer-usage"); + CmdArgs.push_back("-Wno-error=string-plus-int"); + // By default, clang reports errors, but gcc reports warnings. + // when -Werror is passed don't add -Wno-error=*. + if(!D.getDiags().getWarningsAsErrors()) { + CmdArgs.push_back("-Wno-error=implicit-function-declaration"); + CmdArgs.push_back("-Wno-error=incompatible-function-pointer-types"); + CmdArgs.push_back("-Wno-error=register"); + CmdArgs.push_back("-Wno-error=int-conversion"); + CmdArgs.push_back("-Wno-error=implicit-int"); + CmdArgs.push_back("-Wno-error=enum-constexpr-conversion"); + CmdArgs.push_back("-Wno-error=return-type"); + } + //other warnings + CmdArgs.push_back("-Wno-error=cast-align"); + CmdArgs.push_back("-Wno-error=enum-conversion"); } #endif -- Gitee From f8ebd8894fbadddeb4785653bdfe8e3642861745 Mon Sep 17 00:00:00 2001 From: liyunfei Date: Thu, 28 Mar 2024 15:51:37 +0800 Subject: [PATCH 05/15] add more warning options to -fgcc-compatible part 2 Signed-off-by: liyunfei --- clang/lib/Driver/ToolChains/Clang.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 4c8f6e82a510..4c4b53d7441b 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4997,6 +4997,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-Wno-error=deprecated-non-prototype"); CmdArgs.push_back("-Wno-error=unsafe-buffer-usage"); CmdArgs.push_back("-Wno-error=string-plus-int"); + CmdArgs.push_back("-Wno-error=language-extension-token"); + CmdArgs.push_back("-Wno-error=single-bit-bitfield-constant-conversion"); + CmdArgs.push_back("-Wno-error=gnu-variable-sized-type-not-at-end"); + CmdArgs.push_back("-Wno-error=header-guard"); + CmdArgs.push_back("-Wno-error=return-type-c-linkage"); // By default, clang reports errors, but gcc reports warnings. // when -Werror is passed don't add -Wno-error=*. if(!D.getDiags().getWarningsAsErrors()) { @@ -5011,6 +5016,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, //other warnings CmdArgs.push_back("-Wno-error=cast-align"); CmdArgs.push_back("-Wno-error=enum-conversion"); + CmdArgs.push_back("-Wno-error=switch"); } #endif -- Gitee From 25714fbac14b586b475b07fed56476a548088106 Mon Sep 17 00:00:00 2001 From: liyunfei Date: Sat, 13 Apr 2024 14:44:04 +0800 Subject: [PATCH 06/15] add more warning options to -fgcc-compatible part 3 Signed-off-by: liyunfei --- clang/lib/Driver/ToolChains/Clang.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 4c4b53d7441b..7899f830abe3 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5012,11 +5012,16 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-Wno-error=implicit-int"); CmdArgs.push_back("-Wno-error=enum-constexpr-conversion"); CmdArgs.push_back("-Wno-error=return-type"); + CmdArgs.push_back("-Wno-error=reserved-user-defined-literal"); } //other warnings CmdArgs.push_back("-Wno-error=cast-align"); CmdArgs.push_back("-Wno-error=enum-conversion"); CmdArgs.push_back("-Wno-error=switch"); + CmdArgs.push_back("-Wno-error=cast-qual"); + CmdArgs.push_back("-Wno-error=varargs"); + CmdArgs.push_back("-Wno-error=unused-value"); + CmdArgs.push_back("-Wno-error=format-nonliteral"); } #endif -- Gitee From 419a12cee1f02c90ebcc74466b0d0b27fa77c3d0 Mon Sep 17 00:00:00 2001 From: wangqiang Date: Wed, 24 Apr 2024 11:21:02 +0800 Subject: [PATCH 07/15] Ignored option `-Wa,--generate-missing-build-notes=` --- clang/lib/Driver/ToolChains/Clang.cpp | 6 ++++++ .../Driver/test-generate-missing-build-notes.cpp | 13 +++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 clang/test/Driver/test-generate-missing-build-notes.cpp diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 7899f830abe3..0b410b872ede 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -2764,6 +2764,12 @@ static void CollectArgsForIntegratedAssembler(Compilation &C, CmdArgs.push_back(Value.data()); } else if (Value == "--version") { D.PrintVersion(C, llvm::outs()); + #ifdef BUILD_FOR_OPENEULER + } else if (Value.startswith("--generate-missing-build-notes=") && + Args.hasFlag(options::OPT_fgcc_compatible, + options::OPT_fno_gcc_compatible, false)) { + // Do nothing. + #endif } else { D.Diag(diag::err_drv_unsupported_option_argument) << A->getSpelling() << Value; diff --git a/clang/test/Driver/test-generate-missing-build-notes.cpp b/clang/test/Driver/test-generate-missing-build-notes.cpp new file mode 100644 index 000000000000..efd5251e6a1c --- /dev/null +++ b/clang/test/Driver/test-generate-missing-build-notes.cpp @@ -0,0 +1,13 @@ +// REQUIRES: build_for_openeuler +// RUN: %clang -### -fgcc-compatible -Wa,--generate-missing-build-notes=yes %s 2>&1 | FileCheck -check-prefix=CHECK-NO-ERROR %s +// RUN: %clang -### -fgcc-compatible -Wa,--generate-missing-build-notes=no %s 2>&1 | FileCheck -check-prefix=CHECK-NO-ERROR %s +// CHECK-NO-ERROR-NOT: --generate-missing-build-notes= +// RUN: %clang -### -Wa,--generate-missing-build-notes=yes %s 2>&1 | FileCheck -check-prefix=CHECK-ERROR %s +// RUN: %clang -### -Wa,--generate-missing-build-notes=no %s 2>&1 | FileCheck -check-prefix=CHECK-ERROR %s +// RUN: %clang -### -fno-gcc-compatible -Wa,--generate-missing-build-notes=yes %s 2>&1 | FileCheck -check-prefix=CHECK-ERROR %s +// RUN: %clang -### -fno-gcc-compatible -Wa,--generate-missing-build-notes=no %s 2>&1 | FileCheck -check-prefix=CHECK-ERROR %s +// CHECK-ERROR: error: unsupported argument '--generate-missing-build-notes= + +int main() { + return 1; +} -- Gitee From 6b881e087d80003fcc768a45356dd59c67256a45 Mon Sep 17 00:00:00 2001 From: wangqiang Date: Sun, 28 Apr 2024 14:30:34 +0800 Subject: [PATCH 08/15] Update llvm-lit config to support build_for_openeuler --- clang/test/lit.site.cfg.py.in | 1 + llvm/cmake/modules/HandleLLVMOptions.cmake | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/clang/test/lit.site.cfg.py.in b/clang/test/lit.site.cfg.py.in index 1cbd876ac5bb..6f9fce15c340 100644 --- a/clang/test/lit.site.cfg.py.in +++ b/clang/test/lit.site.cfg.py.in @@ -44,6 +44,7 @@ config.standalone_build = @CLANG_BUILT_STANDALONE@ config.ppc_linux_default_ieeelongdouble = @PPC_LINUX_DEFAULT_IEEELONGDOUBLE@ config.have_llvm_driver = @LLVM_TOOL_LLVM_DRIVER_BUILD@ config.substitutions.append(("%llvm-version-major", "@LLVM_VERSION_MAJOR@")) +config.build_for_openeuler = @BUILD_FOR_OPENEULER@ import lit.llvm lit.llvm.initialize(lit_config, config) diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index 5ca580fbb59c..60c59c282471 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -150,6 +150,13 @@ if(LLVM_RUNTIMES_GPU_BUILD) return() endif() +option(BUILD_FOR_OPENEULER "Build support for openeuler" OFF) +if(BUILD_FOR_OPENEULER) + set(BUILD_FOR_OPENEULER 1) +else() + set(BUILD_FOR_OPENEULER 0) +endif() + if(LLVM_ENABLE_EXPENSIVE_CHECKS) # When LLVM_ENABLE_EXPENSIVE_CHECKS is ON, LLVM will intercept errors # using assert(). An explicit check is performed here. -- Gitee From 035e44d5aa97f104f8cb93ce310f034e84ac36b2 Mon Sep 17 00:00:00 2001 From: liyunfei Date: Fri, 19 Jul 2024 10:44:49 +0800 Subject: [PATCH 09/15] Complete -fgcc-compatible option scope Complete -fgcc-compatible option scope to Langopts and Diagopts (cherry picked from commit 8881224782ade2afaab4860f3462e44b7d5c2601) Signed-off-by: wangqiang --- clang/include/clang/Basic/DiagnosticOptions.def | 4 ++++ clang/include/clang/Basic/LangOptions.def | 4 ++++ clang/include/clang/Driver/Options.td | 6 ++++-- clang/lib/Driver/ToolChains/Clang.cpp | 2 ++ clang/lib/Frontend/CompilerInvocation.cpp | 9 +++++++++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticOptions.def b/clang/include/clang/Basic/DiagnosticOptions.def index 6d0c1b14acc1..5253e951d403 100644 --- a/clang/include/clang/Basic/DiagnosticOptions.def +++ b/clang/include/clang/Basic/DiagnosticOptions.def @@ -99,6 +99,10 @@ VALUE_DIAGOPT(MessageLength, 32, 0) DIAGOPT(ShowSafeBufferUsageSuggestions, 1, 0) +#ifdef BUILD_FOR_OPENEULER +DIAGOPT(GccCompatible, 1, 0) /// -fgcc-compatible +#endif + #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 834a6f6cd43e..1b7cb80a91a9 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -525,6 +525,10 @@ BENIGN_LANGOPT(CheckConstexprFunctionBodies, 1, 1, LANGOPT(BoundsSafety, 1, 0, "Bounds safety extension for C") +#ifdef BUILD_FOR_OPENEULER +LANGOPT(GccCompatible, 1, 0, "Enable gcc compatibility for openEuler.") +#endif + #undef LANGOPT #undef COMPATIBLE_LANGOPT #undef BENIGN_LANGOPT diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 5c8e7f88e14a..b0384680c247 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2316,9 +2316,11 @@ def fmemory_profile_use_EQ : Joined<["-"], "fmemory-profile-use=">, MarshallingInfoString>; #ifdef BUILD_FOR_OPENEULER -def fgcc_compatible : Flag<["-"], "fgcc-compatible">, Group, +def fgcc_compatible : Flag<["-"], "fgcc-compatible">, + Flags<[CC1Option]>, + MarshallingInfoFlag>, HelpText<"Enable gcc compatibility for openEuler.">; -def fno_gcc_compatible : Flag<["-"], "fno-gcc-compatible">, Group; +def fno_gcc_compatible : Flag<["-"], "fno-gcc-compatible">, Flags<[CC1Option]>; #endif // Begin sanitizer flags. These should all be core options exposed in all driver diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 0b410b872ede..40fa847edc1a 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5028,6 +5028,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-Wno-error=varargs"); CmdArgs.push_back("-Wno-error=unused-value"); CmdArgs.push_back("-Wno-error=format-nonliteral"); + + CmdArgs.push_back("-fgcc-compatible"); } #endif diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 028fdb2cc6b9..19d66e010b3a 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3825,6 +3825,11 @@ void CompilerInvocationBase::GenerateLangArgs(const LangOptions &Opts, if (!Opts.RandstructSeed.empty()) GenerateArg(Consumer, OPT_frandomize_layout_seed_EQ, Opts.RandstructSeed); + +#ifdef BUILD_FOR_OPENEULER + if (Opts.GccCompatible) + GenerateArg(Consumer, OPT_fgcc_compatible); +#endif } bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, @@ -4454,6 +4459,10 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, Diags.Report(diag::err_drv_hlsl_unsupported_target) << T.str(); } +#ifdef BUILD_FOR_OPENEULER + Opts.GccCompatible = Args.hasArg(options::OPT_fgcc_compatible); +#endif + return Diags.getNumErrors() == NumErrorsBefore; } -- Gitee From 4d1725079ce921a9ee3a7d23aa576f115fed9068 Mon Sep 17 00:00:00 2001 From: wangqiang Date: Fri, 19 Jul 2024 11:01:22 +0800 Subject: [PATCH 10/15] Handling of option `-Wall` and `-Werror=format=2` override `-Wno` Fix nfs-utils build issue Signed-off-by: wangqiang --- clang/lib/Frontend/CompilerInvocation.cpp | 32 +++++++++++++++++++++++ clang/test/Driver/test-warnning.c | 15 +++++++++++ 2 files changed, 47 insertions(+) create mode 100644 clang/test/Driver/test-warnning.c diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 19d66e010b3a..17759d7da615 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -934,6 +934,37 @@ static void addDiagnosticArgs(ArgList &Args, OptSpecifier Group, OptSpecifier GroupWithValue, std::vector &Diagnostics) { for (auto *A : Args.filtered(Group)) { +#ifdef BUILD_FOR_OPENEULER + bool GccCompatible = Args.hasFlag(options::OPT_fgcc_compatible, + options::OPT_fno_gcc_compatible, false); + if (A->getOption().getKind() == Option::FlagClass) { + // The argument is a pure flag (such as OPT_Wall or + // OPT_Wdeprecated). Add its name (minus the "W" or "R" at the + // beginning) to the diagnostics. + if (A->getOption().getName() == "Wall" && GccCompatible) { + // Avoid -Wall and -Werror=format=2 override -Wno-xxx + Diagnostics.insert( + Diagnostics.begin(), + std::string(A->getOption().getName().drop_front(1))); + } else { + Diagnostics.push_back( + std::string(A->getOption().getName().drop_front(1))); + } + } else if (A->getOption().matches(GroupWithValue)) { + // This is -Wfoo= or -Rfoo=, where foo is the name of the diagnostic + // group. Add only the group name to the diagnostics. + Diagnostics.push_back(std::string( + A->getOption().getName().drop_front(1).rtrim("=-"))); + } else { + // Otherwise, add its value (for OPT_W_Joined and similar). + if (std::string(A->getValue()) == "error=format=2" && GccCompatible) { + // Avoid -Werror=format=2 override -Wno-xxx + Diagnostics.insert(Diagnostics.begin(), A->getValue()); + } else { + Diagnostics.push_back(A->getValue()); + } + } +#else if (A->getOption().getKind() == Option::FlagClass) { // The argument is a pure flag (such as OPT_Wall or OPT_Wdeprecated). Add // its name (minus the "W" or "R" at the beginning) to the diagnostics. @@ -948,6 +979,7 @@ static void addDiagnosticArgs(ArgList &Args, OptSpecifier Group, // Otherwise, add its value (for OPT_W_Joined and similar). Diagnostics.push_back(A->getValue()); } +#endif } } diff --git a/clang/test/Driver/test-warnning.c b/clang/test/Driver/test-warnning.c new file mode 100644 index 000000000000..641f9e3512d5 --- /dev/null +++ b/clang/test/Driver/test-warnning.c @@ -0,0 +1,15 @@ +// REQUIRES: build_for_openeuler + +// RUN: %clang -v -fgcc-compatible -Wno-format-security -Werror=format=2 -Wall %s +// RUN: %clang -v -Wall %s 2>&1 | FileCheck -check-prefix=CHECK-ERROR %s +// CHECK-ERROR: warning: format string is not a string literal (potentially insecure) +// RUN: %clang -v -Wno-format-security -Werror=format=2 -Wall %s 2>&1 | FileCheck -check-prefix=CHECK-ERROR %s +// CHECK-ERROR: error: format string is not a string literal (potentially insecure) + +#include + +int main() { + char *str = "llvm-project"; + printf(str); + return 0; +} \ No newline at end of file -- Gitee From d1a08e3ae9bd0c8deba71af26e12e7e275b10f23 Mon Sep 17 00:00:00 2001 From: xiajingze Date: Thu, 31 Oct 2024 16:30:51 +0800 Subject: [PATCH 11/15] [Driver] Pass -z\ and -Wl,-z \ option to the linker Signed-off-by: xiajingze --- clang/include/clang/Driver/Options.td | 5 +++++ clang/lib/Driver/Driver.cpp | 18 ++++++++++++++++++ clang/test/Driver/z-args.c | 15 +++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 clang/test/Driver/z-args.c diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index b0384680c247..6813e328f389 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1043,8 +1043,13 @@ def Xopenmp_target : Separate<["-"], "Xopenmp-target">, Group def Xopenmp_target_EQ : JoinedAndSeparate<["-"], "Xopenmp-target=">, Group, HelpText<"Pass to the target offloading toolchain identified by .">, MetaVarName<" ">; +#ifdef BUILD_FOR_OPENEULER +def z : JoinedOrSeparate<["-"], "z">, Flags<[LinkerInput]>, + HelpText<"Pass -z or -z to the linker">, MetaVarName<"">, +#else def z : Separate<["-"], "z">, Flags<[LinkerInput]>, HelpText<"Pass -z to the linker">, MetaVarName<"">, +#endif Group; def offload_link : Flag<["--"], "offload-link">, Group, HelpText<"Use the new offloading linker to perform the link job.">; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index fcc863532273..7ce7bb733acb 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -2551,6 +2551,16 @@ void Driver::BuildUniversalActions(Compilation &C, const ToolChain &TC, } } +#ifdef BUILD_FOR_OPENEULER +llvm::DenseSet ZArgsList{ + "defs", "muldefs", "execstack", "noexecstack", "globalaudit", "combreloc", + "nocombreloc", "global", "initfirst", "interpose", "lazy", "loadfltr", + "nocopyreloc", "nodefaultlib", "nodelete", "nodlopen", "nodump", "now", + "origin", "relro", "norelro", "separate-code", "noseparate-code", "common", + "nocommon", "text", "notext", "textoff" +}; +#endif + bool Driver::DiagnoseInputExistence(const DerivedArgList &Args, StringRef Value, types::ID Ty, bool TypoCorrect) const { if (!getCheckInputsExist()) @@ -2622,6 +2632,14 @@ bool Driver::DiagnoseInputExistence(const DerivedArgList &Args, StringRef Value, if (IsCLMode() && Ty == types::TY_Object && !Value.starts_with("/")) return true; +#ifdef BUILD_FOR_OPENEULER + if (ZArgsList.find(Value) != ZArgsList.end() || + Value.starts_with("common-page-size=") || + Value.starts_with("max-page-size=") || + Value.starts_with("stack-size=")) + return true; +#endif + Diag(clang::diag::err_drv_no_such_file) << Value; return false; } diff --git a/clang/test/Driver/z-args.c b/clang/test/Driver/z-args.c new file mode 100644 index 000000000000..83bb2b570e69 --- /dev/null +++ b/clang/test/Driver/z-args.c @@ -0,0 +1,15 @@ +// REQUIRES: build_for_openeuler +// RUN: %clang -### -znow 2>&1 | FileCheck -check-prefix=CHECK-LINKER %s +// CHECK-LINKER: "-z" "now" + +// RUN: %clang -### -Wl,-z now 2>&1 | FileCheck -check-prefix=CHECK-WLCOMMAZ %s +// CHECK-WLCOMMAZ: "-z" "now" +// RUN: %clang -### -Wl,-z -Wl,now 2>&1 | FileCheck \ +// RUN: -check-prefix=CHECK-WLCOMMAZ1 %s +// CHECK-WLCOMMAZ1: "-z" "now" +// RUN: %clang -### -Wl,-z -O3 now 2>&1 | FileCheck \ +// RUN: -check-prefix=CHECK-WLCOMMAZ2 %s +// CHECK-WLCOMMAZ2: "-z" "now" +// RUN: %clang -### -Wl,-z stack-size=1 2>&1 | FileCheck \ +// RUN: -check-prefix=CHECK-WLCOMMAZ3 %s +// CHECK-WLCOMMAZ3: "-z" "stack-size=1" \ No newline at end of file -- Gitee From cfb440f55b0dfe32bbde9c893d6b56a2207ebb27 Mon Sep 17 00:00:00 2001 From: jianghaibo Date: Wed, 6 Nov 2024 16:04:39 +0800 Subject: [PATCH 12/15] [Driver] add option -fGNU-compatibility aliased with -fgcc-compatible --- clang/include/clang/Driver/Options.td | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 6813e328f389..b54c0c6c2823 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2325,6 +2325,9 @@ def fgcc_compatible : Flag<["-"], "fgcc-compatible">, Flags<[CC1Option]>, MarshallingInfoFlag>, HelpText<"Enable gcc compatibility for openEuler.">; +def : Flag["-"], "fGNU-compatibility">, + Flags<[CC1Option]>, Alias, + HelpText<"Alias for -fgcc_compatible">; def fno_gcc_compatible : Flag<["-"], "fno-gcc-compatible">, Flags<[CC1Option]>; #endif -- Gitee From 1c7ea7750a0805452280d0d2f82bd419e02b8bc8 Mon Sep 17 00:00:00 2001 From: Younan Zhang Date: Sat, 11 Jan 2025 19:17:09 +0800 Subject: [PATCH 13/15] [Clang][NFC] Fix a test failure with mold linker (#122587) Mold prefers the suffix '$' for symbols like PLT and GOT entries, so exclude these symbols as well. Otherwise, this test will fail for developers using mold-linked Clang. Closes https://github.com/llvm/llvm-project/issues/76982 --- clang/test/LibClang/symbols.test | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/test/LibClang/symbols.test b/clang/test/LibClang/symbols.test index fd2ff8bc6cd4..e12b4c9991b8 100644 --- a/clang/test/LibClang/symbols.test +++ b/clang/test/LibClang/symbols.test @@ -1,6 +1,6 @@ # Check that there are no unversioned clang symbols in libclang.so RUN: llvm-nm -Dj --defined-only %libclang | grep -v -e '@@LLVM_[0-9]\+$' | not grep '^clang' -# Check that here are no local clang_ symbols (ignoring symbols with .cold or +# Check that there are no local clang_ symbols (ignoring symbols with .cold or # .localalias suffxies.) -RUN: llvm-nm %libclang | not grep '[a-z] clang_[^.]\+$' +RUN: llvm-nm %libclang | not grep '[a-z] clang_[^.$]\+$' -- Gitee From 62aea93eda3fc0c9fb96e29dcec5698aabf43e60 Mon Sep 17 00:00:00 2001 From: jchzhou Date: Mon, 28 Apr 2025 00:26:06 +0800 Subject: [PATCH 14/15] try adapting llvm Option's new Visibility flags Signed-off-by: jchzhou --- clang/include/clang/Driver/Options.td | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index b54c0c6c2823..2c3f45b693e6 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2322,13 +2322,15 @@ def fmemory_profile_use_EQ : Joined<["-"], "fmemory-profile-use=">, #ifdef BUILD_FOR_OPENEULER def fgcc_compatible : Flag<["-"], "fgcc-compatible">, - Flags<[CC1Option]>, + Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>, MarshallingInfoFlag>, HelpText<"Enable gcc compatibility for openEuler.">; -def : Flag["-"], "fGNU-compatibility">, - Flags<[CC1Option]>, Alias, +def fGNU_compatibility : Flag<["-"], "fGNU-compatibility">, + Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>, + Alias, HelpText<"Alias for -fgcc_compatible">; -def fno_gcc_compatible : Flag<["-"], "fno-gcc-compatible">, Flags<[CC1Option]>; +def fno_gcc_compatible : Flag<["-"], "fno-gcc-compatible">, + Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>; #endif // Begin sanitizer flags. These should all be core options exposed in all driver -- Gitee From 30fc42b0d04738e3786e1abe6332f2d0c0926067 Mon Sep 17 00:00:00 2001 From: jchzhou Date: Mon, 28 Apr 2025 02:15:17 +0800 Subject: [PATCH 15/15] replaces uses of StringRef::{starts,ends}with with StringRef::{starts,ends}_with for adapting changes in upstream llvm (#74956) and clang (#75149) towards C++20 that landed since llvm 18.1 Signed-off-by: jchzhou --- clang/lib/Driver/ToolChains/Clang.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 40fa847edc1a..0ff0b048227e 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -2765,7 +2765,7 @@ static void CollectArgsForIntegratedAssembler(Compilation &C, } else if (Value == "--version") { D.PrintVersion(C, llvm::outs()); #ifdef BUILD_FOR_OPENEULER - } else if (Value.startswith("--generate-missing-build-notes=") && + } else if (Value.starts_with("--generate-missing-build-notes=") && Args.hasFlag(options::OPT_fgcc_compatible, options::OPT_fno_gcc_compatible, false)) { // Do nothing. -- Gitee