[lld] 5ab285e - [LLD][COFF] Fix ARM64X CHPE exception data size relocation when no x86 .pdata is present (#144085)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 13 14:10:33 PDT 2025
Author: Jacek Caban
Date: 2025-06-13T23:10:30+02:00
New Revision: 5ab285e0a60ad914bda893dbe18b6c1c562f3db6
URL: https://github.com/llvm/llvm-project/commit/5ab285e0a60ad914bda893dbe18b6c1c562f3db6
DIFF: https://github.com/llvm/llvm-project/commit/5ab285e0a60ad914bda893dbe18b6c1c562f3db6.diff
LOG: [LLD][COFF] Fix ARM64X CHPE exception data size relocation when no x86 .pdata is present (#144085)
Fixes an issue where we incorrectly skip setting the relocation value if
`hybridPdata.first` is null.
Added:
Modified:
lld/COFF/Writer.cpp
lld/test/COFF/pdata-arm64ec.test
Removed:
################################################################################
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index cb9d0001015bd..5f1da5e79daca 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -2495,22 +2495,16 @@ void Writer::setECSymbols() {
offsetof(data_directory, Size),
ctx.symtab.edataEnd->getRVA() - ctx.symtab.edataStart->getRVA() +
ctx.symtab.edataEnd->getSize());
- if (hybridPdata.first) {
+ if (hybridPdata.first)
ctx.dynamicRelocs->set(
dataDirOffset64 + EXCEPTION_TABLE * sizeof(data_directory) +
offsetof(data_directory, Size),
hybridPdata.last->getRVA() - hybridPdata.first->getRVA() +
hybridPdata.last->getSize());
- if (chpeSym) {
- size_t size = 0;
- if (pdata.first)
- size = pdata.last->getRVA() + pdata.last->getSize() -
- pdata.first->getRVA();
- ctx.dynamicRelocs->set(chpeSym->getRVA() +
- offsetof(chpe_metadata, ExtraRFETableSize),
- size);
- }
- }
+ if (chpeSym && pdata.first)
+ ctx.dynamicRelocs->set(
+ chpeSym->getRVA() + offsetof(chpe_metadata, ExtraRFETableSize),
+ pdata.last->getRVA() + pdata.last->getSize() - pdata.first->getRVA());
}
}
diff --git a/lld/test/COFF/pdata-arm64ec.test b/lld/test/COFF/pdata-arm64ec.test
index cf59330b23543..6bdcc5c5682bd 100644
--- a/lld/test/COFF/pdata-arm64ec.test
+++ b/lld/test/COFF/pdata-arm64ec.test
@@ -80,10 +80,63 @@ DIR3-NEXT: ExtraRFETableSize: 0x10
DIR3: ]
DIR3: }
+arm64x with no x86 .pdata:
+
RUN: llvm-objdump -s --section=.pdata test4.dll | FileCheck -check-prefix=DATA4 %s
DATA4: 180006000 00100000 11000001 00200000 11000001 ......... ......
DATA4: 180006010 00300000 0e300000
+RUN: lld-link -out:testx2.dll -machine:arm64x arm64-func-sym.obj arm64ec-func-sym.obj \
+RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj -dll -noentry
+
+RUN: llvm-readobj --headers --coff-load-config testx2.dll | FileCheck -check-prefix=DIR4 %s
+DIR4: ImageOptionalHeader {
+DIR4: DataDirectory {
+DIR4: ExceptionTableRVA: 0x5000
+DIR4-NEXT: ExceptionTableSize: 0x10
+DIR4: }
+DIR4: }
+DIR4: CHPEMetadata [
+DIR4: ExtraRFETable: 0x0
+DIR4-NEXT: ExtraRFETableSize: 0x0
+DIR4: ]
+DIR4: HybridObject {
+DIR4: ImageOptionalHeader {
+DIR4: ExceptionTableRVA: 0x0
+DIR4-NEXT: ExceptionTableSize: 0x0
+DIR4: }
+DIR4: CHPEMetadata [
+DIR4: ExtraRFETable: 0x5000
+DIR4-NEXT: ExtraRFETableSize: 0x10
+DIR4: ]
+DIR4: }
+
+arm64x with no ARM .pdata:
+
+RUN: lld-link -out:testx3.dll -machine:arm64x x86_64-func-sym.obj loadconfig-arm64.obj loadconfig-arm64ec.obj -dll -noentry
+
+RUN: llvm-readobj --headers --coff-load-config testx3.dll | FileCheck -check-prefix=DIR5 %s
+DIR5: ImageOptionalHeader {
+DIR5: DataDirectory {
+DIR5: ExceptionTableRVA: 0x0
+DIR5-NEXT: ExceptionTableSize: 0x0
+DIR5: }
+DIR5: }
+DIR5: CHPEMetadata [
+DIR5: ExtraRFETable: 0x4000
+DIR5-NEXT: ExtraRFETableSize: 0xC
+DIR5: ]
+DIR5: HybridObject {
+DIR5: ImageOptionalHeader {
+DIR5: ExceptionTableRVA: 0x4000
+DIR5-NEXT: ExceptionTableSize: 0xC
+DIR5: }
+DIR5: CHPEMetadata [
+DIR5: ExtraRFETable: 0x0
+DIR5-NEXT: ExtraRFETableSize: 0x0
+DIR5: ]
+DIR5: }
+
Order of inputs doesn't matter, the data is sorted by type and RVA:
RUN: lld-link -out:test5.dll -machine:arm64ec x86_64-func-sym.obj arm64ec-func-sym.obj \
More information about the llvm-commits
mailing list