summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2012-11-30 23:18:12 +0000
committerBill Wendling <isanbard@gmail.com>2012-11-30 23:18:12 +0000
commit3c6591d6ea4611b8ca0c3fc09a3554c2ae42a72c (patch)
treeab0d0d1556b50e385cc518e38d619d7d877086e0
parentf15af485a0e33ccc467c53d4e2b0dfc85b3d6930 (diff)
downloadbcm5719-llvm-3c6591d6ea4611b8ca0c3fc09a3554c2ae42a72c.tar.gz
bcm5719-llvm-3c6591d6ea4611b8ca0c3fc09a3554c2ae42a72c.zip
Don't warn if the input size is less than the register size. Also don't warn if
the output size is greater than the register size. No truncation occurs with those. Reword warning to make it clearer what's the problem is. llvm-svn: 169054
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td3
-rw-r--r--clang/lib/Basic/Targets.cpp4
-rw-r--r--clang/test/CodeGen/arm-asm-warn.c19
3 files changed, 19 insertions, 7 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 46a3bbc987b..18874b603f4 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -5152,7 +5152,8 @@ let CategoryName = "Inline Assembly Issue" in {
"accepted due to -fheinous-gnu-extensions, but clang may remove support "
"for this in the future">;
def warn_asm_mismatched_size_modifier : Warning<
- "the size being stored is truncated, use a modifier to specify the size">,
+ "the value is truncated when put into register, "
+ "use a modifier to specify the size">,
InGroup<ASMOperandWidths>;
}
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index d6312d6e5dc..3c076ca4f03 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -3364,6 +3364,8 @@ public:
virtual bool validateConstraintModifier(StringRef Constraint,
const char Modifier,
unsigned Size) const {
+ bool isOutput = (Constraint[0] == '=');
+
// Strip off constraint modifiers.
while (Constraint[0] == '=' ||
Constraint[0] == '+' ||
@@ -3375,7 +3377,7 @@ public:
case 'r': {
switch (Modifier) {
default:
- return Size == 32;
+ return (isOutput && Size >= 32) || Size <= 32;
case 'q':
// A register of size 32 cannot fit a vector type.
return false;
diff --git a/clang/test/CodeGen/arm-asm-warn.c b/clang/test/CodeGen/arm-asm-warn.c
index 0c4e97aba0d..38d5345cbdc 100644
--- a/clang/test/CodeGen/arm-asm-warn.c
+++ b/clang/test/CodeGen/arm-asm-warn.c
@@ -1,7 +1,16 @@
// REQUIRES: arm-registered-target
// RUN: %clang_cc1 -triple armv7 %s -emit-llvm -o /dev/null
-// <rdar://problem/12284092>
+char bar();
+
+void t1(int x, char y) {
+ __asm__ volatile("mcr p15, 0, %1, c9, c12, 5;"
+ "mrc p15, 0, %0, c9, c13, 2;"
+ : "=r" (x)
+ : "r" (bar())); // no warning
+}
+
+// <rdar://problem/12284092>
typedef __attribute__((neon_vector_type(2))) long long int64x2_t;
typedef struct int64x2x4_t {
int64x2_t val[4];
@@ -9,10 +18,10 @@ typedef struct int64x2x4_t {
int64x2x4_t t2(const long long a[]) {
int64x2x4_t r;
__asm__("vldm %[a], { %q[r0], %q[r1], %q[r2], %q[r3] }"
- : [r0] "=r"(r.val[0]), // expected-warning {{the size being stored is truncated, use a modifier to specify the size}}
- [r1] "=r"(r.val[1]), // expected-warning {{the size being stored is truncated, use a modifier to specify the size}}
- [r2] "=r"(r.val[2]), // expected-warning {{the size being stored is truncated, use a modifier to specify the size}}
- [r3] "=r"(r.val[3]) // expected-warning {{the size being stored is truncated, use a modifier to specify the size}}
+ : [r0] "=r"(r.val[0]), // expected-warning {{the value is truncated when put into register, use a modifier to specify the size}}
+ [r1] "=r"(r.val[1]), // expected-warning {{the value is truncated when put into register, use a modifier to specify the size}}
+ [r2] "=r"(r.val[2]), // expected-warning {{the value is truncated when put into register, use a modifier to specify the size}}
+ [r3] "=r"(r.val[3]) // expected-warning {{the value is truncated when put into register, use a modifier to specify the size}}
: [a] "r"(a));
return r;
}
OpenPOWER on IntegriCloud