diff options
author | John Thompson <John.Thompson.JTSoftware@gmail.com> | 2010-09-18 01:15:13 +0000 |
---|---|---|
committer | John Thompson <John.Thompson.JTSoftware@gmail.com> | 2010-09-18 01:15:13 +0000 |
commit | 2f474ea9ef7505df5d092287c48c19974222293b (patch) | |
tree | 09fbb002f5e69770137dbb3115bf9c7234091393 | |
parent | 01add59bc8fd178960ad61169bc01566b0d6614c (diff) |
Added '|' delimiter to separate inline asm multiple alternative constraints for Clang side of support.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114253 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Basic/TargetInfo.cpp | 3 | ||||
-rw-r--r-- | lib/CodeGen/CGStmt.cpp | 9 | ||||
-rw-r--r-- | test/CodeGen/asm-inout.c | 12 | ||||
-rw-r--r-- | test/Parser/asm-constraints-pr7869.c | 2 |
4 files changed, 17 insertions, 9 deletions
diff --git a/lib/Basic/TargetInfo.cpp b/lib/Basic/TargetInfo.cpp index c7036bfd04..c7176413e0 100644 --- a/lib/Basic/TargetInfo.cpp +++ b/lib/Basic/TargetInfo.cpp @@ -295,9 +295,8 @@ bool TargetInfo::validateOutputConstraint(ConstraintInfo &Info) const { Info.setAllowsMemory(); break; case ',': // multiple alternative constraint. Pass it. - Name++; // Handle additional optional '=' or '+' modifiers. - if (*Name == '=' || *Name == '+') + if (Name[1] == '=' || Name[1] == '+') Name++; break; case '?': // Disparage slightly code. diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index a70534d2ca..e83bea6d58 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -861,14 +861,11 @@ static std::string SimplifyConstraint(const char *Constraint, const TargetInfo &Target, llvm::SmallVectorImpl<TargetInfo::ConstraintInfo> *OutCons=0) { std::string Result; - std::string tmp; while (*Constraint) { switch (*Constraint) { default: - tmp = Target.convertConstraint(*Constraint); - if (Result.find(tmp) == std::string::npos) // Combine unique constraints - Result += tmp; + Result += Target.convertConstraint(*Constraint); break; // Ignore these case '*': @@ -877,8 +874,8 @@ SimplifyConstraint(const char *Constraint, const TargetInfo &Target, case '=': // Will see this and the following in mult-alt constraints. case '+': break; - case ',': // FIXME - Until the back-end properly supports - return Result; // multiple alternative constraints, we stop here. + case ',': + Result += "|"; break; case 'g': Result += "imr"; diff --git a/test/CodeGen/asm-inout.c b/test/CodeGen/asm-inout.c index f04276693e..5b0a5f7ef1 100644 --- a/test/CodeGen/asm-inout.c +++ b/test/CodeGen/asm-inout.c @@ -17,3 +17,15 @@ void test2() { // CHECK: store i32 {{%[a-zA-Z0-9\.]+}}, i32* [[REGCALLRESULT]] asm ("foobar" : "+r"(*foo())); } + +// PR7338 +void test3(int *vout, int vin) +{ + // CHECK: call void asm "opr $0,$1", "=*r|m|r,r|m|r,~{di},~{dirflag},~{fpsr},~{flags}" +asm( + "opr %[vout],%[vin]" + : [vout] "=r,=m,=r" (*vout) + : [vin] "r,m,r" (vin) + : "edi" + ); +} diff --git a/test/Parser/asm-constraints-pr7869.c b/test/Parser/asm-constraints-pr7869.c index d6f1725f1a..db369911cf 100644 --- a/test/Parser/asm-constraints-pr7869.c +++ b/test/Parser/asm-constraints-pr7869.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 %s int a, b, c, d, e, f, g, h, i, j, k, l; |