summaryrefslogtreecommitdiff
path: root/test/tools/llvm-readobj
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2014-01-08 03:28:09 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2014-01-08 03:28:09 +0000
commitbc41190a74eabd0020c089c67beb9cb706f630ed (patch)
tree1ce91bc779b5a0b53bef32ec768981ba6a81319e /test/tools/llvm-readobj
parent9e0fd27ce7cd1a7b1a316760de7cf4795799af26 (diff)
downloadllvm-bc41190a74eabd0020c089c67beb9cb706f630ed.tar.gz
llvm-bc41190a74eabd0020c089c67beb9cb706f630ed.tar.bz2
llvm-bc41190a74eabd0020c089c67beb9cb706f630ed.tar.xz
llvm-readobj: add support for ARM EHABI unwind info
This adds some preliminary support for decoding ARM EHABI unwinding information. The major functionality that remains from complete support is bytecode translation. Each Unwind Index Table is printed out as a separate entity along with its section index, name, offset, and entries. Each entry lists the function address, and if possible, the name, of the function to which it corresponds. The encoding model, personality routine or index, and byte code is also listed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198734 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/tools/llvm-readobj')
-rw-r--r--test/tools/llvm-readobj/arm-unwind.s203
1 files changed, 203 insertions, 0 deletions
diff --git a/test/tools/llvm-readobj/arm-unwind.s b/test/tools/llvm-readobj/arm-unwind.s
new file mode 100644
index 0000000000..7d23a05f1a
--- /dev/null
+++ b/test/tools/llvm-readobj/arm-unwind.s
@@ -0,0 +1,203 @@
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s | llvm-readobj -u - \
+@ RUN: | FileCheck %s
+
+ .syntax unified
+
+ .cpu cortex-a8
+ .fpu neon
+
+ .section .personality
+
+ .type __personality,%function
+__personality:
+ .fnstart
+ bkpt
+ .fnend
+
+
+ .section .personality0
+
+ .type personality0,%function
+personality0:
+ .fnstart
+ bx lr
+ .fnend
+
+
+ .section .personality1
+
+ .type personality1,%function
+personality1:
+ .fnstart
+ .pad #0x100
+ sub sp, sp, #0x100
+ .save {r0-r11}
+ push {r0-r11}
+ pop {r0-r11}
+ add sp, sp, #0x100
+ bx lr
+ .fnend
+
+
+ .section .custom_personality
+
+ .type custom_personality,%function
+custom_personality:
+ .fnstart
+ .personality __personality
+ bx lr
+ .fnend
+
+
+ .section .opcodes
+
+ .type opcodes,%function
+opcodes:
+ .fnstart
+ .vsave {d8-d12}
+ vpush {d8-d12}
+ vpop {d8-d12}
+ bx lr
+ .fnend
+
+
+ .section .multiple
+
+ .type function0,%function
+function0:
+ .fnstart
+ bx lr
+ .fnend
+
+ .type function1,%function
+function1:
+ .fnstart
+ .personality __personality
+ bx lr
+ .fnend
+
+ .type function2,%function
+function2:
+ .fnstart
+ bx lr
+ .fnend
+
+@ CHECK: UnwindInformation {
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.personality
+@ CHECK: Entries [
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x0
+@ CHECK: FunctionName: __personality
+@ CHECK: Model: Compact (Inline)
+@ CHECK: PersonalityIndex: 0
+@ CHECK: ByteCode [
+@ CHECK: Instruction: 0xB0
+@ CHECK: Instruction: 0xB0
+@ CHECK: Instruction: 0xB0
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.personality0
+@ CHECK: Entries [
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x0
+@ CHECK: FunctionName: personality0
+@ CHECK: Model: Compact (Inline)
+@ CHECK: PersonalityIndex: 0
+@ CHECK: ByteCode [
+@ CHECK: Instruction: 0xB0
+@ CHECK: Instruction: 0xB0
+@ CHECK: Instruction: 0xB0
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.personality1
+@ CHECK: Entries [
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x0
+@ CHECK: FunctionName: personality1
+@ CHECK: ExceptionHandlingTable: .ARM.extab.personality1
+@ CHECK: TableEntryOffset: 0x0
+@ CHECK: Model: Compact
+@ CHECK: PersonalityIndex: 1
+@ CHECK: ByteCode [
+@ CHECK: Instruction: 0xB1
+@ CHECK: Instruction: 0xF
+@ CHECK: Instruction: 0xA7
+@ CHECK: Instruction: 0x3F
+@ CHECK: Instruction: 0xB0
+@ CHECK: Instruction: 0xB0
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.custom_personality
+@ CHECK: Entries [
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x0
+@ CHECK: FunctionName: custom_personality
+@ CHECK: ExceptionHandlingTable: .ARM.extab.custom_personality
+@ CHECK: TableEntryOffset: 0x0
+@ CHECK: Model: Generic
+@ CHECK: PersonalityRoutineAddress: 0x0
+@ CHECK: }
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.opcodes
+@ CHECK: Entries [
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x0
+@ CHECK: FunctionName: opcodes
+@ CHECK: Model: Compact (Inline)
+@ CHECK: PersonalityIndex: 0
+@ CHECK: ByteCode [
+@ CHECK: Instruction: 0xC9
+@ CHECK: Instruction: 0x84
+@ CHECK: Instruction: 0xB0
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.multiple
+@ CHECK: Entries [
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x0
+@ CHECK: FunctionName: function0
+@ CHECK: Model: Compact (Inline)
+@ CHECK: PersonalityIndex: 0
+@ CHECK: ByteCode [
+@ CHECK: Instruction: 0xB0
+@ CHECK: Instruction: 0xB0
+@ CHECK: Instruction: 0xB0
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x4
+@ CHECK: FunctionName: function1
+@ CHECK: ExceptionHandlingTable: .ARM.extab.multiple
+@ CHECK: Model: Generic
+@ CHECK: PersonalityRoutineAddress: 0x0
+@ CHECK: }
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x8
+@ CHECK: FunctionName: function2
+@ CHECK: Model: Compact (Inline)
+@ CHECK: PersonalityIndex: 0
+@ CHECK: ByteCode [
+@ CHECK: Instruction: 0xB0
+@ CHECK: Instruction: 0xB0
+@ CHECK: Instruction: 0xB0
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: }
+