From 10b2b334e9e74ebbec3193f71024b6ccec4efc58 Mon Sep 17 00:00:00 2001 From: jianghaibo Date: Mon, 18 Nov 2024 20:09:59 +0800 Subject: [PATCH] [Driver] Handle -mabi=lp64 and invalid -std for GNU compatibility --- clang/include/clang/Basic/CMakeLists.txt | 3 +++ clang/include/clang/Basic/DiagnosticCommonKinds.td | 6 ++++++ clang/include/clang/Basic/TargetInfo.h | 5 +++++ clang/lib/Basic/Targets.cpp | 9 +++++++++ clang/lib/Basic/Targets/AArch64.cpp | 6 ++++++ clang/lib/Basic/Targets/AArch64.h | 3 +++ clang/lib/Frontend/CompilerInvocation.cpp | 11 +++++++++++ clang/test/Driver/arm-abi-lp64.c | 5 +++++ clang/test/Driver/unknown-std-gcc-compatible.c | 5 +++++ 9 files changed, 53 insertions(+) create mode 100644 clang/test/Driver/arm-abi-lp64.c create mode 100644 clang/test/Driver/unknown-std-gcc-compatible.c diff --git a/clang/include/clang/Basic/CMakeLists.txt b/clang/include/clang/Basic/CMakeLists.txt index e449d2790597..691d14f013cf 100644 --- a/clang/include/clang/Basic/CMakeLists.txt +++ b/clang/include/clang/Basic/CMakeLists.txt @@ -2,6 +2,9 @@ set(CLANG_BASIC_OPTIONS) if(LLVM_ENABLE_AUTOTUNER) list(APPEND CLANG_BASIC_OPTIONS "-DENABLE_AUTOTUNER") endif() +if(BUILD_FOR_OPENEULER) + list(APPEND CLANG_BASIC_OPTIONS "-DBUILD_FOR_OPENEULER") +endif() macro(clang_diag_gen component) clang_tablegen(Diagnostic${component}Kinds.inc diff --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td b/clang/include/clang/Basic/DiagnosticCommonKinds.td index ee994e765e09..d7cc3cff0797 100644 --- a/clang/include/clang/Basic/DiagnosticCommonKinds.td +++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td @@ -316,6 +316,12 @@ def err_target_unknown_cpu : Error<"unknown target CPU '%0'">; def note_valid_options : Note<"valid target CPU values are: %0">; def err_target_unsupported_cpu_for_micromips : Error< "micromips is not supported for target CPU '%0'">; +#ifdef BUILD_FOR_OPENEULER +def warning_target_default_abi : Warning< + "'%0' is the default abi for this target.">, InGroup; +def warning_not_valid_std : Warning<"'%0' is not valid for '%1'.">, + InGroup; +#endif def err_target_unknown_abi : Error<"unknown target ABI '%0'">; def err_target_unsupported_abi : Error<"ABI '%0' is not supported on CPU '%1'">; def err_target_unsupported_abi_for_triple : Error< diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 61be52149341..aeadb7273799 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -1320,6 +1320,11 @@ public: return false; } +#if defined(BUILD_FOR_OPENEULER) + /// Check whether this ABI Name is the default one for GNU/GCC Compatibility + virtual bool isDefaultABI(const std::string &Name) {return false;} +#endif + /// Use the specified unit for FP math. /// /// \return False on error (invalid unit name). diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 636b59fd1272..b14d11333412 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -805,8 +805,17 @@ TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, // Set the target ABI if specified. if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) { +#if defined(BUILD_FOR_OPENEULER) + if (Diags.getDiagnosticOptions().GccCompatible && Target->isDefaultABI(Opts->ABI)) { + Diags.Report(diag::warning_target_default_abi) << Opts->ABI; + } else { + Diags.Report(diag::err_target_unknown_abi) << Opts->ABI; + return nullptr; + } +#else Diags.Report(diag::err_target_unknown_abi) << Opts->ABI; return nullptr; +#endif } // Set the fp math unit. diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 7c4cc5fb33f8..19c3d255da73 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -206,6 +206,12 @@ bool AArch64TargetInfo::setABI(const std::string &Name) { return true; } +#if defined(BUILD_FOR_OPENEULER) +bool AArch64TargetInfo::isDefaultABI(const std::string &Name) { + return Name == "lp64"; +} +#endif + bool AArch64TargetInfo::validateBranchProtection(StringRef Spec, StringRef, BranchProtectionInfo &BPI, StringRef &Err) const { diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index 4304693e473d..886229ce65cf 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -93,6 +93,9 @@ public: StringRef getABI() const override; bool setABI(const std::string &Name) override; +#if defined(BUILD_FOR_OPENEULER) + bool isDefaultABI(const std::string &Name) override; +#endif bool validateBranchProtection(StringRef Spec, StringRef Arch, BranchProtectionInfo &BPI, diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index cbb122cc6eeb..6ec2e3fc2af0 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3622,8 +3622,19 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, // compatible. const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd); if (!IsInputCompatibleWithStandard(IK, Std)) { +#if defined(BUILD_FOR_OPENEULER) + if (Args.hasArg(OPT_fgcc_compatible)) { + LangStd = LangStandard::lang_unspecified; + Diags.Report(diag::warning_not_valid_std) + << A->getAsString(Args) << GetInputKindName(IK); + } else { + Diags.Report(diag::err_drv_argument_not_allowed_with) + << A->getAsString(Args) << GetInputKindName(IK); + } +#else Diags.Report(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args) << GetInputKindName(IK); +#endif } } } diff --git a/clang/test/Driver/arm-abi-lp64.c b/clang/test/Driver/arm-abi-lp64.c new file mode 100644 index 000000000000..378a81e2d921 --- /dev/null +++ b/clang/test/Driver/arm-abi-lp64.c @@ -0,0 +1,5 @@ +// REQUIRES: build_for_openeuler +// RUN: not %clang -fgcc-compatible -mabi=lp64 -target aarch64 %s 2>&1 | FileCheck --check-prefix=CHECK-MABI-WARN %s +// CHECK-MABI-WARN: warning: 'lp64' is the default abi for this target. +// RUN: not %clang -mabi=lp64 -target aarch64 %s 2>&1 | FileCheck --check-prefix=CHECK-MABI-ERROR %s +// CHECK-MABI-ERROR: error: unknown target ABI 'lp64' diff --git a/clang/test/Driver/unknown-std-gcc-compatible.c b/clang/test/Driver/unknown-std-gcc-compatible.c new file mode 100644 index 000000000000..435cb1182c82 --- /dev/null +++ b/clang/test/Driver/unknown-std-gcc-compatible.c @@ -0,0 +1,5 @@ +// REQUIRES: build_for_openeuler +// RUN: not %clang -fgcc-compatible -std=c++11 %s 2>&1 | FileCheck --check-prefix=CHECK-WARN-STD %s +// CHECK-WARN-STD: warning: '-std=c++11' is not valid for 'C' +// RUN: not %clang -std=c++11 %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR-STD %s +// CHECK-ERROR-STD: error: invalid argument '-std=c++11' not allowed with 'C' -- Gitee