| # RUN: rm -rf %t && mkdir -p %t |
| # RUN: llvm-mc -triple thumbv7-windows-itanium -filetype obj -o %t/COFF_Thumb.o %s |
| # RUN: llvm-rtdyld -triple thumbv7-windows \ |
| # RUN: -dummy-extern ExitProcess=0x54769891 \ |
| # RUN: -dummy-extern unnamed_addr=0x00001024 -verify -check %s %t/COFF_Thumb.o |
| |
| .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 |
| 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 |
| load_from_dllimport_lo: @ IMAGE_REL_ARM_MOV32T |
| movw r0, :lower16:__imp_ExitProcess |
| # (1) Check stub content. |
| # rtdyld-check: *{4}(stub_addr(COFF_Thumb.o/.text, __imp_ExitProcess)) = \ |
| # rtdyld-check: ExitProcess |
| # |
| # (2) Check lo bits of stub address. |
| # rtdyld-check: decode_operand(load_from_dllimport_lo, 1) = \ |
| # rtdyld-check: stub_addr(COFF_Thumb.o/.text, __imp_ExitProcess)[15:0] |
| load_from_dllimport_hi: |
| movt r0, :upper16:__imp_ExitProcess |
| # (3) Check hi bits of stub address. |
| # rtdyld-check: decode_operand(load_from_dllimport_hi, 2) = \ |
| # rtdyld-check: stub_addr(COFF_Thumb.o/.text, __imp_ExitProcess)[31: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 |
| |
| .global relocations |
| relocations: |
| @ rel8: |
| .long function(imgrel) @ IMAGE_REL_ARM_ADDR32NB |
| # rtdyld-check: *{4}relocations = function - section_addr(COFF_Thumb.o, .text) |
| rel9: |
| .secidx __imp_ExitProcess @ IMAGE_REL_ARM_SECTION |
| # rtdyld-check: *{2}rel9 = 2 |
| rel10: |
| .long relocations(secrel32) @ IMAGE_REL_ARM_SECREL |
| # rtdyld-check: *{4}rel10 = relocations - section_addr(COFF_Thumb.o, .data) |
| rel11: |
| .secrel32 relocations @ IMAGE_REL_ARM_SECREL |
| # rtdyld-check: *{4}rel11 = relocations - section_addr(COFF_Thumb.o, .data) |
| bx r0 |
| trap |
| |
| .data |
| |
| .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) |