craig.topper created this revision. craig.topper added reviewers: reames, luismarques, asb, kito-cheng. Herald added subscribers: sunshaoce, VincentWu, luke957, StephenFan, vkmr, frasercrmck, evandro, apazos, sameer.abuasal, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones, zzheng, jrtc27, shiva0217, niosHD, sabuasal, simoncook, johnrusso, rbar, arichardson. Herald added a project: All. craig.topper requested review of this revision. Herald added subscribers: pcwang-thead, eopXD, MaskRay. Herald added a project: clang.
I used RV32 so I didn't have to write RV32I and RV32E. Ideally these builtins will be wrapped in a header someday so long term I don't expect users to see these errors. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D133444 Files: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaChecking.cpp clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbkb-error.c Index: clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbkb-error.c =================================================================== --- clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbkb-error.c +++ clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbkb-error.c @@ -3,10 +3,10 @@ int zip(int rs1) { - return __builtin_riscv_zip_32(rs1); // expected-error {{builtin requires at least one of the following extensions to be enabled: 'RV32'}} + return __builtin_riscv_zip_32(rs1); // expected-error {{builtin requires: 'RV32'}} } int unzip(int rs1) { - return __builtin_riscv_unzip_32(rs1); // expected-error {{builtin requires at least one of the following extensions to be enabled: 'RV32'}} + return __builtin_riscv_unzip_32(rs1); // expected-error {{builtin requires: 'RV32'}} } Index: clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c =================================================================== --- clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c +++ clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c @@ -2,5 +2,5 @@ // RUN: %clang_cc1 -triple riscv32 -target-feature +zbb -verify %s -o - int orc_b_64(int a) { - return __builtin_riscv_orc_b_64(a); // expected-error {{builtin requires at least one of the following extensions to be enabled: 'RV64'}} + return __builtin_riscv_orc_b_64(a); // expected-error {{builtin requires: 'RV64'}} } Index: clang/lib/Sema/SemaChecking.cpp =================================================================== --- clang/lib/Sema/SemaChecking.cpp +++ clang/lib/Sema/SemaChecking.cpp @@ -4369,13 +4369,20 @@ if (llvm::none_of(ReqOpFeatures, [&TI](StringRef OF) { return TI.hasFeature(OF); })) { std::string FeatureStrs; + bool IsExtension = true; for (StringRef OF : ReqOpFeatures) { // If the feature is 64bit, alter the string so it will print better in // the diagnostic. - if (OF == "64bit") + if (OF == "64bit") { + assert(ReqOpFeatures.size() == 1 && "Expected '64bit' to be alone"); OF = "RV64"; - if (OF == "32bit") + IsExtension = false; + } + if (OF == "32bit") { + assert(ReqOpFeatures.size() == 1 && "Expected '32bit' to be alone"); OF = "RV32"; + IsExtension = false; + } // Convert features like "zbr" and "experimental-zbr" to "Zbr". OF.consume_front("experimental-"); @@ -4390,6 +4397,7 @@ // Error message FeatureMissing = true; Diag(TheCall->getBeginLoc(), diag::err_riscv_builtin_requires_extension) + << IsExtension << TheCall->getSourceRange() << StringRef(FeatureStrs); } } Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11636,7 +11636,7 @@ // RISC-V builtin required extension warning def err_riscv_builtin_requires_extension : Error< - "builtin requires at least one of the following extensions to be enabled: %0">; + "builtin requires%select{| at least one of the following extensions to be enabled}0: %1">; def err_riscv_builtin_invalid_lmul : Error< "LMUL argument must be in the range [0,3] or [5,7]">;
Index: clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbkb-error.c =================================================================== --- clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbkb-error.c +++ clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbkb-error.c @@ -3,10 +3,10 @@ int zip(int rs1) { - return __builtin_riscv_zip_32(rs1); // expected-error {{builtin requires at least one of the following extensions to be enabled: 'RV32'}} + return __builtin_riscv_zip_32(rs1); // expected-error {{builtin requires: 'RV32'}} } int unzip(int rs1) { - return __builtin_riscv_unzip_32(rs1); // expected-error {{builtin requires at least one of the following extensions to be enabled: 'RV32'}} + return __builtin_riscv_unzip_32(rs1); // expected-error {{builtin requires: 'RV32'}} } Index: clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c =================================================================== --- clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c +++ clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c @@ -2,5 +2,5 @@ // RUN: %clang_cc1 -triple riscv32 -target-feature +zbb -verify %s -o - int orc_b_64(int a) { - return __builtin_riscv_orc_b_64(a); // expected-error {{builtin requires at least one of the following extensions to be enabled: 'RV64'}} + return __builtin_riscv_orc_b_64(a); // expected-error {{builtin requires: 'RV64'}} } Index: clang/lib/Sema/SemaChecking.cpp =================================================================== --- clang/lib/Sema/SemaChecking.cpp +++ clang/lib/Sema/SemaChecking.cpp @@ -4369,13 +4369,20 @@ if (llvm::none_of(ReqOpFeatures, [&TI](StringRef OF) { return TI.hasFeature(OF); })) { std::string FeatureStrs; + bool IsExtension = true; for (StringRef OF : ReqOpFeatures) { // If the feature is 64bit, alter the string so it will print better in // the diagnostic. - if (OF == "64bit") + if (OF == "64bit") { + assert(ReqOpFeatures.size() == 1 && "Expected '64bit' to be alone"); OF = "RV64"; - if (OF == "32bit") + IsExtension = false; + } + if (OF == "32bit") { + assert(ReqOpFeatures.size() == 1 && "Expected '32bit' to be alone"); OF = "RV32"; + IsExtension = false; + } // Convert features like "zbr" and "experimental-zbr" to "Zbr". OF.consume_front("experimental-"); @@ -4390,6 +4397,7 @@ // Error message FeatureMissing = true; Diag(TheCall->getBeginLoc(), diag::err_riscv_builtin_requires_extension) + << IsExtension << TheCall->getSourceRange() << StringRef(FeatureStrs); } } Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11636,7 +11636,7 @@ // RISC-V builtin required extension warning def err_riscv_builtin_requires_extension : Error< - "builtin requires at least one of the following extensions to be enabled: %0">; + "builtin requires%select{| at least one of the following extensions to be enabled}0: %1">; def err_riscv_builtin_invalid_lmul : Error< "LMUL argument must be in the range [0,3] or [5,7]">;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits