IR: Add missing tests for function-local metadata
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Sun, 7 Dec 2014 17:56:16 +0000 (17:56 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Sun, 7 Dec 2014 17:56:16 +0000 (17:56 +0000)
Add assembly and bitcode tests that I neglected to add in r223564 (IR:
Disallow complicated function-local metadata) and r223574 (IR: Disallow
function-local metadata attachments).

Found a couple of bugs:

  - The error message for function-local attachments gave the wrong line
    number -- it indicated the next token (typically on the next line)
    instead of the token that started the attachment.  Fixed.

  - Metadata arguments of the form `!{i32 0, i32 %v}` (or with the
    arguments reversed) fired an assertion in `ValueEnumerator` in LLVM
    v3.5, so I suppose this never really worked.  I suppose this was
    "fixed" by r223564.

(Thanks to dblaikie for pointing out my omission.)

Part of PR21532.

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

lib/AsmParser/LLParser.cpp
test/Assembler/functionlocal-metadata-attachments.ll [new file with mode: 0644]
test/Assembler/functionlocal-metadata-complex-1.ll [new file with mode: 0644]
test/Assembler/functionlocal-metadata-complex-2.ll [new file with mode: 0644]
test/Assembler/functionlocal-metadata-complex-3.ll [new file with mode: 0644]
test/Bitcode/function-local-metadata.ll [new file with mode: 0644]
test/Bitcode/function-local-metadata.ll.bc [new file with mode: 0644]

index f44af673fcd0ded1986dd7047ebf323126e673d5..e1c00cc4af0e9626e04b498b1535954f865a1db1 100644 (file)
@@ -1532,7 +1532,7 @@ bool LLParser::ParseInstructionMetadata(Instruction *Inst,
         return true;
       assert(ID.Kind == ValID::t_MDNode);
       if (ID.MDNodeVal->isFunctionLocal())
-        return TokError("unexpected function-local metadata");
+        return Error(Loc, "unexpected function-local metadata");
       Inst->setMetadata(MDK, ID.MDNodeVal);
     } else {
       unsigned NodeID = 0;
diff --git a/test/Assembler/functionlocal-metadata-attachments.ll b/test/Assembler/functionlocal-metadata-attachments.ll
new file mode 100644 (file)
index 0000000..71d8fa1
--- /dev/null
@@ -0,0 +1,7 @@
+; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s
+
+define void @foo(i32 %v) {
+entry:
+; CHECK: <stdin>:[[@LINE+1]]:{{[0-9]+}}: error: unexpected function-local metadata
+  ret void, !foo !{i32 %v}
+}
diff --git a/test/Assembler/functionlocal-metadata-complex-1.ll b/test/Assembler/functionlocal-metadata-complex-1.ll
new file mode 100644 (file)
index 0000000..81337db
--- /dev/null
@@ -0,0 +1,10 @@
+; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s
+
+define void @foo(i32 %v) {
+entry:
+; CHECK: <stdin>:[[@LINE+1]]:{{[0-9]+}}: error: unexpected operand after function-local metadata
+  call void @llvm.bar(metadata !{i32 %v, i32 0})
+  ret void
+}
+
+declare void @llvm.bar(metadata)
diff --git a/test/Assembler/functionlocal-metadata-complex-2.ll b/test/Assembler/functionlocal-metadata-complex-2.ll
new file mode 100644 (file)
index 0000000..15a4412
--- /dev/null
@@ -0,0 +1,10 @@
+; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s
+
+define void @foo(i32 %v) {
+entry:
+; CHECK: <stdin>:[[@LINE+1]]:{{[0-9]+}}: error: unexpected function-local metadata
+  call void @llvm.bar(metadata !{i32 0, i32 %v})
+  ret void
+}
+
+declare void @llvm.bar(metadata)
diff --git a/test/Assembler/functionlocal-metadata-complex-3.ll b/test/Assembler/functionlocal-metadata-complex-3.ll
new file mode 100644 (file)
index 0000000..1590efa
--- /dev/null
@@ -0,0 +1,10 @@
+; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s
+
+define void @foo(i32 %v) {
+entry:
+; CHECK: <stdin>:[[@LINE+1]]:{{[0-9]+}}: error: unexpected nested function-local metadata
+  call void @llvm.bar(metadata !{metadata !{i32 %v}})
+  ret void
+}
+
+declare void @llvm.bar(metadata)
diff --git a/test/Bitcode/function-local-metadata.ll b/test/Bitcode/function-local-metadata.ll
new file mode 100644 (file)
index 0000000..58fb64c
--- /dev/null
@@ -0,0 +1,35 @@
+; RUN: llvm-dis < %s.bc | FileCheck %s
+
+; Check that function-local metadata is dropped correctly when it's not a
+; direct argument to a call instruction.
+;
+; Bitcode assembled by llvm-as v3.5.0.
+
+define void @foo(i32 %v) {
+; CHECK: entry:
+entry:
+; CHECK-NEXT: call void @llvm.bar(metadata !{i32 %v})
+  call void @llvm.bar(metadata !{i32 %v})
+
+; Note: these supposedly legal instructions fired an assertion in llvm-as:
+;
+; Assertion failed: (I != ValueMap.end() && "Value not in slotcalculator!"), function getValueID, file lib/Bitcode/Writer/ValueEnumerator.cpp, line 138.
+;
+; So, I didn't test them; it looks like bitcode compatability is irrelevant.
+  ; call void @llvm.bar(metadata !{i32 0, i32 %v})
+  ; call void @llvm.bar(metadata !{i32 %v, i32 0})
+  ; call void @llvm.bar(metadata !{metadata !{}, i32 %v})
+  ; call void @llvm.bar(metadata !{i32 %v, metadata !{}})
+
+; CHECK-NEXT: call void @llvm.bar(metadata !0)
+; CHECK-NEXT: call void @llvm.bar(metadata !0)
+  call void @llvm.bar(metadata !{i32 %v, i32 %v})
+  call void @llvm.bar(metadata !{metadata !{i32 %v}})
+
+; CHECK-NEXT: ret void{{$}}
+  ret void, !baz !{i32 %v}
+}
+
+declare void @llvm.bar(metadata)
+
+; CHECK: !0 = metadata !{}
diff --git a/test/Bitcode/function-local-metadata.ll.bc b/test/Bitcode/function-local-metadata.ll.bc
new file mode 100644 (file)
index 0000000..6323ca4
Binary files /dev/null and b/test/Bitcode/function-local-metadata.ll.bc differ