From a77df65a84ff90be517de5fd13bdec0bede3ce36 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Sun, 7 Dec 2014 17:56:16 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223616 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AsmParser/LLParser.cpp | 2 +- .../functionlocal-metadata-attachments.ll | 7 ++++ .../functionlocal-metadata-complex-1.ll | 10 +++++ .../functionlocal-metadata-complex-2.ll | 10 +++++ .../functionlocal-metadata-complex-3.ll | 10 +++++ test/Bitcode/function-local-metadata.ll | 35 ++++++++++++++++++ test/Bitcode/function-local-metadata.ll.bc | Bin 0 -> 396 bytes 7 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 test/Assembler/functionlocal-metadata-attachments.ll create mode 100644 test/Assembler/functionlocal-metadata-complex-1.ll create mode 100644 test/Assembler/functionlocal-metadata-complex-2.ll create mode 100644 test/Assembler/functionlocal-metadata-complex-3.ll create mode 100644 test/Bitcode/function-local-metadata.ll create mode 100644 test/Bitcode/function-local-metadata.ll.bc diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index f44af673fcd..e1c00cc4af0 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -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 index 00000000000..71d8fa1b0e1 --- /dev/null +++ b/test/Assembler/functionlocal-metadata-attachments.ll @@ -0,0 +1,7 @@ +; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s + +define void @foo(i32 %v) { +entry: +; CHECK: :[[@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 index 00000000000..81337db39fe --- /dev/null +++ b/test/Assembler/functionlocal-metadata-complex-1.ll @@ -0,0 +1,10 @@ +; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s + +define void @foo(i32 %v) { +entry: +; CHECK: :[[@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 index 00000000000..15a4412c535 --- /dev/null +++ b/test/Assembler/functionlocal-metadata-complex-2.ll @@ -0,0 +1,10 @@ +; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s + +define void @foo(i32 %v) { +entry: +; CHECK: :[[@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 index 00000000000..1590efa72b6 --- /dev/null +++ b/test/Assembler/functionlocal-metadata-complex-3.ll @@ -0,0 +1,10 @@ +; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s + +define void @foo(i32 %v) { +entry: +; CHECK: :[[@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 index 00000000000..58fb64c9b4b --- /dev/null +++ b/test/Bitcode/function-local-metadata.ll @@ -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 index 0000000000000000000000000000000000000000..6323ca4a6a30af02888744d0285cff3283a0e607 GIT binary patch literal 396 zcmZ>AK5$Qwhk+r1fq{X$Nr8b0NDBcmd!zD1#}h1`Yyw7>lNeigR9QJBt%tiM#YaF!nW2~^A%LaDL?D1=0+;hFkWMg2@JMEW zah@asg(QL4n4>}F$U~Vl5k}h%XN#7@Jx&eml@;v8GYWa0G4Q_?;QP|RXUyXycj%z( zxrH)m2CQIZ&C+L>ZBIDc_AuL?spu&wV6Wz2uk>gyC}6KDU@og@FHmTgJfg_=Z~;Ha z=0XJq1{NUAW+2j+%y?o`NRK>&AdsI36c+)~!Yqz9z+huw24e3PhX^MYCj}ir4hCg5 v76y*P9gK_&O$JF03=IMa76KqO>;VF2MH1BnLV#>WLk4g-N4Gr$@(=(3ppRNh literal 0 HcmV?d00001 -- 2.34.1