https://github.com/benshi001 updated https://github.com/llvm/llvm-project/pull/76561
>From 66a786a0353d8ae88006e585861fcb2035797032 Mon Sep 17 00:00:00 2001 From: Ben Shi <benn...@tencent.com> Date: Fri, 29 Dec 2023 17:58:21 +0800 Subject: [PATCH] [clang][AVR] Restrict range of assembly constraint 'G' According to https://www.nongnu.org/avr-libc/user-manual/inline_asm.html, "G" only represent float constant "0.0". And avr-gcc also rejects other non-zero values. --- clang/lib/Basic/Targets/AVR.h | 4 +++- clang/test/CodeGen/avr/avr-inline-asm-constraints.c | 4 ++-- .../test/CodeGen/avr/avr-unsupported-inline-asm-constraints.c | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) 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'}} } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits