blob: ea889747f1024258d3ddd70c6da3c80553262ed1 [file] [log] [blame]
//===- 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/WriterMachO.h"
#ifndef LLD_READER_WRITER_MACHO_REFERENCE_KINDS_H_
#define LLD_READER_WRITER_MACHO_REFERENCE_KINDS_H_
namespace lld {
namespace mach_o {
///
/// 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:
typedef Reference::Kind Kind;
static KindHandler *makeHandler(WriterOptionsMachO::Architecture arch);
virtual ~KindHandler();
virtual Kind stringToKind(StringRef str) = 0;
virtual StringRef kindToString(Kind) = 0;
virtual bool isCallSite(Kind) = 0;
virtual bool isPointer(Kind) = 0;
virtual bool isLazyImmediate(Kind) = 0;
virtual bool isLazyTarget(Kind) = 0;
virtual void applyFixup(Kind kind, uint64_t addend, uint8_t *location,
uint64_t fixupAddress, uint64_t targetAddress) = 0;
protected:
KindHandler();
};
class KindHandler_x86_64 : public KindHandler {
public:
enum Kinds {
none = 0,
call32 = 1,
ripRel32 = 2,
gotLoad32 = 3,
gotUse32 = 4,
lea32WasGot = 5,
lazyTarget = 6,
lazyImm = 7,
gotTarget = 8,
pointer64 = 9
};
virtual ~KindHandler_x86_64();
virtual Kind stringToKind(StringRef str);
virtual StringRef kindToString(Kind);
virtual bool isCallSite(Kind);
virtual bool isPointer(Kind);
virtual bool isLazyImmediate(Kind);
virtual bool isLazyTarget(Kind);
virtual void applyFixup(Kind kind, uint64_t addend, uint8_t *location,
uint64_t fixupAddress, uint64_t targetAddress);
};
class KindHandler_x86 : public KindHandler {
public:
enum Kinds {
none = 0,
call32 = 1,
abs32 = 2,
pointer32 = 3,
lazyTarget = 4,
lazyImm = 5
};
virtual ~KindHandler_x86();
virtual Kind stringToKind(StringRef str);
virtual StringRef kindToString(Kind);
virtual bool isCallSite(Kind);
virtual bool isPointer(Kind);
virtual bool isLazyImmediate(Kind);
virtual bool isLazyTarget(Kind);
virtual void applyFixup(Kind kind, uint64_t addend, uint8_t *location,
uint64_t fixupAddress, uint64_t targetAddress);
};
class KindHandler_arm : public KindHandler {
public:
enum Kinds {
none = 0,
br22 = 1,
pointer32 = 2,
lazyTarget = 3,
lazyImm = 4
// FIXME
};
virtual ~KindHandler_arm();
virtual Kind stringToKind(StringRef str);
virtual StringRef kindToString(Kind);
virtual bool isCallSite(Kind);
virtual bool isPointer(Kind);
virtual bool isLazyImmediate(Kind);
virtual bool isLazyTarget(Kind);
virtual void applyFixup(Kind kind, 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_