[X86, inline-asm] Check that the input size is correct for constraints R, q, Q,

S, D, A, y, x, f, t, and u.

This is a follow-up patch for r167717.

rdar://problem/11846140
rdar://problem/17476970

llvm-svn: 217994
This commit is contained in:
Akira Hatanaka 2014-09-17 23:35:14 +00:00
parent 61570df715
commit 31c6d3b71e
2 changed files with 48 additions and 1 deletions

View File

@ -1899,6 +1899,9 @@ public:
}
bool validateAsmConstraint(const char *&Name,
TargetInfo::ConstraintInfo &info) const override;
bool validateInputSize(StringRef Constraint, unsigned Size) const override;
std::string convertConstraint(const char *&Constraint) const override;
const char *getClobbers() const override {
return "~{dirflag},~{fpsr},~{flags}";
@ -3049,6 +3052,21 @@ X86TargetInfo::validateAsmConstraint(const char *&Name,
}
}
bool X86TargetInfo::validateInputSize(StringRef Constraint,
unsigned Size) const {
switch (Constraint[0]) {
default: break;
case 'y':
return Size <= 64;
case 'x':
case 'f':
case 't':
case 'u':
return Size <= 128;
}
return true;
}
std::string
X86TargetInfo::convertConstraint(const char *&Constraint) const {
@ -3109,14 +3127,21 @@ public:
unsigned Size) const override {
switch (Constraint[0]) {
default: break;
case 'R':
case 'q':
case 'Q':
case 'a':
case 'b':
case 'c':
case 'd':
case 'S':
case 'D':
return Size <= 32;
case 'A':
return Size <= 64;
}
return true;
return X86TargetInfo::validateInputSize(Constraint, Size);
}
};
} // end anonymous namespace

View File

@ -1,5 +1,8 @@
// RUN: %clang_cc1 -triple i386-apple-darwin9 -verify %s
// <rdar://problem/12415959>
// rdar://problem/11846140
// rdar://problem/17476970
typedef unsigned int u_int32_t;
typedef u_int32_t uint32_t;
@ -7,6 +10,12 @@ typedef u_int32_t uint32_t;
typedef unsigned long long u_int64_t;
typedef u_int64_t uint64_t;
typedef float __m128 __attribute__ ((vector_size (16)));
typedef float __m256 __attribute__ ((vector_size (32)));
__m128 val128;
__m256 val256;
int func1() {
// Error out if size is > 32-bits.
uint32_t msr = 0x8b;
@ -21,4 +30,17 @@ int func1() {
unsigned char data;
unsigned int port;
__asm__ volatile("outb %0, %w1" : : "a" (data), "Nd" (port)); // No error expected.
__asm__ volatile("outb %0, %w1" : : "R" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'R'}}
__asm__ volatile("outb %0, %w1" : : "q" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'q'}}
__asm__ volatile("outb %0, %w1" : : "Q" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'Q'}}
__asm__ volatile("outb %0, %w1" : : "b" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'b'}}
__asm__ volatile("outb %0, %w1" : : "c" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'c'}}
__asm__ volatile("outb %0, %w1" : : "d" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'd'}}
__asm__ volatile("outb %0, %w1" : : "S" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'S'}}
__asm__ volatile("outb %0, %w1" : : "D" (val), "Nd" (port)); // expected-error {{invalid input size for constraint 'D'}}
__asm__ volatile("foo1 %0" : : "A" (val128)); // expected-error {{invalid input size for constraint 'A'}}
__asm__ volatile("foo1 %0" : : "f" (val256)); // expected-error {{invalid input size for constraint 'f'}}
__asm__ volatile("foo1 %0" : : "t" (val256)); // expected-error {{invalid input size for constraint 't'}}
__asm__ volatile("foo1 %0" : : "u" (val256)); // expected-error {{invalid input size for constraint 'u'}}
}