COFF_Thumb.s 3.93 KB
// RUN: llvm-mc -triple thumbv7-windows-itanium -filetype obj -o %t.obj %s
// RUN: llvm-rtdyld -triple thumbv7-windows -dummy-extern OutputDebugStringW=0x01310061 -dummy-extern OutputDebugStringA=0x78563413 -dummy-extern ExitProcess=0x54769891 -dummy-extern unnamed_addr=0x00001024 -verify -check %s %t.obj

	.text
	.syntax unified

	.def unnamed_addr
		.scl 2
		.type 32
	.endef
	.global unnamed_addr

	.def branch24t
		.scl 2
		.type 32
	.endef
	.global branch24t
	.p2align 1
	.code 16
	.thumb_func
branch24t:
@ rel1:
#	b unnamed_addr					@ IMAGE_REL_ARM_BRANCH24T

	.def function
		.scl 2
		.type 32
	.endef
	.globl function
	.p2align 1
	.code 16
	.thumb_func
function:
	push.w {r11, lr}
	mov r11, sp
rel2:							@ IMAGE_REL_ARM_MOV32T
	movw r0, :lower16:__imp_OutputDebugStringA
# rtdyld-check: decode_operand(rel2, 1) = (__imp_OutputDebugStringA&0x0000ffff)
	movt r0, :upper16:__imp_OutputDebugStringA
# TODO rtdyld-check: decode_operand(rel2, 1) = (__imp_OutputDebugStringA&0xffff0000>>16)
	ldr r1, [r0]
rel3:							@ IMAGE_REL_ARM_MOV32T
	movw r0, :lower16:string
# rtdyld-check: decode_operand(rel3, 1) = (string&0x0000ffff)
	movt r0, :upper16:string
# TODO rtdyld-check: decode_operand(rel3, 1) = (string&0xffff0000>>16)
	blx r1
rel4:							@ IMAGE_REL_ARM_MOV32T
	movw r0, :lower16:__imp_ExitProcess
# rtdyld-check: decode_operand(rel4, 1) = (__imp_ExitProcess&0x0000ffff)
	movt r0, :upper16:__imp_ExitProcess
# TODO rtdyld-check: decode_operand(rel4, 1) = (__imp_ExitProcess&0xffff0000>>16)
	ldr r1, [r0]
	movs r0, #0
	pop.w {r11, lr}
	bx r1

	.def main
		.scl 2
		.type 32
	.endef
	.globl main
	.p2align 1
	.code 16
	.thumb_func
main:
	push.w {r11, lr}
	mov r11, sp
rel5:
#	bl function					@ IMAGE_REL_ARM_BLX23T
	movs r0, #0
	pop.w {r11, pc}

	.section .rdata,"dr"
	.global string
string:
	.asciz "Hello World\n"

	.data

	.p2align 2
__imp_OutputDebugStringA:
@ rel6:
	.long OutputDebugStringA			@ IMAGE_REL_ARM_ADDR32
# rtdyld-check: *{4}__imp_OutputDebugStringA = 0x78563413

	.p2align 2
__imp_ExitProcess:
@ rel7:
	.long ExitProcess				@ IMAGE_REL_ARM_ADDR32
# rtdyld-check: *{4}__imp_ExitProcess = 0x54769891

	.global relocations
relocations:
@ rel8:
	.long function(imgrel)				@ IMAGE_REL_ARM_ADDR32NB
# rtdyld-check: *{4}relocations = function - section_addr(COFF_Thumb.s.tmp.obj, .text)
rel9:
	.secidx __imp_OutputDebugStringA		@ IMAGE_REL_ARM_SECTION
# rtdyld-check: *{2}rel9 = 1
rel10:
	.long relocations(secrel32)			@ IMAGE_REL_ARM_SECREL
# rtdyld-check: *{4}rel10 = relocations - section_addr(COFF_Thumb.s.tmp.obj, .data)
rel11:
	.secrel32 relocations				@ IMAGE_REL_ARM_SECREL
# rtdyld-check: *{4}rel11 = relocations - section_addr(COFF_Thumb.s.tmp.obj, .data)
rel12:							@ IMAGE_REL_ARM_MOV32T
	movw r0, :lower16:__imp_OutputDebugStringW
# rtdyld-check: decode_operand(rel12, 1) = (__imp_OutputDebugStringW&0x0000ffff)
	movt r0, :upper16:__imp_OutputDebugStringW
# TODO rtdyld-check: decode_operand(rel12, 1) = (__imp_OutputDebugStringW&0xffff0000>>16)
	bx r0
	trap

	.data

	.p2align 2
__imp_OutputDebugStringW:
@ rel13:
	.long OutputDebugStringW			@ IMAGE_REL_ARM_ADDR32
# rtdyld-check: *{4}__imp_OutputDebugStringW = 0x01310061

	.p2align 2

branch_to_thumb_func:
@ rel14:                                                @ IMAGE_REL_ARM_MOV32T
        movw r0, :lower16:function
# rtdyld-check: decode_operand(branch_to_thumb_func, 1) = (function&0x0000ffff|1)
        movt r0, :upper16:function
# TODO rtdyld-check: decode_operand(branch_to_thumb_func, 1) = (function&0xffff0000>>16)
        bx r0
        trap

        .data

        .p2align 2
a_data_symbol:
        .long 1073741822

        .p2align 2

        .text

ref_to_data_symbol_addr:
@ rel15:                                                @ IMAGE_REL_ARM_MOV32T
        movw r0, :lower16:a_data_symbol
# rtdyld-check: decode_operand(ref_to_data_symbol_addr, 1) = (a_data_symbol&0x0000ffff)
        movt r0, :upper16:a_data_symbol
# TODO rtdyld-check: decode_operand(ref_to_data_symbol_addr, 1) = (a_data_symbol&0xffff0000>>16)