//===- X86_64.cpp ---------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "Target.h" #include "lld/Common/ErrorHandler.h" #include "llvm/BinaryFormat/MachO.h" #include "llvm/Support/Endian.h" using namespace llvm::MachO; using namespace llvm::support::endian; using namespace lld; using namespace lld::macho; namespace { struct X86_64 : TargetInfo { X86_64(); uint64_t getImplicitAddend(const uint8_t *loc, uint8_t type) const override; void relocateOne(uint8_t *loc, uint8_t type, uint64_t val) const override; }; X86_64::X86_64() { cpuType = CPU_TYPE_X86_64; cpuSubtype = CPU_SUBTYPE_X86_64_ALL; } uint64_t X86_64::getImplicitAddend(const uint8_t *loc, uint8_t type) const { switch (type) { case X86_64_RELOC_SIGNED: return read32le(loc); default: error("TODO: Unhandled relocation type " + std::to_string(type)); return 0; } } void X86_64::relocateOne(uint8_t *loc, uint8_t type, uint64_t val) const { switch (type) { case X86_64_RELOC_SIGNED: // This type is only used for pc-relative relocations, so offset by 4 since // the RIP has advanced by 4 at this point. write32le(loc, val - 4); break; default: llvm_unreachable( "getImplicitAddend should have flagged all unhandled relocation types"); } } } // namespace TargetInfo *macho::createX86_64TargetInfo() { static X86_64 t; return &t; }