llvm-project/lld/test/ELF/arm-thunk-linkerscript-sort.s
Simon Tatham 2b38f58930 [llvm-objdump,ARM] Add PrettyPrinters for Arm and AArch64.
Most Arm disassemblers, including GNU objdump and Arm's own `fromelf`,
emit an instruction's raw encoding as a 32-bit words or (for Thumb)
one or two 16-bit halfwords, in logical order rather than according to
their storage endianness. This is generally easier to read: it matches
the encoding diagrams in the architecture spec, it matches the value
you'd write in a `.inst` directive, and it means that fields within
the instruction encoding that span more than one byte (such as branch
offsets or `SVC` immediates) can be read directly in the encoding
without having to mentally reverse the bytes.

llvm-objdump already has a system of PrettyPrinter subclasses which
makes it easy for a target to drop in its own preferred formatting.
This patch adds pretty-printers for all the Arm targets, so that
llvm-objdump will display Arm instruction encodings in their preferred
layout instead of little-endian and bytewise.

Reviewed By: DavidSpickett

Differential Revision: https://reviews.llvm.org/D130358
2022-07-26 09:35:30 +01:00

70 lines
1.7 KiB
ArmAsm

// REQUIRES: arm
// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=thumbv7a-none-linux-gnueabi %s -o %t
// RUN: echo "SECTIONS { \
// RUN: .text 0x100000 : { *(SORT_BY_NAME(.text.*)) } \
// RUN: }" > %t.script
// RUN: ld.lld --script %t.script %t -o %t2
// RUN: llvm-objdump -d %t2 --start-address=0x100000 --stop-address=0x100008 | FileCheck --check-prefix=CHECK1 %s
// RUN: llvm-objdump -d %t2 --start-address=0x1000004 --stop-address=0x100000e | FileCheck --check-prefix=CHECK2 %s
.syntax unified
// Test that linkerscript sorting does not apply to Thunks, we expect that the
// sort will reverse the order of sections presented here.
// Define a function aligned on a megabyte boundary
.macro FUNCTION suff
.section .text.\suff\(), "ax", %progbits
.thumb
.balign 0x100000
.globl tfunc\suff\()
.type tfunc\suff\(), %function
tfunc\suff\():
bx lr
.endm
FUNCTION 31
FUNCTION 30
FUNCTION 29
FUNCTION 28
FUNCTION 27
FUNCTION 26
FUNCTION 25
FUNCTION 24
FUNCTION 23
FUNCTION 22
FUNCTION 21
FUNCTION 20
FUNCTION 19
FUNCTION 18
FUNCTION 17
FUNCTION 16
FUNCTION 15
// CHECK2: <__Thumbv7ABSLongThunk_tfunc31>:
// CHECK2-NEXT: 1000004: f3ff 97fc b.w 0x2000000 <tfunc31>
FUNCTION 14
FUNCTION 13
FUNCTION 12
FUNCTION 11
FUNCTION 10
FUNCTION 09
FUNCTION 08
FUNCTION 07
FUNCTION 06
FUNCTION 05
FUNCTION 04
FUNCTION 03
FUNCTION 02
FUNCTION 01
.section .text.00, "ax", %progbits
.thumb
.globl _start
_start:
// Expect no range extension needed for tfunc01 and an extension needed for
// tfunc31
bl tfunc01
bl tfunc31
// CHECK1: <_start>:
// CHECK1-NEXT: 100000: f0ff fffe bl 0x200000 <tfunc01>
// CHECK1-NEXT: 100004: f2ff d7fe bl 0x1000004 <__Thumbv7ABSLongThunk_tfunc31>