mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-14 15:25:25 +00:00
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
This commit is contained in:
@@ -300,7 +300,7 @@ template <> struct MappingTraits<MachineConstantPoolValue> {
|
|||||||
|
|
||||||
struct MachineJumpTable {
|
struct MachineJumpTable {
|
||||||
struct Entry {
|
struct Entry {
|
||||||
unsigned ID;
|
UnsignedValue ID;
|
||||||
std::vector<FlowStringValue> Blocks;
|
std::vector<FlowStringValue> Blocks;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -582,8 +582,11 @@ bool MIRParserImpl::initializeJumpTableInfo(
|
|||||||
Blocks.push_back(MBB);
|
Blocks.push_back(MBB);
|
||||||
}
|
}
|
||||||
unsigned Index = JTI->createJumpTableIndex(Blocks);
|
unsigned Index = JTI->createJumpTableIndex(Blocks);
|
||||||
// TODO: Report an error when the same jump table slot ID is redefined.
|
if (!PFS.JumpTableSlots.insert(std::make_pair(Entry.ID.Value, Index))
|
||||||
PFS.JumpTableSlots.insert(std::make_pair(Entry.ID, Index));
|
.second)
|
||||||
|
return error(Entry.ID.SourceRange.Start,
|
||||||
|
Twine("redefinition of jump table entry '%jump-table.") +
|
||||||
|
Twine(Entry.ID.Value) + "'");
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
82
test/CodeGen/MIR/X86/jump-table-redefinition-error.mir
Normal file
82
test/CodeGen/MIR/X86/jump-table-redefinition-error.mir
Normal file
@@ -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'
|
||||||
|
...
|
Reference in New Issue
Block a user