Skip to content

[LLD][COFF] Add ARM64EC support to findLineTable. #87240

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions lld/COFF/PDB.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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")
Expand Down
59 changes: 56 additions & 3 deletions lld/test/COFF/undefined-symbol-cv.s
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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

Expand Down Expand Up @@ -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