| ## Check that we dump the unwind information for a non-relocatable input properly. |
| |
| ## Check that we correctly decode function addresses and that we are able to |
| ## locate corresponding STT_FUNC symbols and dump function names properly. |
| # RUN: yaml2obj %s -o %t |
| # RUN: llvm-readobj -u %t | FileCheck --check-prefix=UNWIND %s |
| # RUN: llvm-readelf -u %t | FileCheck --check-prefix=UNWIND %s |
| |
| # UNWIND: UnwindInformation { |
| # UNWIND-NEXT: UnwindIndexTable { |
| # UNWIND-NEXT: SectionIndex: 2 |
| # UNWIND-NEXT: SectionName: .ARM.exidx |
| # UNWIND-NEXT: SectionOffset: 0x34 |
| # UNWIND-NEXT: Entries [ |
| # UNWIND-NEXT: Entry { |
| # UNWIND-NEXT: FunctionAddress: 0x230 |
| # UNWIND-NEXT: FunctionName: func1 |
| # UNWIND-NEXT: Model: Compact (Inline) |
| # UNWIND-NEXT: PersonalityIndex: 0 |
| # UNWIND-NEXT: Opcodes [ |
| # UNWIND-NEXT: 0xB0 ; finish |
| # UNWIND-NEXT: 0xB0 ; finish |
| # UNWIND-NEXT: 0xB0 ; finish |
| # UNWIND-NEXT: ] |
| # UNWIND-NEXT: } |
| # UNWIND-NEXT: Entry { |
| # UNWIND-NEXT: FunctionAddress: 0x234 |
| # UNWIND-NEXT: FunctionName: func2 |
| # UNWIND-NEXT: Model: Compact (Inline) |
| # UNWIND-NEXT: PersonalityIndex: 0 |
| # UNWIND-NEXT: Opcodes [ |
| # UNWIND-NEXT: 0x9B ; vsp = r11 |
| # UNWIND-NEXT: 0x84 0x80 ; pop {fp, lr} |
| # UNWIND-NEXT: ] |
| # UNWIND-NEXT: } |
| # UNWIND-NEXT: Entry { |
| # UNWIND-NEXT: FunctionAddress: 0x248 |
| # UNWIND-NEXT: FunctionName: func3 |
| # UNWIND-NEXT: Model: Compact (Inline) |
| # UNWIND-NEXT: PersonalityIndex: 0 |
| # UNWIND-NEXT: Opcodes [ |
| # UNWIND-NEXT: 0xB0 ; finish |
| # UNWIND-NEXT: 0xB0 ; finish |
| # UNWIND-NEXT: 0xB0 ; finish |
| # UNWIND-NEXT: ] |
| # UNWIND-NEXT: } |
| # UNWIND-NEXT: Entry { |
| # UNWIND-NEXT: FunctionAddress: 0x24C |
| # UNWIND-NEXT: Model: CantUnwind |
| # UNWIND-NEXT: } |
| # UNWIND-NEXT: Entry { |
| # UNWIND-NEXT: FunctionAddress: 0x4000026B |
| # UNWIND-NEXT: FunctionName: func4 |
| # UNWIND-NEXT: Model: Compact (Inline) |
| # UNWIND-NEXT: PersonalityIndex: 0 |
| # UNWIND-NEXT: Opcodes [ |
| # UNWIND-NEXT: 0xB0 ; finish |
| # UNWIND-NEXT: 0xB0 ; finish |
| # UNWIND-NEXT: 0xB0 ; finish |
| # UNWIND-NEXT: ] |
| # UNWIND-NEXT: } |
| # UNWIND-NEXT: Entry { |
| # UNWIND-NEXT: FunctionAddress: 0x25C |
| # UNWIND-NEXT: FunctionName: func5 |
| # UNWIND-NEXT: ExceptionHandlingTable: .ARM.extab |
| # UNWIND-NEXT: TableEntryAddress: 0xAABE44 |
| # UNWIND-NEXT: Model: Generic |
| # UNWIND-NEXT: PersonalityRoutineAddress: 0x33CCCF44 |
| # UNWIND-NEXT: PersonalityRoutineName: personality1 |
| # UNWIND-NEXT: } |
| # UNWIND-NEXT: Entry { |
| # UNWIND-NEXT: FunctionAddress: 0x25C |
| # UNWIND-NEXT: FunctionName: func5 |
| # UNWIND-NEXT: ExceptionHandlingTable: .ARM.extab |
| # UNWIND-NEXT: TableEntryAddress: 0xAABE48 |
| # UNWIND-NEXT: Model: Generic |
| # UNWIND-NEXT: PersonalityRoutineAddress: 0xFFFFFFFFF811138C |
| # UNWIND-NEXT: } |
| # UNWIND-NEXT: ] |
| # UNWIND-NEXT: } |
| # UNWIND-NEXT: } |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: EM_ARM |
| Sections: |
| - Name: .text |
| Type: SHT_PROGBITS |
| Address: 0x230 |
| - Name: .ARM.exidx |
| Type: SHT_ARM_EXIDX |
| Address: 0x24C |
| Entries: |
| ## A. Address of .ARM.exidx (0x24C) + entry offset (0) + 0x7fffffe4 (31 bit) == 0x230 (func1). |
| - Offset: 0x7FFFFFE4 |
| Value: 0x80B0B0B0 ## arbitrary opcodes. |
| ## B. Address of .ARM.exidx (0x24C) + entry offset (8) + 0x7fffffe0 (31 bit) == 0x234 (func2). |
| - Offset: 0x7FFFFFE0 |
| Value: 0x809B8480 ## arbitrary opcodes. |
| ## C. Address of .ARM.exidx (0x24C) + entry offset (16) + 0x7fffffec (31 bit) == 0x248 (func3). |
| - Offset: 0x7FFFFFEC |
| Value: 0x80B0B0B0 ## arbitrary opcodes. |
| ## D. Address of .ARM.exidx (0x24C) + entry offset (24) + 0x7fffffe8 (31 bit) == 0x24C. |
| - Offset: 0x7FFFFFE8 |
| Value: EXIDX_CANTUNWIND |
| ## E. Address of .ARM.exidx (0x24C) + entry offset (32) + 0x3FFFFFFF (31 bit) == 0x4000026b (func4). |
| - Offset: 0x3FFFFFFF |
| Value: 0x80B0B0B0 ## arbitrary opcodes. |
| ## F. Address of .ARM.exidx (0x24C) + entry offset (40) + 0x7FFFFFE8 (31 bit) == 0x25c (func5). |
| - Offset: 0x7FFFFFE8 |
| ## Generic model. .ARM.exidx (0x24C) + entry offset (40 + 4) + 0x00AABBCC == |
| ## 0x00AABE44 == address of entry [0] in the .ARM.extab section. |
| ## 0x00AABE44 + 0x33221100 (31 bit, signed, .ARM.extab entry [0] value) == |
| ## 0x33cccf44 == personality1 routine address. |
| Value: 0x00AABBCC |
| ## G. Address of .ARM.exidx (0x24C) + entry offset (48) + 0x7FFFFFE0 (31 bit) == 0x25c (func5). |
| - Offset: 0x7FFFFFE0 |
| ## Generic model. .ARM.exidx (0x24C) + entry offset (48 + 4) + 0x00AABBC8 == |
| ## 0x00AABE48 == address of entry [1] in the .ARM.extab section. |
| ## 0x00AABE48 + 0x77665544 (31 bit, signed, .ARM.extab entry [1] value) == |
| ## 0xFFFFFFFFF811138C == the address of a personality routine function that does not exist. |
| Value: 0x00AABBC8 |
| - Name: .ARM.extab |
| Type: SHT_PROGBITS |
| Address: 0x00AABE44 |
| Content: "0011223344556677" |
| Symbols: |
| - Name: func1 |
| Type: STT_FUNC |
| Section: .text |
| Value: 0x230 |
| - Name: func2 |
| Type: STT_FUNC |
| Section: .text |
| Value: 0x234 |
| - Name: func3 |
| Type: STT_FUNC |
| Section: .text |
| Value: 0x248 |
| - Name: func4 |
| Type: STT_FUNC |
| Section: .text |
| Value: 0x4000026b |
| - Name: func5 |
| Type: STT_FUNC |
| Section: .text |
| Value: 0x25c |
| - Name: personality1 |
| Type: STT_FUNC |
| Value: 0x33cccf44 |