]> granicus.if.org Git - clang/commitdiff
Revert part of r206963
authorJames Molloy <james.molloy@arm.com>
Fri, 25 Jul 2014 10:19:47 +0000 (10:19 +0000)
committerJames Molloy <james.molloy@arm.com>
Fri, 25 Jul 2014 10:19:47 +0000 (10:19 +0000)
Specifically the part where we removed a warning to be compatible with GCC, which has been widely regarded as a bad idea.

I'm not quite happy with how obtuse this warning is, especially in the fairly common case of a 32-bit integer literal, so I've got another patch awaiting review that adds a fixit to reduce confusion.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@213935 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/Targets.cpp
test/Sema/arm64-inline-asm.c
test/Sema/inline-asm-validate.c

index b0ca5a547c5033a36e2a9367eb1ca77277392947..e78244d95c6c8ae3b44135349d31fcc85f51a6ab 100644 (file)
@@ -4503,6 +4503,33 @@ public:
     return false;
   }
 
+  virtual bool validateConstraintModifier(StringRef Constraint,
+                                          const char Modifier,
+                                          unsigned Size) const {
+    // Strip off constraint modifiers.
+    while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
+      Constraint = Constraint.substr(1);
+
+    switch (Constraint[0]) {
+    default:
+      return true;
+    case 'z':
+    case 'r': {
+      switch (Modifier) {
+      case 'x':
+      case 'w':
+        // For now assume that the person knows what they're
+        // doing with the modifier.
+        return true;
+      default:
+        // By default an 'r' constraint will be in the 'x'
+        // registers.
+        return Size == 64;
+      }
+    }
+    }
+  }
+
   virtual const char *getClobbers() const { return ""; }
 
   int getEHDataRegisterNumber(unsigned RegNo) const {
index 08eb669265f71ab0356443eec4b3f1a1f64b07ac..2cfbe4692965d2c3aa129b477408ca952de85a72 100644 (file)
@@ -1,9 +1,9 @@
 // RUN: %clang_cc1 -triple arm64-apple-ios7.1 -fsyntax-only -verify %s
-// expected-no-diagnostics
 
 void foo() {
   asm volatile("USE(%0)" :: "z"(0LL));
   asm volatile("USE(%x0)" :: "z"(0LL));
   asm volatile("USE(%w0)" :: "z"(0));
 
+  asm volatile("USE(%0)" :: "z"(0)); // expected-warning {{value size does not match register size specified by the constraint and modifier}}
 }
index c32dedb65e8c6b2b9f9540d412c86a5941631ddd..6fa760c809275b6db6d446ff42ae8119d395c8d2 100644 (file)
@@ -1,9 +1,8 @@
 // RUN: %clang_cc1 -triple arm64-apple-macosx10.8.0 -fsyntax-only -verify %s
-// expected-no-diagnostics
 
 unsigned t, r, *p;
 
 int foo (void) {
-  __asm__ __volatile__( "stxr   %w[_t], %[_r], [%[_p]]" : [_t] "=&r" (t) : [_p] "p" (p), [_r] "r" (r) : "memory");
+  __asm__ __volatile__( "stxr   %w[_t], %[_r], [%[_p]]" : [_t] "=&r" (t) : [_p] "p" (p), [_r] "r" (r) : "memory"); // expected-warning{{value size does not match register size specified by the constraint and modifier}}
   return 1;
 }