[inline asm] Don't reject duplicated matching constraints
authorBenjamin Kramer <benny.kra@googlemail.com>
Sun, 29 Mar 2015 20:33:07 +0000 (20:33 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sun, 29 Mar 2015 20:33:07 +0000 (20:33 +0000)
They're harmless and it's easy to generate them from clang, leading to
a crash in LLVM. Found by afl-fuzz.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233500 91177308-0d34-0410-b5e6-96231b3b80d8

lib/IR/InlineAsm.cpp
test/CodeGen/X86/inline-asm-duplicated-constraint.ll [new file with mode: 0644]

index b456d9f5869671043c1fa9b3b8c602183be4fc99..47dce20a517f1543ed5a94a4bfd49608df0dfd9c 100644 (file)
@@ -167,7 +167,8 @@ bool InlineAsm::ConstraintInfo::Parse(StringRef Str,
         // Note that operand #n has a matching input.
         scInfo.MatchingInput = ConstraintsSoFar.size();
       } else {
-        if (ConstraintsSoFar[N].hasMatchingInput())
+        if (ConstraintsSoFar[N].hasMatchingInput() &&
+            ConstraintsSoFar[N].MatchingInput != ConstraintsSoFar.size())
           return true;
         // Note that operand #n has a matching input.
         ConstraintsSoFar[N].MatchingInput = ConstraintsSoFar.size();
diff --git a/test/CodeGen/X86/inline-asm-duplicated-constraint.ll b/test/CodeGen/X86/inline-asm-duplicated-constraint.ll
new file mode 100644 (file)
index 0000000..2ef5474
--- /dev/null
@@ -0,0 +1,12 @@
+; RUN: llc < %s -march=x86-64 -no-integrated-as -mtriple=x86_64-linux-gnu | FileCheck %s
+
+; CHECK-LABEL: test1:
+; CHECK: movl  (%rdi), %eax
+; CHECK: nop
+; CHECK: movl  %eax, (%rdi)
+; CHECK: ret
+define void @test1(i32* %l) {
+  %load = load i32, i32* %l
+  call void asm "nop", "=*rmrm,0m0m,~{dirflag},~{fpsr},~{flags}"(i32* %l, i32 %load)
+  ret void
+}