diff --git a/clang/include/clang/Basic/BuiltinsRISCV.def b/clang/include/clang/Basic/BuiltinsRISCV.def --- a/clang/include/clang/Basic/BuiltinsRISCV.def +++ b/clang/include/clang/Basic/BuiltinsRISCV.def @@ -19,7 +19,7 @@ // Zbb extension TARGET_BUILTIN(__builtin_riscv_orc_b_32, "ZiZi", "nc", "experimental-zbb") -TARGET_BUILTIN(__builtin_riscv_orc_b_64, "WiWi", "nc", "experimental-zbb") +TARGET_BUILTIN(__builtin_riscv_orc_b_64, "WiWi", "nc", "experimental-zbb,64bit") // Zbc extension TARGET_BUILTIN(__builtin_riscv_clmul, "LiLiLi", "nc", "experimental-zbc") diff --git a/clang/lib/Basic/Targets/RISCV.h b/clang/lib/Basic/Targets/RISCV.h --- a/clang/lib/Basic/Targets/RISCV.h +++ b/clang/lib/Basic/Targets/RISCV.h @@ -99,6 +99,11 @@ std::string convertConstraint(const char *&Constraint) const override; + bool + initFeatureMap(llvm::StringMap &Features, DiagnosticsEngine &Diags, + StringRef CPU, + const std::vector &FeaturesVec) const override; + bool hasFeature(StringRef Feature) const override; bool handleTargetFeatures(std::vector &Features, diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp --- a/clang/lib/Basic/Targets/RISCV.cpp +++ b/clang/lib/Basic/Targets/RISCV.cpp @@ -239,6 +239,16 @@ Builtin::FirstTSBuiltin); } +bool RISCVTargetInfo::initFeatureMap( + llvm::StringMap &Features, DiagnosticsEngine &Diags, StringRef CPU, + const std::vector &FeaturesVec) const { + + if (getTriple().getArch() == llvm::Triple::riscv64) + Features["64bit"] = true; + + return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); +} + /// Return true if has this feature, need to sync with handleTargetFeatures. bool RISCVTargetInfo::hasFeature(StringRef Feature) const { bool Is64Bit = getTriple().getArch() == llvm::Triple::riscv64; @@ -246,6 +256,7 @@ .Case("riscv", true) .Case("riscv32", !Is64Bit) .Case("riscv64", Is64Bit) + .Case("64bit", Is64Bit) .Case("m", HasM) .Case("a", HasA) .Case("f", HasF) diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -3422,12 +3422,18 @@ Features.split(ReqFeatures, ','); // Check if each required feature is included - for (auto &I : ReqFeatures) { - if (TI.hasFeature(I)) + for (StringRef F : ReqFeatures) { + if (TI.hasFeature(F)) continue; + + // If the feature is 64bit, alter the string so it will print better in + // the diagnostic. + if (F == "64bit") + F = "RV64"; + // Convert features like "zbr" and "experimental-zbr" to "Zbr". - I.consume_front("experimental-"); - std::string FeatureStr = I.str(); + F.consume_front("experimental-"); + std::string FeatureStr = F.str(); FeatureStr[0] = std::toupper(FeatureStr[0]); // Error message diff --git a/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c b/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c @@ -0,0 +1,6 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py +// RUN: %clang_cc1 -triple riscv32 -target-feature +experimental-zbb -verify %s -o - + +int orc_b_64(int a) { + return __builtin_riscv_orc_b_64(a); // expected-error {{builtin requires 'RV64' extension support to be enabled}} +}