289 lines
8.6 KiB
YAML
289 lines
8.6 KiB
YAML
# RUN: ld64.lld -arch armv7 -r -print_atoms %s \
|
|
# RUN: %p/Inputs/arm-interworking.yaml -o %t | FileCheck %s \
|
|
# RUN: && ld64.lld -arch armv7 -dylib -print_atoms \
|
|
# RUN: %p/Inputs/armv7/libSystem.yaml %t -o %t2 | FileCheck %s \
|
|
# RUN: && llvm-readobj -s -sd %t2 | FileCheck -check-prefix=CODE %s
|
|
#
|
|
# Test thumb and arm branches round trip through -r.
|
|
# Test bl/blx instructions are fixed up properly.
|
|
#
|
|
#
|
|
|
|
--- !mach-o
|
|
arch: armv7
|
|
file-type: MH_OBJECT
|
|
flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
|
|
sections:
|
|
- segment: __TEXT
|
|
section: __text
|
|
type: S_REGULAR
|
|
attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
|
|
alignment: 2
|
|
address: 0x0000000000000000
|
|
content: [ 0xFF, 0xF7, 0xFE, 0xFF, 0xC0, 0x46, 0xFF, 0xF7,
|
|
0xFC, 0xEF, 0xC0, 0x46, 0xFF, 0xF7, 0xF8, 0xEF,
|
|
0xFF, 0xF7, 0xF6, 0xFF, 0xC0, 0x46, 0xFF, 0xF7,
|
|
0xF3, 0xFF, 0xC0, 0x46, 0x00, 0xF0, 0x06, 0xE8,
|
|
0xC0, 0x46, 0x00, 0xF0, 0x03, 0xF8, 0x00, 0xF0,
|
|
0x02, 0xF8, 0x70, 0x47, 0x70, 0x47, 0x70, 0x47 ]
|
|
relocations:
|
|
- offset: 0x00000026
|
|
type: ARM_THUMB_RELOC_BR22
|
|
length: 2
|
|
pc-rel: true
|
|
extern: false
|
|
symbol: 1
|
|
- offset: 0x00000022
|
|
type: ARM_THUMB_RELOC_BR22
|
|
length: 2
|
|
pc-rel: true
|
|
extern: false
|
|
symbol: 1
|
|
- offset: 0x0000001C
|
|
type: ARM_THUMB_RELOC_BR22
|
|
length: 2
|
|
pc-rel: true
|
|
extern: false
|
|
symbol: 1
|
|
- offset: 0x00000016
|
|
type: ARM_THUMB_RELOC_BR22
|
|
length: 2
|
|
pc-rel: true
|
|
extern: false
|
|
symbol: 1
|
|
- offset: 0x00000010
|
|
type: ARM_THUMB_RELOC_BR22
|
|
length: 2
|
|
pc-rel: true
|
|
extern: false
|
|
symbol: 1
|
|
- offset: 0x0000000C
|
|
type: ARM_THUMB_RELOC_BR22
|
|
length: 2
|
|
pc-rel: true
|
|
extern: true
|
|
symbol: 5
|
|
- offset: 0x00000006
|
|
type: ARM_THUMB_RELOC_BR22
|
|
length: 2
|
|
pc-rel: true
|
|
extern: true
|
|
symbol: 5
|
|
- offset: 0x00000000
|
|
type: ARM_THUMB_RELOC_BR22
|
|
length: 2
|
|
pc-rel: true
|
|
extern: true
|
|
symbol: 4
|
|
- segment: __DATA
|
|
section: __data
|
|
type: S_REGULAR
|
|
attributes: [ ]
|
|
address: 0x0000000000000030
|
|
content: [ 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]
|
|
relocations:
|
|
- offset: 0x00000004
|
|
type: ARM_RELOC_VANILLA
|
|
length: 2
|
|
pc-rel: false
|
|
extern: true
|
|
symbol: 4
|
|
- offset: 0x00000000
|
|
type: ARM_RELOC_VANILLA
|
|
length: 2
|
|
pc-rel: false
|
|
extern: false
|
|
symbol: 1
|
|
local-symbols:
|
|
- name: _t3
|
|
type: N_SECT
|
|
sect: 1
|
|
desc: [ N_ARM_THUMB_DEF ]
|
|
value: 0x000000000000002E
|
|
- name: _d1
|
|
type: N_SECT
|
|
sect: 2
|
|
value: 0x0000000000000030
|
|
global-symbols:
|
|
- name: _t1
|
|
type: N_SECT
|
|
scope: [ N_EXT ]
|
|
sect: 1
|
|
desc: [ N_ARM_THUMB_DEF ]
|
|
value: 0x0000000000000000
|
|
- name: _t2
|
|
type: N_SECT
|
|
scope: [ N_EXT ]
|
|
sect: 1
|
|
desc: [ N_ARM_THUMB_DEF ]
|
|
value: 0x000000000000002C
|
|
undefined-symbols:
|
|
- name: _a1
|
|
type: N_UNDF
|
|
scope: [ N_EXT ]
|
|
value: 0x0000000000000000
|
|
- name: _a2
|
|
type: N_UNDF
|
|
scope: [ N_EXT ]
|
|
value: 0x0000000000000000
|
|
|
|
...
|
|
|
|
|
|
# CHECK: defined-atoms:
|
|
# CHECK: - name: _d1
|
|
# CHECK: type: data
|
|
# CHECK: references:
|
|
# CHECK: - kind: pointer32
|
|
# CHECK: offset: 0
|
|
# CHECK: target: _t2
|
|
# CHECK: - kind: pointer32
|
|
# CHECK: offset: 4
|
|
# CHECK: target: _a1
|
|
# CHECK: - name: _d2
|
|
# CHECK: type: data
|
|
# CHECK: references:
|
|
# CHECK: - kind: pointer32
|
|
# CHECK: offset: 0
|
|
# CHECK: target: _t1
|
|
# CHECK: - kind: pointer32
|
|
# CHECK: offset: 4
|
|
# CHECK: target: _a1
|
|
# CHECK: - name: _t1
|
|
# CHECK: scope: global
|
|
# CHECK: references:
|
|
# CHECK: - kind: modeThumbCode
|
|
# CHECK: offset: 0
|
|
# CHECK: target: _t1
|
|
# CHECK: - kind: thumb_bl22
|
|
# CHECK: offset: 0
|
|
# CHECK: target: _a1
|
|
# CHECK: - kind: thumb_bl22
|
|
# CHECK: offset: 6
|
|
# CHECK: target: _a2
|
|
# CHECK: - kind: thumb_bl22
|
|
# CHECK: offset: 12
|
|
# CHECK: target: _a2
|
|
# CHECK: - kind: thumb_bl22
|
|
# CHECK: offset: 16
|
|
# CHECK: target: _t1
|
|
# CHECK: - kind: thumb_bl22
|
|
# CHECK: offset: 22
|
|
# CHECK: target: _t1
|
|
# CHECK: - kind: thumb_bl22
|
|
# CHECK: offset: 28
|
|
# CHECK: target: _t2
|
|
# CHECK: - kind: thumb_bl22
|
|
# CHECK: offset: 34
|
|
# CHECK: target: _t2
|
|
# CHECK: - kind: thumb_bl22
|
|
# CHECK: offset: 38
|
|
# CHECK: target: _t3
|
|
# CHECK: - name: _t2
|
|
# CHECK: scope: global
|
|
# CHECK: content: [ 70, 47 ]
|
|
# CHECK: references:
|
|
# CHECK: - kind: modeThumbCode
|
|
# CHECK: offset: 0
|
|
# CHECK: target: _t2
|
|
# CHECK: - name: _t3
|
|
# CHECK: content: [ 70, 47 ]
|
|
# CHECK: references:
|
|
# CHECK: - kind: modeThumbCode
|
|
# CHECK: offset: 0
|
|
# CHECK: target: _t3
|
|
# CHECK: - name: _a1
|
|
# CHECK: scope: global
|
|
# CHECK: references:
|
|
# CHECK: - kind: arm_bl24
|
|
# CHECK: offset: 0
|
|
# CHECK: target: _a1
|
|
# CHECK: - kind: arm_bl24
|
|
# CHECK: offset: 4
|
|
# CHECK: target: _a2
|
|
# CHECK: - kind: arm_bl24
|
|
# CHECK: offset: 8
|
|
# CHECK: target: _t1
|
|
# CHECK: - kind: arm_bl24
|
|
# CHECK: offset: 12
|
|
# CHECK: target: _t2
|
|
# CHECK: - name: _a2
|
|
# CHECK: scope: global
|
|
|
|
# CODE: Name: __text (5F 5F 74 65 78 74 00 00 00 00 00 00 00 00 00 00)
|
|
# CODE: Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00)
|
|
# CODE: SectionData (
|
|
# CODE: 0000: 00F016E8 C04600F0 1EE8C046 00F01AE8
|
|
# CODE: 0010: FFF7F6FF C046FFF7 F3FFC046 00F006F8
|
|
# CODE: 0020: C04600F0 03F800F0 02F87047 70477047
|
|
# CODE: 0030: FEFFFFEB 020000EB F0FFFFFA FAFFFFFA
|
|
# CODE: 0040: 1EFF2FE1 1EFF2FE1
|
|
# CODE: )
|
|
|
|
# CODE: Name: __data (5F 5F 64 61 74 61 00 00 00 00 00 00 00 00 00 00)
|
|
# CODE: Segment: __DATA (5F 5F 44 41 54 41 00 00 00 00 00 00 00 00 00 00)
|
|
# CODE: SectionData (
|
|
# CODE: 0000: E50F0000 E80F0000 B90F0000 E80F0000
|
|
# CODE: )
|
|
|
|
# When we get a good mach-o disassembler the above __text section content check can be change to be symbolic.
|
|
# Verify the low (thumb) bit is set on the first and third pointers but not the second and fourth.
|
|
|
|
|
|
|
|
# Input file one:
|
|
#
|
|
# .align 2
|
|
# .code 16
|
|
# .globl _t1
|
|
# .thumb_func _t1
|
|
#_t1:
|
|
# bl _a1
|
|
# nop
|
|
# blx _a2
|
|
# nop
|
|
# blx _a2
|
|
# bl _t1
|
|
# nop
|
|
# bl _t1
|
|
# nop
|
|
# blx _t2
|
|
# nop
|
|
# blx _t2
|
|
# bx lr
|
|
#
|
|
# .globl _t2
|
|
# .thumb_func _t2
|
|
#_t2:
|
|
# bx lr
|
|
#
|
|
# .data
|
|
#_d1: .long _t2
|
|
# .long _a1
|
|
|
|
|
|
|
|
# Input file two:
|
|
#
|
|
# .align 2
|
|
# .code 32
|
|
# .globl _a1
|
|
#_a1:
|
|
# bl _a1
|
|
# blx _a2
|
|
# bl _t1
|
|
# blx _t2
|
|
# bx lr
|
|
#
|
|
# .globl _a2
|
|
#_a2:
|
|
# bx lr
|
|
#
|
|
# .data
|
|
#_d2: .long _t1
|
|
# .long _a1
|
|
|
|
|
|
|
|
|