[lld] c0211ff - [LLD][COFF] Add ARM64EC support to findLineTable. (#87240)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 5 04:14:19 PDT 2024
Author: Jacek Caban
Date: 2024-04-05T13:14:15+02:00
New Revision: c0211ff206eb9d39d3895e1a528046c3e9579832
URL: https://github.com/llvm/llvm-project/commit/c0211ff206eb9d39d3895e1a528046c3e9579832
DIFF: https://github.com/llvm/llvm-project/commit/c0211ff206eb9d39d3895e1a528046c3e9579832.diff
LOG: [LLD][COFF] Add ARM64EC support to findLineTable. (#87240)
Fixes asserts in error messages. Use chunk machine type (instead of
global one) to support x86_64 objects and treat ARM64EC objects like
ARM64 ones.
Added:
Modified:
lld/COFF/PDB.cpp
lld/test/COFF/undefined-symbol-cv.s
Removed:
################################################################################
diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp
index 35e4c68dcda6c8..c0739b37aeb0f3 100644
--- a/lld/COFF/PDB.cpp
+++ b/lld/COFF/PDB.cpp
@@ -1726,15 +1726,15 @@ void PDBLinker::commit(codeview::GUID *guid) {
}
}
-static uint32_t getSecrelReloc(llvm::COFF::MachineTypes machine) {
- switch (machine) {
- case AMD64:
+static uint32_t getSecrelReloc(Triple::ArchType arch) {
+ switch (arch) {
+ case Triple::x86_64:
return COFF::IMAGE_REL_AMD64_SECREL;
- case I386:
+ case Triple::x86:
return COFF::IMAGE_REL_I386_SECREL;
- case ARMNT:
+ case Triple::thumb:
return COFF::IMAGE_REL_ARM_SECREL;
- case ARM64:
+ case Triple::aarch64:
return COFF::IMAGE_REL_ARM64_SECREL;
default:
llvm_unreachable("unknown machine type");
@@ -1752,7 +1752,7 @@ static bool findLineTable(const SectionChunk *c, uint32_t addr,
DebugLinesSubsectionRef &lines,
uint32_t &offsetInLinetable) {
ExitOnError exitOnErr;
- const uint32_t secrelReloc = getSecrelReloc(c->file->ctx.config.machine);
+ const uint32_t secrelReloc = getSecrelReloc(c->getArch());
for (SectionChunk *dbgC : c->file->getDebugChunks()) {
if (dbgC->getSectionName() != ".debug$S")
diff --git a/lld/test/COFF/undefined-symbol-cv.s b/lld/test/COFF/undefined-symbol-cv.s
index 08a85826b9f968..502f28044c17f0 100644
--- a/lld/test/COFF/undefined-symbol-cv.s
+++ b/lld/test/COFF/undefined-symbol-cv.s
@@ -1,6 +1,14 @@
-# REQUIRES: x86
-# RUN: llvm-mc -triple=x86_64-windows-msvc -filetype=obj -o %t.obj %s
-# RUN: not lld-link /out:%t.exe %t.obj 2>&1 | FileCheck %s
+# REQUIRES: aarch64, x86
+# RUN: split-file %s %t.dir && cd %t.dir
+
+# RUN: llvm-mc -triple=x86_64-windows-msvc -filetype=obj -o test-x86_64.obj test-x86_64.s
+# RUN: llvm-mc -triple=aarch64-windows-msvc -filetype=obj -o test-aarch64.obj test-aarch64.s
+# RUN: llvm-mc -triple=arm64ec-windows-msvc -filetype=obj -o test-arm64ec.obj test-aarch64.s
+
+# RUN: not lld-link -out:test-x86_64.exe test-x86_64.obj 2>&1 | FileCheck %s
+# RUN: not lld-link -out:test-aarch64.exe test-aarch64.obj 2>&1 | FileCheck %s
+# RUN: not lld-link -out:test-arm64ec.exe -machine:arm64ec test-arm64ec.obj 2>&1 | FileCheck %s
+# RUN: not lld-link -out:test-arm64ec2.exe -machine:arm64ec test-x86_64.obj 2>&1 | FileCheck %s
# CHECK: error: undefined symbol: int __cdecl foo(void)
# CHECK-NEXT: >>> referenced by file1.cpp:1
@@ -18,6 +26,7 @@
# CHECK-NEXT: >>> referenced by file1.cpp:5
# CHECK-NEXT: >>> {{.*}}.obj:(f2)
+#--- test-x86_64.s
.cv_file 1 "file1.cpp" "EDA15C78BB573E49E685D8549286F33C" 1
.cv_file 2 "file2.cpp" "EDA15C78BB573E49E685D8549286F33D" 1
@@ -60,3 +69,47 @@ f2:
.long 4
.cv_filechecksums
.cv_stringtable
+
+#--- test-aarch64.s
+ .cv_file 1 "file1.cpp" "EDA15C78BB573E49E685D8549286F33C" 1
+ .cv_file 2 "file2.cpp" "EDA15C78BB573E49E685D8549286F33D" 1
+
+ .section .text,"xr",one_only,main
+.globl main
+main:
+ .cv_func_id 0
+ .cv_loc 0 1 1 0 is_stmt 0
+ bl "?foo@@YAHXZ"
+ .cv_loc 0 1 2 0
+ bl "?foo@@YAHXZ"
+ .cv_loc 0 2 3 0
+ b "?bar@@YAHXZ"
+.Lfunc_end0:
+
+f1:
+ .cv_func_id 1
+ .cv_loc 1 1 4 0 is_stmt 0
+ bl "?bar@@YAHXZ"
+.Lfunc_end1:
+
+ .section .text,"xr",one_only,f2
+.globl f2
+f2:
+ .cv_func_id 2
+ .cv_loc 2 1 5 0 is_stmt 0
+ bl "?baz@@YAHXZ"
+.Lfunc_end2:
+
+ .section .debug$S,"dr",associative,main
+ .long 4
+ .cv_linetable 0, main, .Lfunc_end0
+ .cv_linetable 1, f1, .Lfunc_end1
+
+ .section .debug$S,"dr",associative,f2
+ .long 4
+ .cv_linetable 2, f2, .Lfunc_end2
+
+ .section .debug$S,"dr"
+ .long 4
+ .cv_filechecksums
+ .cv_stringtable
More information about the llvm-commits
mailing list