Index: lld/COFF/Writer.cpp =================================================================== --- lld/COFF/Writer.cpp +++ lld/COFF/Writer.cpp @@ -1392,8 +1392,19 @@ // If /FUNCTIONPADMIN is used, functions are padded in order to create a // hotpatchable image. uint32_t padding = sec->isCodeSection() ? config->functionPadMin : 0; + MachineTypes prevECMachine = IMAGE_FILE_MACHINE_UNKNOWN; for (Chunk *c : sec->chunks) { + if (COFF::isArm64EC(ctx.config.machine) && sec->isCodeSection()) { + MachineTypes machine = c->getMachine(); + if (machine != IMAGE_FILE_MACHINE_UNKNOWN) { + // We need additional alignment when crossing EC range baudaries. + if (prevECMachine != IMAGE_FILE_MACHINE_UNKNOWN && + machine != prevECMachine) + virtualSize = alignTo(virtualSize, 4096); + prevECMachine = machine; + } + } if (padding && c->isHotPatchable()) virtualSize += padding; virtualSize = alignTo(virtualSize, c->getAlignment()); Index: lld/test/COFF/arm64ec-codemap.test =================================================================== --- lld/test/COFF/arm64ec-codemap.test +++ lld/test/COFF/arm64ec-codemap.test @@ -92,7 +92,7 @@ RUN: llvm-readobj --coff-load-config testm.dll | FileCheck -check-prefix=CODEMAPM %s CODEMAPM: CodeMap [ CODEMAPM-NEXT: 0x1000 - 0x1010 ARM64EC -CODEMAPM-NEXT: 0x2000 - 0x3004 X64 +CODEMAPM-NEXT: 0x2000 - 0x200E X64 CODEMAPM-NEXT: ] RUN: llvm-objdump -d testm.dll | FileCheck -check-prefix=DISASMM %s @@ -106,9 +106,9 @@ DISASMM-NEXT: ... DISASMM-NEXT: 180002000: b8 03 00 00 00 movl $0x3, %eax DISASMM-NEXT: 180002005: c3 retq -DISASMM-NEXT: ... -DISASMM-NEXT: 180002ffe: 00 00 addb %al, (%rax) -DISASMM-NEXT: 180003000: b8 06 00 00 00 movl $0x6, %eax +DISASMM-NEXT: 180002006: 00 00 addb %al, (%rax) +DISASMM-NEXT: 180002008: b8 06 00 00 00 movl $0x6, %eax +DISASMM-NEXT: 18000200d: c3 retq #--- arm64-func-sym.s .text @@ -121,7 +121,7 @@ #--- arm64ec-func-sym.s .text .globl arm64ec_func_sym - .p2align 12, 0x0 + .p2align 2, 0x0 arm64ec_func_sym: mov w0, #2 ret @@ -136,14 +136,14 @@ #--- x86_64-func-sym.s .text .globl x86_64_func_sym - .p2align 12, 0x0 + .p2align 2, 0x0 x86_64_func_sym: movl $3, %eax retq .section test, "xr" .globl x86_64_func_sym2 - .p2align 12, 0x0 + .p2align 2, 0x0 x86_64_func_sym2: movl $6, %eax retq @@ -189,7 +189,7 @@ .rva arm64ec_func_sym + 1 .word 16 .rva x86_64_func_sym + 2 - .word 0x1004 + .word 14 .globl code_map_count code_map_count = 2