[clang] 75365b2 - [clang][AVR] Restrict range of assembly constraint 'G' (#76561)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 3 23:52:01 PST 2024
Author: Ben Shi
Date: 2024-01-04T15:51:57+08:00
New Revision: 75365b2e189a54b96a907ebe327c5898dd7aad14
URL: https://github.com/llvm/llvm-project/commit/75365b2e189a54b96a907ebe327c5898dd7aad14
DIFF: https://github.com/llvm/llvm-project/commit/75365b2e189a54b96a907ebe327c5898dd7aad14.diff
LOG: [clang][AVR] Restrict range of assembly constraint 'G' (#76561)
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.
Added:
Modified:
clang/lib/Basic/Targets/AVR.h
clang/test/CodeGen/avr/avr-inline-asm-constraints.c
clang/test/CodeGen/avr/avr-unsupported-inline-asm-constraints.c
Removed:
################################################################################
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'}}
}
More information about the cfe-commits
mailing list