Skip to content
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
16 changes: 7 additions & 9 deletions lld/COFF/Chunks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -570,8 +570,7 @@ void SectionChunk::getBaserels(std::vector<Baserel> *res) {
// another DLL) This returns the size the relocation is supposed to update,
// in bits, or 0 if the relocation cannot be handled as a runtime pseudo
// relocation.
static int getRuntimePseudoRelocSize(uint16_t type,
llvm::COFF::MachineTypes machine) {
static int getRuntimePseudoRelocSize(uint16_t type, Triple::ArchType arch) {
// Relocations that either contain an absolute address, or a plain
// relative offset, since the runtime pseudo reloc implementation
// adds 8/16/32/64 bit values to a memory address.
Expand All @@ -597,8 +596,8 @@ static int getRuntimePseudoRelocSize(uint16_t type,
// the image, or temporarily changed at runtime with VirtualProtect.
// Since this only operates on direct address values, it doesn't work for
// ARM/ARM64 relocations, other than the plain ADDR32/ADDR64 relocations.
switch (machine) {
case AMD64:
switch (arch) {
case Triple::x86_64:
switch (type) {
case IMAGE_REL_AMD64_ADDR64:
return 64;
Expand All @@ -613,22 +612,22 @@ static int getRuntimePseudoRelocSize(uint16_t type,
default:
return 0;
}
case I386:
case Triple::x86:
switch (type) {
case IMAGE_REL_I386_DIR32:
case IMAGE_REL_I386_REL32:
return 32;
default:
return 0;
}
case ARMNT:
case Triple::thumb:
switch (type) {
case IMAGE_REL_ARM_ADDR32:
return 32;
default:
return 0;
}
case ARM64:
case Triple::aarch64:
switch (type) {
case IMAGE_REL_ARM64_ADDR64:
return 64;
Expand Down Expand Up @@ -661,8 +660,7 @@ void SectionChunk::getRuntimePseudoRelocs(
// alive. Thus such dangling references in DWARF sections are expected.
if (!target->getChunk())
continue;
int sizeInBits =
getRuntimePseudoRelocSize(rel.Type, file->ctx.config.machine);
int sizeInBits = getRuntimePseudoRelocSize(rel.Type, getArch());
if (sizeInBits == 0) {
error("unable to automatically import from " + target->getName() +
" with relocation type " +
Expand Down
56 changes: 56 additions & 0 deletions lld/test/COFF/autoimport-arm64ec-data.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# REQUIRES: aarch64, x86
RUN: split-file %s %t.dir && cd %t.dir

RUN: llvm-lib -machine:arm64ec -out:libtest.a -def:test.def
RUN: llvm-mc -triple=arm64ec-windows-gnu arm64ec.s -filetype=obj -o arm64ec.obj
RUN: llvm-mc -triple=arm64ec-windows-gnu x86_64.s -filetype=obj -o x86_64.obj

RUN: lld-link -machine:arm64ec -out:out.dll -dll -noentry x86_64.obj arm64ec.obj libtest.a -lldmingw

RUN: llvm-readobj --coff-imports out.dll | FileCheck -check-prefix=IMPORTS %s
RUN: llvm-objdump -s out.dll | FileCheck --check-prefix=CONTENTS %s

IMPORTS: Import {
IMPORTS-NEXT: Name: test.dll
IMPORTS-NEXT: ImportLookupTableRVA: 0x40E0
IMPORTS-NEXT: ImportAddressTableRVA: 0x3000
IMPORTS-NEXT: Symbol: variable (0)
IMPORTS-NEXT: }

Runtime pseudo relocation list header at 0x401c, consisting of 0x0, 0x0, 0x1.
The first runtime pseudo relocation is from an x86_64 object file, with import
from 0x3000, applied at 0x7000 with a size of 32 bits. The second pseudo
relocation is from an ARM64EC object file, with import from 0x3000, applied
at 0x7008 with a size of 32 bits.

CONTENTS: Contents of section .rdata:
CONTENTS: 180004010 00200000 10200000 00200000 00000000
CONTENTS: 180004020 00000000 01000000 00300000 00700000
CONTENTS: 180004030 40000000 00300000 08700000 40000000

CONTENTS: Contents of section .test:
CONTENTS-NEXT: 180007000 00300080 01000000 00300080 01000000
CONTENTS-NEXT: 180007010 1c400080 01000000 40400080 01000000

#--- arm64ec.s
.text
.global "#_pei386_runtime_relocator"
"#_pei386_runtime_relocator":
ret

.weak_anti_dep _pei386_runtime_relocator
.set _pei386_runtime_relocator,"#_pei386_runtime_relocator"

.section .test,"dr"
.quad variable
.quad __RUNTIME_PSEUDO_RELOC_LIST__
.quad __RUNTIME_PSEUDO_RELOC_LIST_END__

#--- x86_64.s
.section .test,"dr"
.quad variable

#--- test.def
LIBRARY test.dll
EXPORTS
variable DATA
Loading