| // 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 |