llvm-project/lld/test/COFF/arm64x-loadconfig.s

232 lines
8.8 KiB
ArmAsm

// REQUIRES: aarch64
// RUN: split-file %s %t.dir && cd %t.dir
// RUN: llvm-mc -filetype=obj -triple=aarch64-windows test.s -o test.obj
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows chpe.s -o chpe.obj
// RUN: llvm-mc -filetype=obj -triple=aarch64-windows loadconfig.s -o loadconfig.obj
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows loadconfig-ec.s -o loadconfig-ec.obj
// RUN: llvm-mc -filetype=obj -triple=aarch64-windows loadconfig-short.s -o loadconfig-short.obj
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows loadconfig-short.s -o loadconfig-short-arm64ec.obj
// RUN: llvm-lib -machine:arm64x -out:loadconfig.lib loadconfig.obj loadconfig-ec.obj
// RUN: lld-link -machine:arm64x -out:out-warn.dll -dll -noentry test.obj \
// RUN: 2>&1 | FileCheck --check-prefixes=WARN-LOADCFG,WARN-EC-LOADCFG %s
// WARN-LOADCFG: lld-link: warning: native version of '_load_config_used' is missing for ARM64X target
// WARN-EC-LOADCFG: lld-link: warning: EC version of '_load_config_used' is missing
// RUN: lld-link -machine:arm64x -out:out-nonative.dll -dll -noentry loadconfig-ec.obj chpe.obj \
// RUN: 2>&1 | FileCheck --check-prefixes=WARN-LOADCFG --implicit-check-not EC %s
// RUN: lld-link -machine:arm64ec -out:out-ec.dll -dll -noentry chpe.obj \
// RUN: 2>&1 | FileCheck --check-prefixes=WARN-EC-LOADCFG --implicit-check-not native %s
// RUN: lld-link -machine:arm64x -out:out.dll -dll -noentry loadconfig.obj test.obj \
// RUN: 2>&1 | FileCheck --check-prefixes=WARN-EC-LOADCFG --implicit-check-not native %s
// RUN: llvm-readobj --coff-load-config out.dll | FileCheck --check-prefix=DYNRELOCS %s
// DYNRELOCS: DynamicValueRelocTableOffset: 0xC
// DYNRELOCS-NEXT: DynamicValueRelocTableSection: 4
// DYNRELOCS: DynamicRelocations [
// DYNRELOCS-NEXT: Version: 0x1
// DYNRELOCS-NEXT: Arm64X [
// DYNRELOCS-NEXT: Entry [
// DYNRELOCS-NEXT: RVA: 0x7C
// DYNRELOCS-NEXT: Type: VALUE
// DYNRELOCS-NEXT: Size: 0x2
// DYNRELOCS-NEXT: Value: 0x8664
// DYNRELOCS-NEXT: ]
// DYNRELOCS-NEXT: Entry [
// DYNRELOCS-NEXT: RVA: 0x150
// DYNRELOCS-NEXT: Type: VALUE
// DYNRELOCS-NEXT: Size: 0x4
// DYNRELOCS-NEXT: Value: 0x0
// DYNRELOCS-NEXT: ]
// DYNRELOCS-NEXT: Entry [
// DYNRELOCS-NEXT: RVA: 0x154
// DYNRELOCS-NEXT: Type: VALUE
// DYNRELOCS-NEXT: Size: 0x4
// DYNRELOCS-NEXT: Value: 0x0
// DYNRELOCS-NEXT: ]
// DYNRELOCS-NEXT: ]
// DYNRELOCS-NEXT: ]
// RUN: llvm-readobj --headers out.dll | FileCheck --check-prefix=HEADERS %s
// HEADERS: BaseRelocationTableRVA: 0x4000
// HEADERS-NEXT: BaseRelocationTableSize: 0xC
// HEADERS: LoadConfigTableRVA: 0x1000
// HEADERS-NEXT: LoadConfigTableSize: 0x140
// HEADERS: Name: .reloc (2E 72 65 6C 6F 63 00 00)
// HEADERS-NEXT: VirtualSize: 0x38
// RUN: lld-link -machine:arm64x -out:out-short.dll -dll -noentry loadconfig-short.obj 2>&1 | FileCheck --check-prefix=WARN-RELOC-SIZE %s
// RUN: lld-link -machine:arm64x -out:out-short.dll -dll -noentry loadconfig-short-arm64ec.obj 2>&1 | FileCheck --check-prefix=WARN-RELOC-SIZE %s
// WARN-RELOC-SIZE: lld-link: warning: '_load_config_used' structure too small to include dynamic relocations
// Check that the CHPE metadata pointer is correctly copied from the EC load config to the native load config.
// RUN: lld-link -machine:arm64x -out:out-hyb.dll -dll -noentry loadconfig.obj loadconfig-ec.obj chpe.obj test.obj
// RUN: llvm-readobj --coff-load-config out-hyb.dll | FileCheck --check-prefix=LOADCFG %s
// LOADCFG: Format: COFF-ARM64X
// LOADCFG-NEXT: Arch: aarch64
// LOADCFG-NEXT: AddressSize: 64bit
// LOADCFG-NEXT: LoadConfig [
// LOADCFG-NEXT: Size: 0x140
// LOADCFG: CHPEMetadata [
// LOADCFG-NEXT: Version: 0x2
// LOADCFG: RedirectionMetadata: 12288
// LOADCFG: AlternateEntryPoint: 0x0
// LOADCFG-NEXT: AuxiliaryIAT: 0x0
// LOADCFG-NEXT: GetX64InformationFunctionPointer: 0x0
// LOADCFG-NEXT: SetX64InformationFunctionPointer: 0x0
// LOADCFG-NEXT: ExtraRFETable: 0x0
// LOADCFG-NEXT: ExtraRFETableSize: 0x0
// LOADCFG-NEXT: __os_arm64x_dispatch_fptr: 0x0
// LOADCFG-NEXT: AuxiliaryIATCopy: 0x0
// LOADCFG-NEXT: AuxiliaryDelayloadIAT: 0x0
// LOADCFG-NEXT: AuxiliaryDelayloadIATCopy: 0x0
// LOADCFG-NEXT: HybridImageInfoBitfield: 0x0
// LOADCFG: ]
// LOADCFG-NEXT: DynamicRelocations [
// LOADCFG-NEXT: Version: 0x1
// LOADCFG-NEXT: Arm64X [
// LOADCFG-NEXT: Entry [
// LOADCFG-NEXT: RVA: 0x7C
// LOADCFG-NEXT: Type: VALUE
// LOADCFG-NEXT: Size: 0x2
// LOADCFG-NEXT: Value: 0x8664
// LOADCFG-NEXT: ]
// LOADCFG-NEXT: Entry [
// LOADCFG-NEXT: RVA: 0x150
// LOADCFG-NEXT: Type: VALUE
// LOADCFG-NEXT: Size: 0x4
// LOADCFG-NEXT: Value: 0x1140
// LOADCFG-NEXT: ]
// LOADCFG-NEXT: Entry [
// LOADCFG-NEXT: RVA: 0x154
// LOADCFG-NEXT: Type: VALUE
// LOADCFG-NEXT: Size: 0x4
// LOADCFG-NEXT: Value: 0x140
// LOADCFG-NEXT: ]
// LOADCFG-NEXT: ]
// LOADCFG-NEXT: ]
// LOADCFG-NEXT: HybridObject {
// LOADCFG-NEXT: Format: COFF-ARM64EC
// LOADCFG-NEXT: Arch: aarch64
// LOADCFG-NEXT: AddressSize: 64bit
// LOADCFG-NEXT: LoadConfig [
// LOADCFG-NEXT: Size: 0x140
// LOADCFG: CHPEMetadata [
// LOADCFG-NEXT: Version: 0x2
// LOADCFG: ]
// LOADCFG-NEXT: DynamicRelocations [
// LOADCFG-NEXT: Version: 0x1
// LOADCFG-NEXT: Arm64X [
// LOADCFG-NEXT: Entry [
// LOADCFG-NEXT: RVA: 0x7C
// LOADCFG-NEXT: Type: VALUE
// LOADCFG-NEXT: Size: 0x2
// LOADCFG-NEXT: Value: 0x8664
// LOADCFG-NEXT: ]
// LOADCFG-NEXT: Entry [
// LOADCFG-NEXT: RVA: 0x150
// LOADCFG-NEXT: Type: VALUE
// LOADCFG-NEXT: Size: 0x4
// LOADCFG-NEXT: Value: 0x1140
// LOADCFG-NEXT: ]
// LOADCFG-NEXT: Entry [
// LOADCFG-NEXT: RVA: 0x154
// LOADCFG-NEXT: Type: VALUE
// LOADCFG-NEXT: Size: 0x4
// LOADCFG-NEXT: Value: 0x140
// LOADCFG-NEXT: ]
// LOADCFG-NEXT: ]
// LOADCFG-NEXT: ]
// LOADCFG-NEXT: }
// RUN: llvm-readobj --coff-basereloc out-hyb.dll | FileCheck --check-prefix=BASERELOC %s
// BASERELOC: BaseReloc [
// BASERELOC-NEXT: Entry {
// BASERELOC-NEXT: Type: DIR64
// BASERELOC-NEXT: Address: 0x10C8
// BASERELOC-NEXT: }
// BASERELOC-NEXT: Entry {
// BASERELOC-NEXT: Type: DIR64
// BASERELOC-NEXT: Address: 0x1208
// BASERELOC-NEXT: }
// BASERELOC-NEXT: Entry {
// BASERELOC-NEXT: Type: DIR64
// BASERELOC-NEXT: Address: 0x2074
// BASERELOC-NEXT: }
// RUN: lld-link -machine:arm64x -out:out-hyb-lib.dll -dll -noentry loadconfig.lib chpe.obj test.obj
// RUN: llvm-readobj --coff-load-config out-hyb-lib.dll | FileCheck --check-prefix=LOADCFG %s
// RUN: llvm-readobj --coff-basereloc out-hyb-lib.dll | FileCheck --check-prefix=BASERELOC %s
#--- test.s
.data
sym:
// Emit a basereloc to make the loadconfig test more meaningful.
.xword sym
#--- loadconfig.s
.section .rdata,"dr"
.globl _load_config_used
.p2align 3, 0
_load_config_used:
.word 0x140
.fill 0x13c,1,0
#--- loadconfig-ec.s
.section .rdata,"dr"
.globl _load_config_used
.p2align 3, 0
_load_config_used:
.word 0x140
.fill 0xc4,1,0
.xword __chpe_metadata
.fill 0x70,1,0
#--- loadconfig-short.s
.section .rdata,"dr"
.globl _load_config_used
.p2align 3, 0
_load_config_used:
.word 0xe4
.fill 0xe0,1,0
#--- chpe.s
.data
.globl __chpe_metadata
.p2align 3, 0
__chpe_metadata:
.word 2
.rva __hybrid_code_map
.word __hybrid_code_map_count
.rva __x64_code_ranges_to_entry_points
.rva __arm64x_redirection_metadata
.word 0 // __os_arm64x_dispatch_call_no_redirect
.word 0 // __os_arm64x_dispatch_ret
.word 0 // __os_arm64x_check_call
.word 0 // __os_arm64x_check_icall
.word 0 // __os_arm64x_check_icall_cfg
.rva __arm64x_native_entrypoint
.rva __hybrid_auxiliary_iat
.word __x64_code_ranges_to_entry_points_count
.word __arm64x_redirection_metadata_count
.word 0 // __os_arm64x_get_x64_information
.word 0 // __os_arm64x_set_x64_information
.rva __arm64x_extra_rfe_table
.word __arm64x_extra_rfe_table_size
.word 0 // __os_arm64x_dispatch_fptr
.rva __hybrid_auxiliary_iat_copy
.rva __hybrid_auxiliary_delayload_iat
.rva __hybrid_auxiliary_delayload_iat_copy
.word __hybrid_image_info_bitfield
.word 0 // __os_arm64x_helper3
.word 0 // __os_arm64x_helper4
.word 0 // __os_arm64x_helper5
.word 0 // __os_arm64x_helper6
.word 0 // __os_arm64x_helper7
.word 0 // __os_arm64x_helper8