IR: Add missing tests for function-local metadata

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.

llvm-svn: 223616
This commit is contained in:
Duncan P. N. Exon Smith 2014-12-07 17:56:16 +00:00
parent 156b10f50e
commit 7c303fdacc
7 changed files with 73 additions and 1 deletions

View 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;

View File

@ -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}
}

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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 !{}

Binary file not shown.