//===- 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;
}
