]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lld/ELF/Arch/AMDGPU.cpp
Merge llvm, clang, lld, lldb, compiler-rt and libc++ r305575, and update
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lld / ELF / Arch / AMDGPU.cpp
1 //===- AMDGPU.cpp ---------------------------------------------------------===//
2 //
3 //                             The LLVM Linker
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "Error.h"
11 #include "InputFiles.h"
12 #include "Memory.h"
13 #include "Symbols.h"
14 #include "Target.h"
15 #include "llvm/Object/ELF.h"
16 #include "llvm/Support/Endian.h"
17
18 using namespace llvm;
19 using namespace llvm::object;
20 using namespace llvm::support::endian;
21 using namespace llvm::ELF;
22 using namespace lld;
23 using namespace lld::elf;
24
25 namespace {
26 class AMDGPU final : public TargetInfo {
27 public:
28   AMDGPU();
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;
32 };
33 } // namespace
34
35 AMDGPU::AMDGPU() {
36   RelativeRel = R_AMDGPU_REL64;
37   GotRel = R_AMDGPU_ABS64;
38   GotEntrySize = 8;
39 }
40
41 void AMDGPU::relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const {
42   switch (Type) {
43   case R_AMDGPU_ABS32:
44   case R_AMDGPU_GOTPCREL:
45   case R_AMDGPU_GOTPCREL32_LO:
46   case R_AMDGPU_REL32:
47   case R_AMDGPU_REL32_LO:
48     write32le(Loc, Val);
49     break;
50   case R_AMDGPU_ABS64:
51     write64le(Loc, Val);
52     break;
53   case R_AMDGPU_GOTPCREL32_HI:
54   case R_AMDGPU_REL32_HI:
55     write32le(Loc, Val >> 32);
56     break;
57   default:
58     error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
59   }
60 }
61
62 RelExpr AMDGPU::getRelExpr(uint32_t Type, const SymbolBody &S,
63                            const uint8_t *Loc) const {
64   switch (Type) {
65   case R_AMDGPU_ABS32:
66   case R_AMDGPU_ABS64:
67     return R_ABS;
68   case R_AMDGPU_REL32:
69   case R_AMDGPU_REL32_LO:
70   case R_AMDGPU_REL32_HI:
71     return R_PC;
72   case R_AMDGPU_GOTPCREL:
73   case R_AMDGPU_GOTPCREL32_LO:
74   case R_AMDGPU_GOTPCREL32_HI:
75     return R_GOT_PC;
76   default:
77     error(toString(S.File) + ": unknown relocation type: " + toString(Type));
78     return R_HINT;
79   }
80 }
81
82 TargetInfo *elf::createAMDGPUTargetInfo() { return make<AMDGPU>(); }