Skip to content

Commit

Permalink
[lld] Add support for relocations in x86_64 objects on Arm64EC target…
Browse files Browse the repository at this point in the history
…s. (#69098)

Since EC targets may combine various object types, we need to pick
relocation format based on chunk type instead of global config.
  • Loading branch information
cjacek authored Oct 16, 2023
1 parent 1ebe738 commit 47401b6
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
4 changes: 2 additions & 2 deletions lld/COFF/Chunks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,7 @@ void SectionChunk::applyRelocation(uint8_t *off,
// Compute the RVA of the relocation for relative relocations.
uint64_t p = rva + rel.VirtualAddress;
uint64_t imageBase = file->ctx.config.imageBase;
switch (file->ctx.config.machine) {
switch (getMachine()) {
case AMD64:
applyRelX64(off, rel.Type, os, s, p, imageBase);
break;
Expand Down Expand Up @@ -551,7 +551,7 @@ static uint8_t getBaserelType(const coff_relocation &rel,
// Only called when base relocation is enabled.
void SectionChunk::getBaserels(std::vector<Baserel> *res) {
for (const coff_relocation &rel : getRelocs()) {
uint8_t ty = getBaserelType(rel, file->ctx.config.machine);
uint8_t ty = getBaserelType(rel, getMachine());
if (ty == IMAGE_REL_BASED_ABSOLUTE)
continue;
Symbol *target = file->getSymbol(rel.SymbolTableIndex);
Expand Down
2 changes: 2 additions & 0 deletions lld/COFF/Chunks.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,8 @@ class SectionChunk final : public Chunk {
ArrayRef<uint8_t> getContents() const;
void writeTo(uint8_t *buf) const;

MachineTypes getMachine() const { return file->getMachineType(); }

// Defend against unsorted relocations. This may be overly conservative.
void sortRelocations();

Expand Down
37 changes: 37 additions & 0 deletions lld/test/COFF/arm64ec-reloc.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
REQUIRES: aarch64, x86
RUN: split-file %s %t.dir && cd %t.dir

Link a mix of ARM64EC and x86_64 data and check that relocations work.

RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-data-sym.s -o arm64ec-data-sym.obj
RUN: llvm-mc -filetype=obj -triple=x86_64-windows x86_64-data-sym.s -o x86_64-data-sym.obj
RUN: lld-link -out:test.dll -machine:arm64ec arm64ec-data-sym.obj x86_64-data-sym.obj -dll -noentry

RUN: llvm-readobj --hex-dump=.data test.dll | FileCheck -check-prefix=ARM64EC-DATA %s
ARM64EC-DATA: 0x180001000 00100080 01000000 08100080 01000000

RUN: llvm-readobj --coff-basereloc test.dll | FileCheck -check-prefix=RELOCS %s
RELOCS: BaseReloc [
RELOCS-NEXT: Entry {
RELOCS-NEXT: Type: DIR64
RELOCS-NEXT: Address: 0x1000
RELOCS-NEXT: }
RELOCS-NEXT: Entry {
RELOCS-NEXT: Type: DIR64
RELOCS-NEXT: Address: 0x1008
RELOCS-NEXT: }
RELOCS-NEXT: ]

#--- arm64ec-data-sym.s
.data
.globl arm64ec_data_sym
.p2align 2, 0x0
arm64ec_data_sym:
.xword arm64ec_data_sym

#--- x86_64-data-sym.s
.data
.globl x86_64_data_sym
.p2align 2, 0x0
x86_64_data_sym:
.quad x86_64_data_sym

0 comments on commit 47401b6

Please sign in to comment.