diff options
author | Marina Yatsina <marina.yatsina@intel.com> | 2017-06-26 15:55:51 +0000 |
---|---|---|
committer | Marina Yatsina <marina.yatsina@intel.com> | 2017-06-26 15:55:51 +0000 |
commit | 33eb775265c510c4f1e96871de16f8d360ea8627 (patch) | |
tree | 212a39d436929fa424c707bd9ddb6527eef47693 | |
parent | 0ad0e5802bd3ec41da421fbd14db8d9d824171d5 (diff) | |
download | bcm5719-llvm-33eb775265c510c4f1e96871de16f8d360ea8627.tar.gz bcm5719-llvm-33eb775265c510c4f1e96871de16f8d360ea8627.zip |
[inline asm][gcc-compatiblity] "=i" output constraint support
Ignore ‘i’,’n’,’E’,’F’ as output constraints in inline assembly (gcc compatibility)
Differential Revision: https://reviews.llvm.org/D31383
llvm-svn: 306297
-rw-r--r-- | clang/lib/Basic/TargetInfo.cpp | 5 | ||||
-rw-r--r-- | clang/test/Sema/asm.c | 35 |
2 files changed, 40 insertions, 0 deletions
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index 8cfd8bde9cb..4bcebadf458 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -507,6 +507,11 @@ bool TargetInfo::validateOutputConstraint(ConstraintInfo &Info) const { case '?': // Disparage slightly code. case '!': // Disparage severely. case '*': // Ignore for choosing register preferences. + case 'i': // Ignore i,n,E,F as output constraints (match from the other + // chars) + case 'n': + case 'E': + case 'F': break; // Pass them. } diff --git a/clang/test/Sema/asm.c b/clang/test/Sema/asm.c index e49a1663a89..04b7cb19eb8 100644 --- a/clang/test/Sema/asm.c +++ b/clang/test/Sema/asm.c @@ -160,6 +160,41 @@ double test15() { return ret; } +void iOutputConstraint(int x){ + __asm ("nop" : "=ir" (x) : :); // no-error + __asm ("nop" : "=ri" (x) : :); // no-error + __asm ("nop" : "=ig" (x) : :); // no-error + __asm ("nop" : "=im" (x) : :); // no-error + __asm ("nop" : "=imr" (x) : :); // no-error + __asm ("nop" : "=i" (x) : :); // expected-error{{invalid output constraint '=i' in asm}} + __asm ("nop" : "+i" (x) : :); // expected-error{{invalid output constraint '+i' in asm}} + __asm ("nop" : "=ii" (x) : :); // expected-error{{invalid output constraint '=ii' in asm}} + __asm ("nop" : "=nr" (x) : :); // no-error + __asm ("nop" : "=rn" (x) : :); // no-error + __asm ("nop" : "=ng" (x) : :); // no-error + __asm ("nop" : "=nm" (x) : :); // no-error + __asm ("nop" : "=nmr" (x) : :); // no-error + __asm ("nop" : "=n" (x) : :); // expected-error{{invalid output constraint '=n' in asm}} + __asm ("nop" : "+n" (x) : :); // expected-error{{invalid output constraint '+n' in asm}} + __asm ("nop" : "=nn" (x) : :); // expected-error{{invalid output constraint '=nn' in asm}} + __asm ("nop" : "=Fr" (x) : :); // no-error + __asm ("nop" : "=rF" (x) : :); // no-error + __asm ("nop" : "=Fg" (x) : :); // no-error + __asm ("nop" : "=Fm" (x) : :); // no-error + __asm ("nop" : "=Fmr" (x) : :); // no-error + __asm ("nop" : "=F" (x) : :); // expected-error{{invalid output constraint '=F' in asm}} + __asm ("nop" : "+F" (x) : :); // expected-error{{invalid output constraint '+F' in asm}} + __asm ("nop" : "=FF" (x) : :); // expected-error{{invalid output constraint '=FF' in asm}} + __asm ("nop" : "=Er" (x) : :); // no-error + __asm ("nop" : "=rE" (x) : :); // no-error + __asm ("nop" : "=Eg" (x) : :); // no-error + __asm ("nop" : "=Em" (x) : :); // no-error + __asm ("nop" : "=Emr" (x) : :); // no-error + __asm ("nop" : "=E" (x) : :); // expected-error{{invalid output constraint '=E' in asm}} + __asm ("nop" : "+E" (x) : :); // expected-error{{invalid output constraint '+E' in asm}} + __asm ("nop" : "=EE" (x) : :); // expected-error{{invalid output constraint '=EE' in asm}} +} + // PR19837 struct foo { int a; |