craig.topper created this revision. craig.topper added reviewers: evandro, HsiangKai, rogfer01, khchen, arcbbb. Herald added subscribers: StephenFan, vkmr, frasercrmck, luismarques, apazos, sameer.abuasal, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, edward-jones, zzheng, jrtc27, shiva0217, kito-cheng, niosHD, sabuasal, simoncook, johnrusso, rbar, asb. craig.topper requested review of this revision. Herald added a subscriber: MaskRay. Herald added a project: clang.
Use that to print the diagnostic in SemaChecking instead of listing all of the builtins in a switch. With this is 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. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D97826 Files: clang/include/clang/Basic/BuiltinsRISCV.def clang/lib/Basic/Targets/RISCV.cpp clang/lib/Sema/SemaChecking.cpp Index: clang/lib/Sema/SemaChecking.cpp =================================================================== --- clang/lib/Sema/SemaChecking.cpp +++ clang/lib/Sema/SemaChecking.cpp @@ -3392,16 +3392,13 @@ bool Sema::CheckRISCVBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, CallExpr *TheCall) { - switch (BuiltinID) { - default: - break; -#define 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; } Index: clang/lib/Basic/Targets/RISCV.cpp =================================================================== --- clang/lib/Basic/Targets/RISCV.cpp +++ clang/lib/Basic/Targets/RISCV.cpp @@ -201,6 +201,8 @@ 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" }; Index: clang/include/clang/Basic/BuiltinsRISCV.def =================================================================== --- clang/include/clang/Basic/BuiltinsRISCV.def +++ 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")
Index: clang/lib/Sema/SemaChecking.cpp =================================================================== --- clang/lib/Sema/SemaChecking.cpp +++ clang/lib/Sema/SemaChecking.cpp @@ -3392,16 +3392,13 @@ bool Sema::CheckRISCVBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, CallExpr *TheCall) { - switch (BuiltinID) { - default: - break; -#define 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; } Index: clang/lib/Basic/Targets/RISCV.cpp =================================================================== --- clang/lib/Basic/Targets/RISCV.cpp +++ clang/lib/Basic/Targets/RISCV.cpp @@ -201,6 +201,8 @@ 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" }; Index: clang/include/clang/Basic/BuiltinsRISCV.def =================================================================== --- clang/include/clang/Basic/BuiltinsRISCV.def +++ 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")
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits