From: Craig Topper Date: Thu, 4 Mar 2021 00:21:23 +0000 (-0800) Subject: [RISCV] Make use of the required features in BuiltinInfo to store that V extension... X-Git-Tag: llvmorg-14-init~13460 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=201ebf211f9772ef19abac82170b9b06fe2ccf2b;p=platform%2Fupstream%2Fllvm.git [RISCV] Make use of the required features in BuiltinInfo to store that V extension builtins require 'experimental-v'. Use that to print the diagnostic in SemaChecking instead of listing all of the builtins in a switch. With the required features, IR generation will also be able to error on this. Checking this here allows us to have a RISCV focused error message. Reviewed By: HsiangKai Differential Revision: https://reviews.llvm.org/D97826 --- diff --git a/clang/include/clang/Basic/BuiltinsRISCV.def b/clang/include/clang/Basic/BuiltinsRISCV.def index 4f4ed74..9fbfa93 100644 --- a/clang/include/clang/Basic/BuiltinsRISCV.def +++ b/clang/include/clang/Basic/BuiltinsRISCV.def @@ -11,8 +11,12 @@ // //===----------------------------------------------------------------------===// -#if defined(BUILTIN) && !defined(RISCVV_BUILTIN) -#define RISCVV_BUILTIN(ID, TYPE, ATTRS) BUILTIN(ID, TYPE, ATTRS) +#if defined(BUILTIN) && !defined(TARGET_BUILTIN) +# define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BUILTIN(ID, TYPE, ATTRS) +#endif + +#if defined(TARGET_BUILTIN) && !defined(RISCVV_BUILTIN) +#define RISCVV_BUILTIN(ID, TYPE, ATTRS) TARGET_BUILTIN(ID, TYPE, ATTRS, "experimental-v") #endif RISCVV_BUILTIN(__builtin_rvv_vadd_vv_i8m1_vl, "q8Scq8Scq8Scz", "n") diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp index f3e29af..aee5aba 100644 --- a/clang/lib/Basic/Targets/RISCV.cpp +++ b/clang/lib/Basic/Targets/RISCV.cpp @@ -201,6 +201,8 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts, const Builtin::Info RISCVTargetInfo::BuiltinInfo[] = { #define BUILTIN(ID, TYPE, ATTRS) \ {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, +#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ + {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE}, #include "clang/Basic/BuiltinsRISCV.def" }; diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 779bc23..7e6dd35 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -3392,16 +3392,13 @@ bool Sema::CheckAMDGCNBuiltinFunctionCall(unsigned BuiltinID, bool Sema::CheckRISCVBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, CallExpr *TheCall) { - switch (BuiltinID) { - default: - break; -#define RISCVV_BUILTIN(ID, TYPE, ATTRS) case RISCV::BI##ID: -#include "clang/Basic/BuiltinsRISCV.def" - if (!TI.hasFeature("experimental-v")) - return Diag(TheCall->getBeginLoc(), diag::err_riscvv_builtin_requires_v) - << TheCall->getSourceRange(); - break; - } + // CodeGenFunction can also detect this, but this gives a better error + // message. + StringRef Features = Context.BuiltinInfo.getRequiredFeatures(BuiltinID); + if (Features.find("experimental-v") != StringRef::npos && + !TI.hasFeature("experimental-v")) + return Diag(TheCall->getBeginLoc(), diag::err_riscvv_builtin_requires_v) + << TheCall->getSourceRange(); return false; }