diff options
| author | Bill Wendling <isanbard@gmail.com> | 2012-11-30 23:46:56 +0000 |
|---|---|---|
| committer | Bill Wendling <isanbard@gmail.com> | 2012-11-30 23:46:56 +0000 |
| commit | 0517508c005df2c8682312744214ea8f65a2d226 (patch) | |
| tree | 3b8ea0521976b8db02daafe30febf9327f3c629c | |
| parent | 47238dc057beb24f4c0d1fc25db954a7ee3861ca (diff) | |
| download | bcm5719-llvm-0517508c005df2c8682312744214ea8f65a2d226.tar.gz bcm5719-llvm-0517508c005df2c8682312744214ea8f65a2d226.zip | |
Don't emit a warning with an input/output parameter. We assume the user knows what they're doing here.
llvm-svn: 169059
| -rw-r--r-- | clang/lib/Basic/Targets.cpp | 4 | ||||
| -rw-r--r-- | clang/test/CodeGen/arm-asm-warn.c | 4 |
2 files changed, 7 insertions, 1 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 3c076ca4f03..6a30ca84764 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -3365,6 +3365,7 @@ public: const char Modifier, unsigned Size) const { bool isOutput = (Constraint[0] == '='); + bool isInOut = (Constraint[0] == '+'); // Strip off constraint modifiers. while (Constraint[0] == '=' || @@ -3377,7 +3378,8 @@ public: case 'r': { switch (Modifier) { default: - return (isOutput && Size >= 32) || Size <= 32; + return isInOut || (isOutput && Size >= 32) || + (!isOutput && !isInOut && Size <= 32); case 'q': // A register of size 32 cannot fit a vector type. return false; diff --git a/clang/test/CodeGen/arm-asm-warn.c b/clang/test/CodeGen/arm-asm-warn.c index 38d5345cbdc..9b52dd695a5 100644 --- a/clang/test/CodeGen/arm-asm-warn.c +++ b/clang/test/CodeGen/arm-asm-warn.c @@ -8,6 +8,10 @@ void t1(int x, char y) { "mrc p15, 0, %0, c9, c13, 2;" : "=r" (x) : "r" (bar())); // no warning + __asm__ volatile("foo %0, %1" + : "+r" (x), + "+r" (y) + :); } // <rdar://problem/12284092> |

