diff options
-rw-r--r-- | lib/Basic/TargetInfo.cpp | 4 | ||||
-rw-r--r-- | lib/CodeGen/CGStmt.cpp | 4 | ||||
-rw-r--r-- | test/CodeGen/asm.c | 9 |
3 files changed, 17 insertions, 0 deletions
diff --git a/lib/Basic/TargetInfo.cpp b/lib/Basic/TargetInfo.cpp index b89b18b3ae..3257526289 100644 --- a/lib/Basic/TargetInfo.cpp +++ b/lib/Basic/TargetInfo.cpp @@ -364,6 +364,8 @@ bool TargetInfo::validateOutputConstraint(ConstraintInfo &Info) const { break; case '?': // Disparage slightly code. case '!': // Disparage severely. + case '#': // Ignore as constraint. + case '*': // Ignore for choosing register preferences. break; // Pass them. } @@ -483,6 +485,8 @@ bool TargetInfo::validateInputConstraint(ConstraintInfo *OutputConstraints, break; case '?': // Disparage slightly code. case '!': // Disparage severely. + case '#': // Ignore as constraint. + case '*': // Ignore for choosing register preferences. break; // Pass them. } diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index 5c1fea4472..3548dbac6f 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -1280,6 +1280,10 @@ SimplifyConstraint(const char *Constraint, const TargetInfo &Target, case '=': // Will see this and the following in mult-alt constraints. case '+': break; + case '#': // Ignore the rest of the constraint alternative. + while (Constraint[1] && Constraint[1] != ',') + Constraint++; + break; case ',': Result += "|"; break; diff --git a/test/CodeGen/asm.c b/test/CodeGen/asm.c index b0097368ec..670c24405d 100644 --- a/test/CodeGen/asm.c +++ b/test/CodeGen/asm.c @@ -230,3 +230,12 @@ void t27(void) { // CHECK-NOT: ia_nsdialect // CHECK: ret void } + +// Check handling of '*' and '#' constraint modifiers. +void t28(void) +{ + asm volatile ("/* %0 */" : : "i#*X,*r" (1)); +// CHECK: @t28 +// CHECK: call void asm sideeffect "/* $0 */", "i|r,~{dirflag},~{fpsr},~{flags}"(i32 1) +} + |