diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-04-19 05:24:47 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-04-19 05:24:47 +0000 |
commit | c0441c29df6498257eca59d41d9ccaf6d5a9adf3 (patch) | |
tree | 50847e0c84b62a0efe0b8078f1ff6ca9b1c97d11 /llvm/test | |
parent | 28d8d0465733b4363461c27cbf58721e1163d763 (diff) | |
download | bcm5719-llvm-c0441c29df6498257eca59d41d9ccaf6d5a9adf3.tar.gz bcm5719-llvm-c0441c29df6498257eca59d41d9ccaf6d5a9adf3.zip |
Introduce a "patchable-function" function attribute
Summary:
The `"patchable-function"` attribute can be used by an LLVM client to
influence LLVM's code generation in ways that makes the generated code
easily patchable at runtime (for instance, to redirect control).
Right now only one patchability scheme is supported,
`"prologue-short-redirect"`, but this can be expanded in the future.
Reviewers: joker.eph, rnk, echristo, dberris
Subscribers: joker.eph, echristo, mcrosier, llvm-commits
Differential Revision: http://reviews.llvm.org/D19046
llvm-svn: 266715
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/CodeGen/X86/patchable-prologue.ll | 43 | ||||
-rw-r--r-- | llvm/test/TableGen/trydecode-emission.td | 4 | ||||
-rw-r--r-- | llvm/test/TableGen/trydecode-emission2.td | 4 | ||||
-rw-r--r-- | llvm/test/TableGen/trydecode-emission3.td | 4 |
4 files changed, 49 insertions, 6 deletions
diff --git a/llvm/test/CodeGen/X86/patchable-prologue.ll b/llvm/test/CodeGen/X86/patchable-prologue.ll new file mode 100644 index 00000000000..b04dc86a5d6 --- /dev/null +++ b/llvm/test/CodeGen/X86/patchable-prologue.ll @@ -0,0 +1,43 @@ +; RUN: llc -filetype=obj -o - -mtriple=x86_64-apple-macosx < %s | llvm-objdump -triple x86_64-apple-macosx -disassemble - | FileCheck %s +; RUN: llc -mtriple=x86_64-apple-macosx < %s | FileCheck %s --check-prefix=CHECK-ALIGN + +declare void @callee(i64*) + +define void @f0() "patchable-function"="prologue-short-redirect" { +; CHECK-LABEL: _f0: +; CHECK-NEXT: 66 90 nop + +; CHECK-ALIGN: .p2align 4, 0x90 +; CHECK-ALIGN: _f0: + + ret void +} + +define void @f1() "patchable-function"="prologue-short-redirect" "no-frame-pointer-elim"="true" { +; CHECK-LABEL: _f1 +; CHECK-NEXT: ff f5 pushq %rbp + +; CHECK-ALIGN: .p2align 4, 0x90 +; CHECK-ALIGN: _f1: + ret void +} + +define void @f2() "patchable-function"="prologue-short-redirect" { +; CHECK-LABEL: _f2 +; CHECK-NEXT: 48 81 ec a8 00 00 00 subq $168, %rsp + +; CHECK-ALIGN: .p2align 4, 0x90 +; CHECK-ALIGN: _f2: + %ptr = alloca i64, i32 20 + call void @callee(i64* %ptr) + ret void +} + +define void @f3() "patchable-function"="prologue-short-redirect" optsize { +; CHECK-LABEL: _f3 +; CHECK-NEXT: 66 90 nop + +; CHECK-ALIGN: .p2align 4, 0x90 +; CHECK-ALIGN: _f3: + ret void +} diff --git a/llvm/test/TableGen/trydecode-emission.td b/llvm/test/TableGen/trydecode-emission.td index f067fc3b480..8e8d321f384 100644 --- a/llvm/test/TableGen/trydecode-emission.td +++ b/llvm/test/TableGen/trydecode-emission.td @@ -36,8 +36,8 @@ def InstB : TestInstruction { // CHECK: /* 0 */ MCD::OPC_ExtractField, 4, 4, // Inst{7-4} ... // CHECK-NEXT: /* 3 */ MCD::OPC_FilterValue, 0, 14, 0, // Skip to: 21 // CHECK-NEXT: /* 7 */ MCD::OPC_CheckField, 2, 2, 0, 5, 0, // Skip to: 18 -// CHECK-NEXT: /* 13 */ MCD::OPC_TryDecode, 26, 0, 0, 0, // Opcode: InstB, skip to: 18 -// CHECK-NEXT: /* 18 */ MCD::OPC_Decode, 25, 1, // Opcode: InstA +// CHECK-NEXT: /* 13 */ MCD::OPC_TryDecode, 27, 0, 0, 0, // Opcode: InstB, skip to: 18 +// CHECK-NEXT: /* 18 */ MCD::OPC_Decode, 26, 1, // Opcode: InstA // CHECK-NEXT: /* 21 */ MCD::OPC_Fail, // CHECK: if (DecodeInstB(MI, insn, Address, Decoder) == MCDisassembler::Fail) { DecodeComplete = false; return MCDisassembler::Fail; } diff --git a/llvm/test/TableGen/trydecode-emission2.td b/llvm/test/TableGen/trydecode-emission2.td index 845f83a8fcc..3ee829621a6 100644 --- a/llvm/test/TableGen/trydecode-emission2.td +++ b/llvm/test/TableGen/trydecode-emission2.td @@ -35,9 +35,9 @@ def InstB : TestInstruction { // CHECK-NEXT: /* 7 */ MCD::OPC_ExtractField, 5, 3, // Inst{7-5} ... // CHECK-NEXT: /* 10 */ MCD::OPC_FilterValue, 0, 22, 0, // Skip to: 36 // CHECK-NEXT: /* 14 */ MCD::OPC_CheckField, 0, 2, 3, 5, 0, // Skip to: 25 -// CHECK-NEXT: /* 20 */ MCD::OPC_TryDecode, 26, 0, 0, 0, // Opcode: InstB, skip to: 25 +// CHECK-NEXT: /* 20 */ MCD::OPC_TryDecode, 27, 0, 0, 0, // Opcode: InstB, skip to: 25 // CHECK-NEXT: /* 25 */ MCD::OPC_CheckField, 3, 2, 0, 5, 0, // Skip to: 36 -// CHECK-NEXT: /* 31 */ MCD::OPC_TryDecode, 25, 1, 0, 0, // Opcode: InstA, skip to: 36 +// CHECK-NEXT: /* 31 */ MCD::OPC_TryDecode, 26, 1, 0, 0, // Opcode: InstA, skip to: 36 // CHECK-NEXT: /* 36 */ MCD::OPC_Fail, // CHECK: if (DecodeInstB(MI, insn, Address, Decoder) == MCDisassembler::Fail) { DecodeComplete = false; return MCDisassembler::Fail; } diff --git a/llvm/test/TableGen/trydecode-emission3.td b/llvm/test/TableGen/trydecode-emission3.td index 6d9c00b05ec..89f80409ee3 100644 --- a/llvm/test/TableGen/trydecode-emission3.td +++ b/llvm/test/TableGen/trydecode-emission3.td @@ -37,8 +37,8 @@ def InstB : TestInstruction { // CHECK: /* 0 */ MCD::OPC_ExtractField, 4, 4, // Inst{7-4} ... // CHECK-NEXT: /* 3 */ MCD::OPC_FilterValue, 0, 14, 0, // Skip to: 21 // CHECK-NEXT: /* 7 */ MCD::OPC_CheckField, 2, 2, 0, 5, 0, // Skip to: 18 -// CHECK-NEXT: /* 13 */ MCD::OPC_TryDecode, 26, 0, 0, 0, // Opcode: InstB, skip to: 18 -// CHECK-NEXT: /* 18 */ MCD::OPC_Decode, 25, 1, // Opcode: InstA +// CHECK-NEXT: /* 13 */ MCD::OPC_TryDecode, 27, 0, 0, 0, // Opcode: InstB, skip to: 18 +// CHECK-NEXT: /* 18 */ MCD::OPC_Decode, 26, 1, // Opcode: InstA // CHECK-NEXT: /* 21 */ MCD::OPC_Fail, // CHECK: if (DecodeInstBOp(MI, tmp, Address, Decoder) == MCDisassembler::Fail) { DecodeComplete = false; return MCDisassembler::Fail; } |