From c198b23a4d8b773bcbe61d0a6502cb213e682e51 Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Fri, 31 Jul 2015 23:13:23 +0000 Subject: [PATCH] MIR Parser: Report an error when a jump table entry is redefined. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243798 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/MIRYamlMapping.h | 2 +- lib/CodeGen/MIRParser/MIRParser.cpp | 7 +- .../MIR/X86/jump-table-redefinition-error.mir | 82 +++++++++++++++++++ 3 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 test/CodeGen/MIR/X86/jump-table-redefinition-error.mir diff --git a/include/llvm/CodeGen/MIRYamlMapping.h b/include/llvm/CodeGen/MIRYamlMapping.h index 777819f3eae..43c4a5dd6e3 100644 --- a/include/llvm/CodeGen/MIRYamlMapping.h +++ b/include/llvm/CodeGen/MIRYamlMapping.h @@ -300,7 +300,7 @@ template <> struct MappingTraits { struct MachineJumpTable { struct Entry { - unsigned ID; + UnsignedValue ID; std::vector Blocks; }; diff --git a/lib/CodeGen/MIRParser/MIRParser.cpp b/lib/CodeGen/MIRParser/MIRParser.cpp index cc277eea9f4..0679ec02c98 100644 --- a/lib/CodeGen/MIRParser/MIRParser.cpp +++ b/lib/CodeGen/MIRParser/MIRParser.cpp @@ -582,8 +582,11 @@ bool MIRParserImpl::initializeJumpTableInfo( Blocks.push_back(MBB); } unsigned Index = JTI->createJumpTableIndex(Blocks); - // TODO: Report an error when the same jump table slot ID is redefined. - PFS.JumpTableSlots.insert(std::make_pair(Entry.ID, Index)); + if (!PFS.JumpTableSlots.insert(std::make_pair(Entry.ID.Value, Index)) + .second) + return error(Entry.ID.SourceRange.Start, + Twine("redefinition of jump table entry '%jump-table.") + + Twine(Entry.ID.Value) + "'"); } return false; } diff --git a/test/CodeGen/MIR/X86/jump-table-redefinition-error.mir b/test/CodeGen/MIR/X86/jump-table-redefinition-error.mir new file mode 100644 index 00000000000..c9d195adbd9 --- /dev/null +++ b/test/CodeGen/MIR/X86/jump-table-redefinition-error.mir @@ -0,0 +1,82 @@ +# RUN: not llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s 2>&1 | FileCheck %s + +--- | + + define i32 @test_jumptable(i32 %in) { + entry: + switch i32 %in, label %def [ + i32 0, label %lbl1 + i32 1, label %lbl2 + i32 2, label %lbl3 + i32 3, label %lbl4 + ] + + def: + ret i32 0 + + lbl1: + ret i32 1 + + lbl2: + ret i32 2 + + lbl3: + ret i32 4 + + lbl4: + ret i32 8 + } + +... +--- +name: test_jumptable +jumpTable: + kind: label-difference32 + entries: + - id: 0 + blocks: [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ] +# CHECK: [[@LINE+1]]:18: redefinition of jump table entry '%jump-table.0' + - id: 0 + blocks: [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ] +body: + - id: 0 + name: entry + successors: [ '%bb.2.def', '%bb.1.entry' ] + instructions: + - '%eax = MOV32rr %edi, implicit-def %rax' + - 'CMP32ri8 %edi, 3, implicit-def %eflags' + - 'JA_1 %bb.2.def, implicit %eflags' + - id: 1 + name: entry + successors: [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ] + instructions: + - '%rcx = LEA64r %rip, 1, _, %jump-table.0, _' + - '%rax = MOVSX64rm32 %rcx, 4, %rax, 0, _' + - '%rax = ADD64rr %rax, %rcx, implicit-def %eflags' + - 'JMP64r %rax' + - id: 2 + name: def + instructions: + - '%eax = MOV32r0 implicit-def %eflags' + - 'RETQ %eax' + - id: 3 + name: lbl1 + instructions: + - '%eax = MOV32ri 1' + - 'RETQ %eax' + - id: 4 + name: lbl2 + instructions: + - '%eax = MOV32ri 2' + - 'RETQ %eax' + - id: 5 + name: lbl3 + instructions: + - '%eax = MOV32ri 4' + - 'RETQ %eax' + - id: 6 + name: lbl4 + instructions: + - '%eax = MOV32ri 8' + - 'RETQ %eax' +... -- 2.34.1