@@ -0,0 +1,361 @@
# RUN: lld -flavor darwin -arch armv7 -r -print_atoms %s -o %t | FileCheck %s \
# RUN: && lld -flavor darwin -arch armv7 -dylib -print_atoms %t -o %t2 | FileCheck %s \
# RUN: && macho-dump --dump-section-data %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
--- !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 : [ 0xFE, 0xFF, 0xFF, 0xEB, 0x02, 0x00, 0x00, 0xFA,
0xFC, 0xFF, 0xFF, 0xEB, 0xFB, 0xFF, 0xFF, 0xFA,
0x1E, 0xFF, 0x2F, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1 ]
relocations :
- offset : 0x0000000C
type : ARM_RELOC_BR24
length : 2
pc-rel : true
extern : true
symbol : 4
- offset : 0x00000008
type : ARM_RELOC_BR24
length : 2
pc-rel : true
extern : true
symbol : 3
- offset : 0x00000004
type : ARM_RELOC_BR24
length : 2
pc-rel : true
extern : false
symbol : 1
- offset : 0x00000000
type : ARM_RELOC_BR24
length : 2
pc-rel : true
extern : false
symbol : 1
- segment : __DATA
section : __data
type : S_REGULAR
attributes : [ ]
address : 0x0000000000000018
content : [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]
relocations :
- offset : 0x00000004
type : ARM_RELOC_VANILLA
length : 2
pc-rel : false
extern : false
symbol : 1
- offset : 0x00000000
type : ARM_RELOC_VANILLA
length : 2
pc-rel : false
extern : true
symbol : 3
local-symbols :
- name : _d2
type : N_SECT
sect : 2
value : 0x0000000000000018
global-symbols :
- name : _a1
type : N_SECT
scope : [ N_EXT ]
sect : 1
value : 0x0000000000000000
- name : _a2
type : N_SECT
scope : [ N_EXT ]
sect : 1
value : 0x0000000000000014
undefined-symbols :
- name : _t1
type : N_UNDF
scope : [ N_EXT ]
value : 0x0000000000000000
- name : _t2
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_b22
# CHECK: offset: 0
# CHECK: target: _a1
# CHECK: - kind: thumb_b22
# CHECK: offset: 6
# CHECK: target: _a2
# CHECK: - kind: thumb_b22
# CHECK: offset: 12
# CHECK: target: _a2
# CHECK: - kind: thumb_b22
# CHECK: offset: 16
# CHECK: target: _t1
# CHECK: - kind: thumb_b22
# CHECK: offset: 22
# CHECK: target: _t1
# CHECK: - kind: thumb_b22
# CHECK: offset: 28
# CHECK: target: _t2
# CHECK: - kind: thumb_b22
# CHECK: offset: 34
# CHECK: target: _t2
# CHECK: - kind: thumb_b22
# 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_b24
# CHECK: offset: 0
# CHECK: target: _a1
# CHECK: - kind: arm_b24
# CHECK: offset: 4
# CHECK: target: _a2
# CHECK: - kind: arm_b24
# CHECK: offset: 8
# CHECK: target: _t1
# CHECK: - kind: arm_b24
# CHECK: offset: 12
# CHECK: target: _t2
# CHECK: - name: _a2
# CHECK: scope: global
# CODE: (('section_name', '__text\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
# CODE: ('segment_name', '__TEXT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
# CODE: ('_section_data', '00f016e8 c04600f0 1ee8c046 00f01ae8 fff7f6ff c046fff7 f3ffc046 00f006f8 c04600f0 03f800f0 02f87047 70477047 feffffeb 020000eb f0fffffa fafffffa 1eff2fe1 1eff2fe1')
# When we get a good mach-o disassembler the above __text section content check can be change to be symbolic.
# CODE: (('section_name', '__data\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
# CODE: ('segment_name', '__DATA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
# CODE: ('_section_data', '{{[0-9a-f]}}{{[13579bdf]}}{{[0-9a-f]+}} {{[0-9a-f]}}{{[02468ade]}}{{[0-9a-f]+}} {{[0-9a-f]}}{{[13579bdf]}}{{[0-9a-f]+}} {{[0-9a-f]}}{{[02468ade]}}{{[0-9a-f]+}}')
# 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