[clang] [clang][sema] forbid vector_size attr when specify `-mgeneral-regs-only` on x86 (PR #75350)

via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 13 07:53:27 PST 2023


https://github.com/knightXun created https://github.com/llvm/llvm-project/pull/75350

fix issue: https://github.com/llvm/llvm-project/issues/75301

>From b4fcae6b7f80a9888d361ba24ce8fb5ecf1e2df3 Mon Sep 17 00:00:00 2001
From: knightXun <badgangkiller at gmail.com>
Date: Wed, 13 Dec 2023 23:45:47 +0800
Subject: [PATCH] [clang][sema] forbid vector_size attr when specify
 `-mgeneral-regs-only` on x86 fix issue:
 https://github.com/llvm/llvm-project/issues/75301

---
 .../clang/Basic/DiagnosticSemaKinds.td        |  4 +++-
 clang/lib/Sema/SemaType.cpp                   | 19 +++++++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 94e97a891baedc..8216861e162828 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -3146,8 +3146,10 @@ def err_attribute_bad_neon_vector_size : Error<
   "Neon vector size must be 64 or 128 bits">;
 def err_attribute_invalid_sve_type : Error<
   "%0 attribute applied to non-SVE type %1">;
+def err_attribute_x86_feature_gro_vector_size_unsupported : Error<
+  "vector size is not supported when '-mgeneral-regs-only' is specified">;
 def err_attribute_bad_sve_vector_size : Error<
-  "invalid SVE vector size '%0', must match value set by "
+  "invalid vector size '%0', must match value set by "
   "'-msve-vector-bits' ('%1')">;
 def err_attribute_arm_feature_sve_bits_unsupported : Error<
   "%0 is only supported when '-msve-vector-bits=<bits>' is specified with a "
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 83610503ed9b16..0a24c9325dfa68 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -8251,6 +8251,25 @@ static void HandleVectorSizeAttr(QualType &CurType, const ParsedAttr &Attr,
     return;
   }
 
+  // check -mgeneral-regs-only is specified
+  const TargetInfo &targetInfo = S.getASTContext().getTargetInfo();
+  llvm::Triple::ArchType arch = targetInfo.getTriple().getArch();
+  const auto HasFeature = [](const clang::TargetOptions &targetOpts,
+                             const std::string &feature) {
+    return std::find(targetOpts.Features.begin(), targetOpts.Features.end(),
+                     feature) != targetOpts.Features.end();
+  };
+  if (CurType->isSpecificBuiltinType(BuiltinType::LongDouble)) {
+    if (arch == llvm::Triple::x86_64 &&
+        HasFeature(targetInfo.getTargetOpts(), "-x87") &&
+        HasFeature(targetInfo.getTargetOpts(), "-mmx") &&
+        HasFeature(targetInfo.getTargetOpts(), "-sse")) {
+      S.Diag(Attr.getLoc(),
+             diag::err_attribute_x86_feature_gro_vector_size_unsupported);
+      Attr.setInvalid();
+      return;
+    }
+  }
   Expr *SizeExpr = Attr.getArgAsExpr(0);
   QualType T = S.BuildVectorType(CurType, SizeExpr, Attr.getLoc());
   if (!T.isNull())



More information about the cfe-commits mailing list