2015-09-23 02:19:46 +08:00
|
|
|
//===- Target.h -------------------------------------------------*- C++ -*-===//
|
|
|
|
//
|
|
|
|
// The LLVM Linker
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLD_ELF_TARGET_H
|
|
|
|
#define LLD_ELF_TARGET_H
|
|
|
|
|
2015-09-29 13:34:03 +08:00
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
|
|
|
2015-09-23 02:19:46 +08:00
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
namespace lld {
|
|
|
|
namespace elf2 {
|
|
|
|
class SymbolBody;
|
|
|
|
|
|
|
|
class TargetInfo {
|
|
|
|
public:
|
2015-10-09 06:23:54 +08:00
|
|
|
unsigned getPageSize() const { return PageSize; }
|
2015-10-09 05:25:04 +08:00
|
|
|
uint64_t getVAStart() const { return VAStart; }
|
2015-09-23 02:19:46 +08:00
|
|
|
unsigned getPCRelReloc() const { return PCRelReloc; }
|
2015-09-23 05:35:51 +08:00
|
|
|
unsigned getGotReloc() const { return GotReloc; }
|
2015-10-06 03:30:12 +08:00
|
|
|
unsigned getGotRefReloc() const { return GotRefReloc; }
|
|
|
|
unsigned getRelativeReloc() const { return RelativeReloc; }
|
2015-10-09 05:51:31 +08:00
|
|
|
unsigned getPltEntrySize() const { return PltEntrySize; }
|
2015-09-23 02:19:46 +08:00
|
|
|
virtual void writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr,
|
|
|
|
uint64_t PltEntryAddr) const = 0;
|
2015-10-06 03:30:12 +08:00
|
|
|
virtual bool isRelRelative(uint32_t Type) const;
|
2015-09-30 07:22:16 +08:00
|
|
|
virtual bool relocNeedsGot(uint32_t Type, const SymbolBody &S) const = 0;
|
2015-09-29 21:36:32 +08:00
|
|
|
virtual bool relocPointsToGot(uint32_t Type) const;
|
2015-09-30 07:22:16 +08:00
|
|
|
virtual bool relocNeedsPlt(uint32_t Type, const SymbolBody &S) const = 0;
|
2015-10-13 05:19:18 +08:00
|
|
|
virtual void relocateOne(uint8_t *Buf, uint8_t *BufEnd, const void *RelP,
|
|
|
|
uint32_t Type, uint64_t BaseAddr,
|
|
|
|
uint64_t SymVA) const = 0;
|
2015-09-23 04:54:08 +08:00
|
|
|
|
2015-09-23 02:19:46 +08:00
|
|
|
virtual ~TargetInfo();
|
|
|
|
|
|
|
|
protected:
|
2015-10-09 06:23:54 +08:00
|
|
|
unsigned PageSize = 4096;
|
2015-10-09 05:25:04 +08:00
|
|
|
uint64_t VAStart;
|
2015-09-23 02:19:46 +08:00
|
|
|
unsigned PCRelReloc;
|
2015-09-29 22:42:37 +08:00
|
|
|
unsigned GotRefReloc;
|
2015-09-23 05:35:51 +08:00
|
|
|
unsigned GotReloc;
|
2015-10-06 03:30:12 +08:00
|
|
|
unsigned RelativeReloc;
|
2015-10-09 05:51:31 +08:00
|
|
|
unsigned PltEntrySize = 8;
|
2015-09-23 02:19:46 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
class X86TargetInfo final : public TargetInfo {
|
|
|
|
public:
|
|
|
|
X86TargetInfo();
|
|
|
|
void writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr,
|
|
|
|
uint64_t PltEntryAddr) const override;
|
2015-09-30 07:22:16 +08:00
|
|
|
bool relocNeedsGot(uint32_t Type, const SymbolBody &S) const override;
|
2015-09-29 21:36:32 +08:00
|
|
|
bool relocPointsToGot(uint32_t Type) const override;
|
2015-09-30 07:22:16 +08:00
|
|
|
bool relocNeedsPlt(uint32_t Type, const SymbolBody &S) const override;
|
2015-10-13 05:19:18 +08:00
|
|
|
void relocateOne(uint8_t *Buf, uint8_t *BufEnd, const void *RelP,
|
|
|
|
uint32_t Type, uint64_t BaseAddr,
|
|
|
|
uint64_t SymVA) const override;
|
2015-09-23 02:19:46 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
class X86_64TargetInfo final : public TargetInfo {
|
|
|
|
public:
|
|
|
|
X86_64TargetInfo();
|
|
|
|
void writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr,
|
|
|
|
uint64_t PltEntryAddr) const override;
|
2015-09-30 07:22:16 +08:00
|
|
|
bool relocNeedsGot(uint32_t Type, const SymbolBody &S) const override;
|
|
|
|
bool relocNeedsPlt(uint32_t Type, const SymbolBody &S) const override;
|
2015-10-13 05:19:18 +08:00
|
|
|
void relocateOne(uint8_t *Buf, uint8_t *BufEnd, const void *RelP,
|
|
|
|
uint32_t Type, uint64_t BaseAddr,
|
|
|
|
uint64_t SymVA) const override;
|
2015-10-06 03:30:12 +08:00
|
|
|
bool isRelRelative(uint32_t Type) const override;
|
2015-09-23 04:54:08 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
class PPC64TargetInfo final : public TargetInfo {
|
|
|
|
public:
|
|
|
|
PPC64TargetInfo();
|
|
|
|
void writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr,
|
|
|
|
uint64_t PltEntryAddr) const override;
|
2015-09-30 07:22:16 +08:00
|
|
|
bool relocNeedsGot(uint32_t Type, const SymbolBody &S) const override;
|
|
|
|
bool relocNeedsPlt(uint32_t Type, const SymbolBody &S) const override;
|
2015-10-13 05:19:18 +08:00
|
|
|
void relocateOne(uint8_t *Buf, uint8_t *BufEnd, const void *RelP,
|
|
|
|
uint32_t Type, uint64_t BaseAddr,
|
|
|
|
uint64_t SymVA) const override;
|
2015-10-13 04:58:52 +08:00
|
|
|
bool isRelRelative(uint32_t Type) const override;
|
2015-09-23 02:19:46 +08:00
|
|
|
};
|
|
|
|
|
2015-09-23 05:24:52 +08:00
|
|
|
class PPCTargetInfo final : public TargetInfo {
|
|
|
|
public:
|
|
|
|
PPCTargetInfo();
|
|
|
|
void writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr,
|
|
|
|
uint64_t PltEntryAddr) const override;
|
2015-09-30 07:22:16 +08:00
|
|
|
bool relocNeedsGot(uint32_t Type, const SymbolBody &S) const override;
|
|
|
|
bool relocNeedsPlt(uint32_t Type, const SymbolBody &S) const override;
|
2015-10-13 05:19:18 +08:00
|
|
|
void relocateOne(uint8_t *Buf, uint8_t *BufEnd, const void *RelP,
|
|
|
|
uint32_t Type, uint64_t BaseAddr,
|
|
|
|
uint64_t SymVA) const override;
|
2015-09-23 05:24:52 +08:00
|
|
|
};
|
|
|
|
|
2015-09-26 08:32:04 +08:00
|
|
|
class AArch64TargetInfo final : public TargetInfo {
|
|
|
|
public:
|
|
|
|
AArch64TargetInfo();
|
|
|
|
void writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr,
|
|
|
|
uint64_t PltEntryAddr) const override;
|
2015-09-30 07:22:16 +08:00
|
|
|
bool relocNeedsGot(uint32_t Type, const SymbolBody &S) const override;
|
|
|
|
bool relocNeedsPlt(uint32_t Type, const SymbolBody &S) const override;
|
2015-10-13 05:19:18 +08:00
|
|
|
void relocateOne(uint8_t *Buf, uint8_t *BufEnd, const void *RelP,
|
|
|
|
uint32_t Type, uint64_t BaseAddr,
|
|
|
|
uint64_t SymVA) const override;
|
2015-09-26 08:32:04 +08:00
|
|
|
};
|
|
|
|
|
2015-09-29 13:34:03 +08:00
|
|
|
class MipsTargetInfo final : public TargetInfo {
|
|
|
|
public:
|
|
|
|
MipsTargetInfo();
|
|
|
|
void writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr,
|
|
|
|
uint64_t PltEntryAddr) const override;
|
2015-09-30 07:22:16 +08:00
|
|
|
bool relocNeedsGot(uint32_t Type, const SymbolBody &S) const override;
|
|
|
|
bool relocNeedsPlt(uint32_t Type, const SymbolBody &S) const override;
|
2015-10-13 05:19:18 +08:00
|
|
|
void relocateOne(uint8_t *Buf, uint8_t *BufEnd, const void *RelP,
|
|
|
|
uint32_t Type, uint64_t BaseAddr,
|
|
|
|
uint64_t SymVA) const override;
|
2015-09-29 13:34:03 +08:00
|
|
|
};
|
|
|
|
|
2015-09-23 02:19:46 +08:00
|
|
|
extern std::unique_ptr<TargetInfo> Target;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|