diff options
-rw-r--r-- | lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFTargetInfo.h | 3 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp | 112 | ||||
-rw-r--r-- | lld/test/elf/x86_64-kinds.test | 6 |
3 files changed, 121 insertions, 0 deletions
diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFTargetInfo.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFTargetInfo.h index 9098d2066bb..7d6d97bf199 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFTargetInfo.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFTargetInfo.h @@ -36,6 +36,9 @@ public: return _options._baseAddress; } + virtual ErrorOr<int32_t> relocKindFromString(StringRef str) const; + virtual ErrorOr<std::string> stringFromRelocKind(int32_t kind) const; + }; } // elf } // lld diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp index e69de29bb2d..0841e334ed2 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp @@ -0,0 +1,112 @@ +//===- lib/ReaderWriter/ELF/X86_64/X86_64ELFTargetInfo.cpp ----------------===// +// +// The LLVM Linker +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "X86_64ELFTargetInfo.h" + +#include "llvm/ADT/StringSwitch.h" + +using namespace lld; + +#define LLD_CASE(name) .Case(#name, llvm::ELF::name) + +ErrorOr<int32_t> elf::X86_64ELFTargetInfo::relocKindFromString(StringRef str) const { + int32_t ret = llvm::StringSwitch<int32_t>(str) + LLD_CASE(R_X86_64_NONE) + LLD_CASE(R_X86_64_64) + LLD_CASE(R_X86_64_PC32) + LLD_CASE(R_X86_64_GOT32) + LLD_CASE(R_X86_64_PLT32) + LLD_CASE(R_X86_64_COPY) + LLD_CASE(R_X86_64_GLOB_DAT) + LLD_CASE(R_X86_64_JUMP_SLOT) + LLD_CASE(R_X86_64_RELATIVE) + LLD_CASE(R_X86_64_GOTPCREL) + LLD_CASE(R_X86_64_32) + LLD_CASE(R_X86_64_32S) + LLD_CASE(R_X86_64_16) + LLD_CASE(R_X86_64_PC16) + LLD_CASE(R_X86_64_8) + LLD_CASE(R_X86_64_PC8) + LLD_CASE(R_X86_64_DTPMOD64) + LLD_CASE(R_X86_64_DTPOFF64) + LLD_CASE(R_X86_64_TPOFF64) + LLD_CASE(R_X86_64_TLSGD) + LLD_CASE(R_X86_64_TLSLD) + LLD_CASE(R_X86_64_DTPOFF32) + LLD_CASE(R_X86_64_GOTTPOFF) + LLD_CASE(R_X86_64_TPOFF32) + LLD_CASE(R_X86_64_PC64) + LLD_CASE(R_X86_64_GOTOFF64) + LLD_CASE(R_X86_64_GOTPC32) + LLD_CASE(R_X86_64_GOT64) + LLD_CASE(R_X86_64_GOTPCREL64) + LLD_CASE(R_X86_64_GOTPC64) + LLD_CASE(R_X86_64_GOTPLT64) + LLD_CASE(R_X86_64_PLTOFF64) + LLD_CASE(R_X86_64_SIZE32) + LLD_CASE(R_X86_64_SIZE64) + LLD_CASE(R_X86_64_GOTPC32_TLSDESC) + LLD_CASE(R_X86_64_TLSDESC_CALL) + LLD_CASE(R_X86_64_TLSDESC) + LLD_CASE(R_X86_64_IRELATIVE) + .Default(-1); + + if (ret == -1) + return make_error_code(yaml_reader_error::illegal_value); + return ret; +} + +#undef LLD_CASE + +#define LLD_CASE(name) case llvm::ELF::name: return std::string(#name); + +ErrorOr<std::string> elf::X86_64ELFTargetInfo::stringFromRelocKind(int32_t kind) const { + switch (kind) { + LLD_CASE(R_X86_64_NONE) + LLD_CASE(R_X86_64_64) + LLD_CASE(R_X86_64_PC32) + LLD_CASE(R_X86_64_GOT32) + LLD_CASE(R_X86_64_PLT32) + LLD_CASE(R_X86_64_COPY) + LLD_CASE(R_X86_64_GLOB_DAT) + LLD_CASE(R_X86_64_JUMP_SLOT) + LLD_CASE(R_X86_64_RELATIVE) + LLD_CASE(R_X86_64_GOTPCREL) + LLD_CASE(R_X86_64_32) + LLD_CASE(R_X86_64_32S) + LLD_CASE(R_X86_64_16) + LLD_CASE(R_X86_64_PC16) + LLD_CASE(R_X86_64_8) + LLD_CASE(R_X86_64_PC8) + LLD_CASE(R_X86_64_DTPMOD64) + LLD_CASE(R_X86_64_DTPOFF64) + LLD_CASE(R_X86_64_TPOFF64) + LLD_CASE(R_X86_64_TLSGD) + LLD_CASE(R_X86_64_TLSLD) + LLD_CASE(R_X86_64_DTPOFF32) + LLD_CASE(R_X86_64_GOTTPOFF) + LLD_CASE(R_X86_64_TPOFF32) + LLD_CASE(R_X86_64_PC64) + LLD_CASE(R_X86_64_GOTOFF64) + LLD_CASE(R_X86_64_GOTPC32) + LLD_CASE(R_X86_64_GOT64) + LLD_CASE(R_X86_64_GOTPCREL64) + LLD_CASE(R_X86_64_GOTPC64) + LLD_CASE(R_X86_64_GOTPLT64) + LLD_CASE(R_X86_64_PLTOFF64) + LLD_CASE(R_X86_64_SIZE32) + LLD_CASE(R_X86_64_SIZE64) + LLD_CASE(R_X86_64_GOTPC32_TLSDESC) + LLD_CASE(R_X86_64_TLSDESC_CALL) + LLD_CASE(R_X86_64_TLSDESC) + LLD_CASE(R_X86_64_IRELATIVE) + } + + return make_error_code(yaml_reader_error::illegal_value); +} diff --git a/lld/test/elf/x86_64-kinds.test b/lld/test/elf/x86_64-kinds.test index cb09b00a826..fd198fb5418 100644 --- a/lld/test/elf/x86_64-kinds.test +++ b/lld/test/elf/x86_64-kinds.test @@ -1,6 +1,9 @@ RUN: lld -flavor ld -target x86_64-linux -o %t1 %p/Inputs/relocs.x86-64 \ RUN: && llvm-objdump -d %t1 | FileCheck %s -check-prefix=RELOCS +RUN: lld -core -target x86_64-linux -output=- -emit-yaml \ +RUN: %p/Inputs/relocs.x86-64 | FileCheck %s -check-prefix=X86_64 + RELOCS: ELF64-x86-64 // R_X86_64_32S @@ -12,3 +15,6 @@ RELOCS: 05 00 00 00 movl RELOCS: e8 RELOCS-NOT: 00 00 00 00 RELOCS: callq + +X86_64: R_X86_64_32S +X86_64: R_X86_64_PC32 |