<div dir="ltr">Looks good. Thanks!<div><br></div><div>-eric</div></div><div class="gmail_extra"><br><div class="gmail_quote">2014-09-17 16:35 GMT-07:00 Akira Hatanaka <span dir="ltr"><<a href="mailto:ahatanaka@apple.com" target="_blank">ahatanaka@apple.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ahatanak<br>
Date: Wed Sep 17 18:35:14 2014<br>
New Revision: 217994<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=217994&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=217994&view=rev</a><br>
Log:<br>
[X86, inline-asm] Check that the input size is correct for constraints R, q, Q,<br>
S, D, A, y, x, f, t, and u.<br>
<br>
This is a follow-up patch for r167717.<br>
<br>
rdar://problem/11846140<br>
rdar://problem/17476970<br>
<br>
Modified:<br>
    cfe/trunk/lib/Basic/Targets.cpp<br>
    cfe/trunk/test/CodeGen/x86_32-inline-asm.c<br>
<br>
Modified: cfe/trunk/lib/Basic/Targets.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=217994&r1=217993&r2=217994&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=217994&r1=217993&r2=217994&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Basic/Targets.cpp (original)<br>
+++ cfe/trunk/lib/Basic/Targets.cpp Wed Sep 17 18:35:14 2014<br>
@@ -1899,6 +1899,9 @@ public:<br>
   }<br>
   bool validateAsmConstraint(const char *&Name,<br>
                                      TargetInfo::ConstraintInfo &info) const override;<br>
+<br>
+  bool validateInputSize(StringRef Constraint, unsigned Size) const override;<br>
+<br>
   std::string convertConstraint(const char *&Constraint) const override;<br>
   const char *getClobbers() const override {<br>
     return "~{dirflag},~{fpsr},~{flags}";<br>
@@ -3049,6 +3052,21 @@ X86TargetInfo::validateAsmConstraint(con<br>
   }<br>
 }<br>
<br>
+bool X86TargetInfo::validateInputSize(StringRef Constraint,<br>
+                                      unsigned Size) const {<br>
+  switch (Constraint[0]) {<br>
+  default: break;<br>
+  case 'y':<br>
+    return Size <= 64;<br>
+  case 'x':<br>
+  case 'f':<br>
+  case 't':<br>
+  case 'u':<br>
+    return Size <= 128;<br>
+  }<br>
+<br>
+  return true;<br>
+}<br>
<br>
 std::string<br>
 X86TargetInfo::convertConstraint(const char *&Constraint) const {<br>
@@ -3109,14 +3127,21 @@ public:<br>
                          unsigned Size) const override {<br>
     switch (Constraint[0]) {<br>
     default: break;<br>
+    case 'R':<br>
+    case 'q':<br>
+    case 'Q':<br>
     case 'a':<br>
     case 'b':<br>
     case 'c':<br>
     case 'd':<br>
+    case 'S':<br>
+    case 'D':<br>
       return Size <= 32;<br>
+    case 'A':<br>
+      return Size <= 64;<br>
     }<br>
<br>
-    return true;<br>
+    return X86TargetInfo::validateInputSize(Constraint, Size);<br>
   }<br>
 };<br>
 } // end anonymous namespace<br>
<br>
Modified: cfe/trunk/test/CodeGen/x86_32-inline-asm.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/x86_32-inline-asm.c?rev=217994&r1=217993&r2=217994&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/x86_32-inline-asm.c?rev=217994&r1=217993&r2=217994&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/x86_32-inline-asm.c (original)<br>
+++ cfe/trunk/test/CodeGen/x86_32-inline-asm.c Wed Sep 17 18:35:14 2014<br>
@@ -1,5 +1,8 @@<br>
 // RUN: %clang_cc1 -triple i386-apple-darwin9 -verify %s<br>
+<br>
 // <rdar://problem/12415959><br>
+// rdar://problem/11846140<br>
+// rdar://problem/17476970<br>
<br>
 typedef unsigned int u_int32_t;<br>
 typedef u_int32_t uint32_t;<br>
@@ -7,6 +10,12 @@ typedef u_int32_t uint32_t;<br>
 typedef unsigned long long u_int64_t;<br>
 typedef u_int64_t uint64_t;<br>
<br>
+typedef float __m128 __attribute__ ((vector_size (16)));<br>
+typedef float __m256 __attribute__ ((vector_size (32)));<br>
+<br>
+__m128 val128;<br>
+__m256 val256;<br>
+<br>
 int func1() {<br>
   // Error out if size is > 32-bits.<br>
   uint32_t msr = 0x8b;<br>
@@ -21,4 +30,17 @@ int func1() {<br>
   unsigned char data;<br>
   unsigned int port;<br>
   __asm__ volatile("outb %0, %w1" : : "a" (data), "Nd" (port)); // No error expected.<br>
+<br>
+  __asm__ volatile("outb %0, %w1" : : "R" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'R'}}<br>
+  __asm__ volatile("outb %0, %w1" : : "q" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'q'}}<br>
+  __asm__ volatile("outb %0, %w1" : : "Q" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'Q'}}<br>
+  __asm__ volatile("outb %0, %w1" : : "b" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'b'}}<br>
+  __asm__ volatile("outb %0, %w1" : : "c" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'c'}}<br>
+  __asm__ volatile("outb %0, %w1" : : "d" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'd'}}<br>
+  __asm__ volatile("outb %0, %w1" : : "S" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'S'}}<br>
+  __asm__ volatile("outb %0, %w1" : : "D" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'D'}}<br>
+  __asm__ volatile("foo1 %0" : : "A" (val128)); // expected-error {{invalid input size for constraint 'A'}}<br>
+  __asm__ volatile("foo1 %0" : : "f" (val256)); // expected-error {{invalid input size for constraint 'f'}}<br>
+  __asm__ volatile("foo1 %0" : : "t" (val256)); // expected-error {{invalid input size for constraint 't'}}<br>
+  __asm__ volatile("foo1 %0" : : "u" (val256)); // expected-error {{invalid input size for constraint 'u'}}<br>
 }<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>