1 //===- AMDGPU.cpp ---------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "InputFiles.h"
12 #include "lld/Common/ErrorHandler.h"
13 #include "llvm/Object/ELF.h"
14 #include "llvm/Support/Endian.h"
17 using namespace llvm::object;
18 using namespace llvm::support::endian;
19 using namespace llvm::ELF;
21 using namespace lld::elf;
24 class AMDGPU final : public TargetInfo {
27 uint32_t calcEFlags() const override;
28 void relocate(uint8_t *loc, const Relocation &rel,
29 uint64_t val) const override;
30 RelExpr getRelExpr(RelType type, const Symbol &s,
31 const uint8_t *loc) const override;
32 RelType getDynRel(RelType type) const override;
37 relativeRel = R_AMDGPU_RELATIVE64;
38 gotRel = R_AMDGPU_ABS64;
39 noneRel = R_AMDGPU_NONE;
40 symbolicRel = R_AMDGPU_ABS64;
43 static uint32_t getEFlags(InputFile *file) {
44 return cast<ObjFile<ELF64LE>>(file)->getObj().getHeader()->e_flags;
47 uint32_t AMDGPU::calcEFlags() const {
48 assert(!objectFiles.empty());
49 uint32_t ret = getEFlags(objectFiles[0]);
51 // Verify that all input files have the same e_flags.
52 for (InputFile *f : makeArrayRef(objectFiles).slice(1)) {
53 if (ret == getEFlags(f))
55 error("incompatible e_flags: " + toString(f));
61 void AMDGPU::relocate(uint8_t *loc, const Relocation &rel, uint64_t val) const {
64 case R_AMDGPU_GOTPCREL:
65 case R_AMDGPU_GOTPCREL32_LO:
67 case R_AMDGPU_REL32_LO:
74 case R_AMDGPU_GOTPCREL32_HI:
75 case R_AMDGPU_REL32_HI:
76 write32le(loc, val >> 32);
79 llvm_unreachable("unknown relocation");
83 RelExpr AMDGPU::getRelExpr(RelType type, const Symbol &s,
84 const uint8_t *loc) const {
90 case R_AMDGPU_REL32_LO:
91 case R_AMDGPU_REL32_HI:
94 case R_AMDGPU_GOTPCREL:
95 case R_AMDGPU_GOTPCREL32_LO:
96 case R_AMDGPU_GOTPCREL32_HI:
99 error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
100 ") against symbol " + toString(s));
105 RelType AMDGPU::getDynRel(RelType type) const {
106 if (type == R_AMDGPU_ABS64)
108 return R_AMDGPU_NONE;
111 TargetInfo *elf::getAMDGPUTargetInfo() {
112 static AMDGPU target;