[clang] [clang][sema] forbid '+f' on output register (PR #75208)

via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 12 08:02:42 PST 2023


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

to align with GCC asm: "+f" is not allowed to be used on output register.

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

>From 38e6bcf970d62deb5c6fa2ba33ae817d39124c6a Mon Sep 17 00:00:00 2001
From: knightXun <badgangkiller at gmail.com>
Date: Tue, 12 Dec 2023 23:57:56 +0800
Subject: [PATCH] [clang][sema] forbid '+f' on output register to align with
 GCC asm: "+f" is not allowed to be used on output register.

fix issue: https://github.com/llvm/llvm-project/issues/75019
---
 clang/lib/Basic/TargetInfo.cpp | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 6cd5d618a4aca..57a81e03bc484 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -717,8 +717,15 @@ bool TargetInfo::validateOutputConstraint(ConstraintInfo &Info) const {
   if (*Name != '=' && *Name != '+')
     return false;
 
-  if (*Name == '+')
+  if (*Name == '+') {
     Info.setIsReadWrite();
+    // To align with GCC asm: "=f" is not allowed, the
+    // operand constraints must select a class with a single reg.
+    auto Flag = Name + 1;
+    if (Flag && *Flag == 'f') {
+      return false;
+    }
+  }
 
   Name++;
   while (*Name) {



More information about the cfe-commits mailing list