llvm-project/lld/lib/ReaderWriter/MachO/ReferenceKinds.h

131 lines
4.4 KiB
C++

//===- lib/FileFormat/MachO/ReferenceKinds.h ------------------------------===//
//
// The LLVM Linker
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "lld/Core/LLVM.h"
#include "lld/Core/Reference.h"
#include "lld/ReaderWriter/MachOLinkingContext.h"
#include "llvm/ADT/Triple.h"
#ifndef LLD_READER_WRITER_MACHO_REFERENCE_KINDS_H
#define LLD_READER_WRITER_MACHO_REFERENCE_KINDS_H
namespace lld {
namespace mach_o {
// Additional Reference Kind values used internally.
enum {
LLD_X86_64_RELOC_GOT_LOAD_NOW_LEA = 100,
LLD_X86_64_RELOC_TLV_NOW_LEA = 101,
LLD_X86_64_RELOC_LAZY_TARGET = 102,
LLD_X86_64_RELOC_LAZY_IMMEDIATE = 103,
LLD_X86_64_RELOC_SIGNED_32 = 104,
};
enum {
LLD_X86_RELOC_BRANCH32 = 100, // CALL or JMP 32-bit pc-rel
LLD_X86_RELOC_ABS32 = 101, // 32-bit absolute addr in instruction
LLD_X86_RELOC_FUNC_REL32 = 102, // 32-bit target from start of func
LLD_X86_RELOC_POINTER32 = 103, // 32-bit data pointer
LLD_X86_RELOC_LAZY_TARGET = 104,
LLD_X86_RELOC_LAZY_IMMEDIATE = 105
};
enum {
LLD_ARM_RELOC_THUMB_ABS_LO16 = 100, // thumb movw of absolute address
LLD_ARM_RELOC_THUMB_ABS_HI16 = 101, // thumb movt of absolute address
LLD_ARM_RELOC_THUMB_REL_LO16 = 102, // thumb movw of (target - pc)
LLD_ARM_RELOC_THUMB_REL_HI16 = 103, // thumb movt of (target - pc)
LLD_ARM_RELOC_ABS32 = 104, // 32-bit constant pointer
LLD_ARM_RELOC_POINTER32 = 105, // 32-bit data pointer
LLD_ARM_RELOC_LAZY_TARGET = 106,
LLD_ARM_RELOC_LAZY_IMMEDIATE = 107,
};
///
/// The KindHandler class is the abstract interface to Reference::Kind
/// values for mach-o files. Particular Kind values (e.g. 3) has a different
/// meaning for each architecture.
///
class KindHandler {
public:
static std::unique_ptr<mach_o::KindHandler> create(MachOLinkingContext::Arch);
virtual ~KindHandler();
virtual bool isCallSite(const Reference &) = 0;
virtual bool isPointer(const Reference &) = 0;
virtual bool isLazyImmediate(const Reference &) = 0;
virtual bool isLazyTarget(const Reference &) = 0;
virtual void applyFixup(Reference::KindNamespace ns, Reference::KindArch arch,
Reference::KindValue kindValue, uint64_t addend,
uint8_t *location, uint64_t fixupAddress,
uint64_t targetAddress) = 0;
protected:
KindHandler();
};
class KindHandler_x86_64 : public KindHandler {
public:
static const Registry::KindStrings kindStrings[];
virtual ~KindHandler_x86_64();
virtual bool isCallSite(const Reference &);
virtual bool isPointer(const Reference &);
virtual bool isLazyImmediate(const Reference &);
virtual bool isLazyTarget(const Reference &);
virtual void applyFixup(Reference::KindNamespace ns, Reference::KindArch arch,
Reference::KindValue kindValue, uint64_t addend,
uint8_t *location, uint64_t fixupAddress,
uint64_t targetAddress);
};
class KindHandler_x86 : public KindHandler {
public:
static const Registry::KindStrings kindStrings[];
virtual ~KindHandler_x86();
virtual bool isCallSite(const Reference &);
virtual bool isPointer(const Reference &);
virtual bool isLazyImmediate(const Reference &);
virtual bool isLazyTarget(const Reference &);
virtual void applyFixup(Reference::KindNamespace ns, Reference::KindArch arch,
Reference::KindValue kindValue, uint64_t addend,
uint8_t *location, uint64_t fixupAddress,
uint64_t targetAddress);
};
class KindHandler_arm : public KindHandler {
public:
static const Registry::KindStrings kindStrings[];
virtual ~KindHandler_arm();
virtual bool isCallSite(const Reference &);
virtual bool isPointer(const Reference &);
virtual bool isLazyImmediate(const Reference &);
virtual bool isLazyTarget(const Reference &);
virtual void applyFixup(Reference::KindNamespace ns, Reference::KindArch arch,
Reference::KindValue kindValue, uint64_t addend,
uint8_t *location, uint64_t fixupAddress,
uint64_t targetAddress);
};
} // namespace mach_o
} // namespace lld
#endif // LLD_READER_WRITER_MACHO_REFERENCE_KINDS_H