diff options
| author | Tom Roeder <tmroeder@google.com> | 2014-06-05 19:29:43 +0000 |
|---|---|---|
| committer | Tom Roeder <tmroeder@google.com> | 2014-06-05 19:29:43 +0000 |
| commit | 44cb65fff1fa26a2a1ff90290f172756f082c8a1 (patch) | |
| tree | bf434728cf43339c7a59346772330571289765b8 /llvm/test/CodeGen/ARM/jump_tables.ll | |
| parent | f7e289c0f25c920368b28d0d9d3be64d882f32cb (diff) | |
| download | bcm5719-llvm-44cb65fff1fa26a2a1ff90290f172756f082c8a1.tar.gz bcm5719-llvm-44cb65fff1fa26a2a1ff90290f172756f082c8a1.zip | |
Add a new attribute called 'jumptable' that creates jump-instruction tables for functions marked with this attribute.
It includes a pass that rewrites all indirect calls to jumptable functions to pass through these tables.
This also adds backend support for generating the jump-instruction tables on ARM and X86.
Note that since the jumptable attribute creates a second function pointer for a
function, any function marked with jumptable must also be marked with unnamed_addr.
llvm-svn: 210280
Diffstat (limited to 'llvm/test/CodeGen/ARM/jump_tables.ll')
| -rw-r--r-- | llvm/test/CodeGen/ARM/jump_tables.ll | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/ARM/jump_tables.ll b/llvm/test/CodeGen/ARM/jump_tables.ll new file mode 100644 index 00000000000..61c7e43adfe --- /dev/null +++ b/llvm/test/CodeGen/ARM/jump_tables.ll @@ -0,0 +1,32 @@ +; RUN: llc <%s -march=arm -jump-table-type=single | FileCheck --check-prefix=ARM %s +; RUN: llc <%s -march=thumb -jump-table-type=single | FileCheck --check-prefix=THUMB %s + +define void @indirect_fun() unnamed_addr jumptable { + ret void +} +define void ()* @get_fun() { + ret void ()* @indirect_fun + +; ARM: ldr r0, [[LABEL:.*]] +; ARM: mov pc, lr +; ARM: [[LABEL]]: +; ARM: .long __llvm_jump_instr_table_0_1 + +; THUMB: ldr r0, [[LABEL:.*]] +; THUMB: bx lr +; THUMB: [[LABEL]]: +; THUMB: .long __llvm_jump_instr_table_0_1 +} + +; ARM: .globl __llvm_jump_instr_table_0_1 +; ARM: .align 3 +; ARM: .type __llvm_jump_instr_table_0_1,%function +; ARM: __llvm_jump_instr_table_0_1: +; ARM: b indirect_fun(PLT) + +; THUMB: .globl __llvm_jump_instr_table_0_1 +; THUMB: .align 3 +; THUMB: .thumb_func +; THUMB: .type __llvm_jump_instr_table_0_1,%function +; THUMB: __llvm_jump_instr_table_0_1: +; THUMB: b indirect_fun(PLT) |

