Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[clang][AVR] Restrict range of assembly constraint 'G' #76561

Merged
merged 1 commit into from
Jan 4, 2024
Merged

[clang][AVR] Restrict range of assembly constraint 'G' #76561

merged 1 commit into from
Jan 4, 2024

Conversation

benshi001
Copy link
Member

@benshi001 benshi001 commented Dec 29, 2023

According to https://www.nongnu.org/avr-libc/user-manual/inline_asm.html, "G" only represents floating point constant '0.0'. And avr-gcc also rejects other non-zero FP values.

@llvmbot llvmbot added clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" labels Dec 29, 2023
@llvmbot
Copy link
Collaborator

llvmbot commented Dec 29, 2023

@llvm/pr-subscribers-clang

Author: Ben Shi (benshi001)

Changes

According to https://www.nongnu.org/avr-libc/user-manual/inline_asm.html, "G" only represent a float constraint "0.0". And avr-gcc also rejects other non-zero values.


Full diff: https://github.com/llvm/llvm-project/pull/76561.diff

3 Files Affected:

  • (modified) clang/lib/Basic/Targets/AVR.h (+3-1)
  • (modified) clang/test/CodeGen/avr/avr-inline-asm-constraints.c (+2-2)
  • (modified) clang/test/CodeGen/avr/avr-unsupported-inline-asm-constraints.c (+1)
diff --git a/clang/lib/Basic/Targets/AVR.h b/clang/lib/Basic/Targets/AVR.h
index 854a51d78c393b..9376c46cd98ca1 100644
--- a/clang/lib/Basic/Targets/AVR.h
+++ b/clang/lib/Basic/Targets/AVR.h
@@ -146,7 +146,9 @@ class LLVM_LIBRARY_VISIBILITY AVRTargetInfo : public TargetInfo {
     case 'R': // Integer constant (Range: -6 to 5)
       Info.setRequiresImmediate(-6, 5);
       return true;
-    case 'G': // Floating point constant
+    case 'G': // Floating point constant 0.0
+      Info.setRequiresImmediate(0);
+      return true;
     case 'Q': // A memory address based on Y or Z pointer with displacement.
       return true;
     }
diff --git a/clang/test/CodeGen/avr/avr-inline-asm-constraints.c b/clang/test/CodeGen/avr/avr-inline-asm-constraints.c
index 96774861feb228..3a956de8db48f0 100644
--- a/clang/test/CodeGen/avr/avr-inline-asm-constraints.c
+++ b/clang/test/CodeGen/avr/avr-inline-asm-constraints.c
@@ -109,8 +109,8 @@ void R() {
 }
 
 void G() {
-  // CHECK: call addrspace(0) void asm sideeffect "subi r30, $0", "G"(i16 50)
-  asm("subi r30, %0" :: "G"(50));
+  // CHECK: call addrspace(0) void asm sideeffect "subi r30, $0", "G"(i16 0)
+  asm("subi r30, %0" :: "G"(0));
 }
 
 void Q() {
diff --git a/clang/test/CodeGen/avr/avr-unsupported-inline-asm-constraints.c b/clang/test/CodeGen/avr/avr-unsupported-inline-asm-constraints.c
index ceea59229f736a..29f0b69285fa88 100644
--- a/clang/test/CodeGen/avr/avr-unsupported-inline-asm-constraints.c
+++ b/clang/test/CodeGen/avr/avr-unsupported-inline-asm-constraints.c
@@ -5,4 +5,5 @@ const unsigned char val = 0;
 int foo(void) {
   __asm__ volatile("foo %0, 1" : : "fo" (val)); // expected-error {{invalid input constraint 'fo' in asm}}
   __asm__ volatile("foo %0, 1" : : "Nd" (val)); // expected-error {{invalid input constraint 'Nd' in asm}}
+  __asm__ volatile("subi r30, %0" : : "G" (1)); // expected-error {{value '1' out of range for constraint 'G'}}
 }

According to https://www.nongnu.org/avr-libc/user-manual/inline_asm.html,
"G" only represents floating point constant '0.0'. And avr-gcc also
rejects other non-zero FP values.
@SixWeining
Copy link
Contributor

LGTM. I have checked with https://gcc.gnu.org/onlinedocs/gccint/Machine-Constraints.html. 'G' stands for "A floating point constant 0.0". But I'd like to wait others' opinion.

Copy link
Contributor

@jacquesguan jacquesguan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@benshi001 benshi001 merged commit 75365b2 into llvm:main Jan 4, 2024
4 checks passed
@benshi001 benshi001 deleted the avr branch January 4, 2024 07:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
clang:frontend Language frontend issues, e.g. anything involving "Sema" clang Clang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants