1 //===- AMDGPU.cpp ---------------------------------------------------------===//
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 #include "InputFiles.h"
15 #include "llvm/Object/ELF.h"
16 #include "llvm/Support/Endian.h"
19 using namespace llvm::object;
20 using namespace llvm::support::endian;
21 using namespace llvm::ELF;
23 using namespace lld::elf;
26 class AMDGPU final : public TargetInfo {
29 void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
30 RelExpr getRelExpr(uint32_t Type, const SymbolBody &S,
31 const uint8_t *Loc) const override;
36 RelativeRel = R_AMDGPU_REL64;
37 GotRel = R_AMDGPU_ABS64;
41 void AMDGPU::relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const {
44 case R_AMDGPU_GOTPCREL:
45 case R_AMDGPU_GOTPCREL32_LO:
47 case R_AMDGPU_REL32_LO:
53 case R_AMDGPU_GOTPCREL32_HI:
54 case R_AMDGPU_REL32_HI:
55 write32le(Loc, Val >> 32);
58 error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
62 RelExpr AMDGPU::getRelExpr(uint32_t Type, const SymbolBody &S,
63 const uint8_t *Loc) const {
69 case R_AMDGPU_REL32_LO:
70 case R_AMDGPU_REL32_HI:
72 case R_AMDGPU_GOTPCREL:
73 case R_AMDGPU_GOTPCREL32_LO:
74 case R_AMDGPU_GOTPCREL32_HI:
77 error(toString(S.File) + ": unknown relocation type: " + toString(Type));
82 TargetInfo *elf::createAMDGPUTargetInfo() { return make<AMDGPU>(); }