1*9880d681SAndroid Build Coastguard Worker //===-- AMDGPUELFObjectWriter.cpp - AMDGPU ELF Writer ----------------------==//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker /// \file
9*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker #include "AMDGPUMCTargetDesc.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCELFObjectWriter.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCFixup.h"
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker using namespace llvm;
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker namespace {
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker class AMDGPUELFObjectWriter : public MCELFObjectTargetWriter {
20*9880d681SAndroid Build Coastguard Worker public:
21*9880d681SAndroid Build Coastguard Worker AMDGPUELFObjectWriter(bool Is64Bit, bool HasRelocationAddend);
22*9880d681SAndroid Build Coastguard Worker protected:
23*9880d681SAndroid Build Coastguard Worker unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
24*9880d681SAndroid Build Coastguard Worker const MCFixup &Fixup, bool IsPCRel) const override;
25*9880d681SAndroid Build Coastguard Worker };
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker } // End anonymous namespace
29*9880d681SAndroid Build Coastguard Worker
AMDGPUELFObjectWriter(bool Is64Bit,bool HasRelocationAddend)30*9880d681SAndroid Build Coastguard Worker AMDGPUELFObjectWriter::AMDGPUELFObjectWriter(bool Is64Bit,
31*9880d681SAndroid Build Coastguard Worker bool HasRelocationAddend)
32*9880d681SAndroid Build Coastguard Worker : MCELFObjectTargetWriter(Is64Bit,
33*9880d681SAndroid Build Coastguard Worker ELF::ELFOSABI_AMDGPU_HSA,
34*9880d681SAndroid Build Coastguard Worker ELF::EM_AMDGPU,
35*9880d681SAndroid Build Coastguard Worker HasRelocationAddend) { }
36*9880d681SAndroid Build Coastguard Worker
getRelocType(MCContext & Ctx,const MCValue & Target,const MCFixup & Fixup,bool IsPCRel) const37*9880d681SAndroid Build Coastguard Worker unsigned AMDGPUELFObjectWriter::getRelocType(MCContext &Ctx,
38*9880d681SAndroid Build Coastguard Worker const MCValue &Target,
39*9880d681SAndroid Build Coastguard Worker const MCFixup &Fixup,
40*9880d681SAndroid Build Coastguard Worker bool IsPCRel) const {
41*9880d681SAndroid Build Coastguard Worker // SCRATCH_RSRC_DWORD[01] is a special global variable that represents
42*9880d681SAndroid Build Coastguard Worker // the scratch buffer.
43*9880d681SAndroid Build Coastguard Worker if (Target.getSymA()->getSymbol().getName() == "SCRATCH_RSRC_DWORD0")
44*9880d681SAndroid Build Coastguard Worker return ELF::R_AMDGPU_ABS32_LO;
45*9880d681SAndroid Build Coastguard Worker if (Target.getSymA()->getSymbol().getName() == "SCRATCH_RSRC_DWORD1")
46*9880d681SAndroid Build Coastguard Worker return ELF::R_AMDGPU_ABS32_HI;
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker switch (Target.getAccessVariant()) {
49*9880d681SAndroid Build Coastguard Worker default:
50*9880d681SAndroid Build Coastguard Worker break;
51*9880d681SAndroid Build Coastguard Worker case MCSymbolRefExpr::VK_GOTPCREL:
52*9880d681SAndroid Build Coastguard Worker return ELF::R_AMDGPU_GOTPCREL;
53*9880d681SAndroid Build Coastguard Worker }
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker switch (Fixup.getKind()) {
56*9880d681SAndroid Build Coastguard Worker default: break;
57*9880d681SAndroid Build Coastguard Worker case FK_PCRel_4:
58*9880d681SAndroid Build Coastguard Worker return ELF::R_AMDGPU_REL32;
59*9880d681SAndroid Build Coastguard Worker case FK_SecRel_4:
60*9880d681SAndroid Build Coastguard Worker return ELF::R_AMDGPU_ABS32;
61*9880d681SAndroid Build Coastguard Worker }
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker llvm_unreachable("unhandled relocation type");
64*9880d681SAndroid Build Coastguard Worker }
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker
createAMDGPUELFObjectWriter(bool Is64Bit,bool HasRelocationAddend,raw_pwrite_stream & OS)67*9880d681SAndroid Build Coastguard Worker MCObjectWriter *llvm::createAMDGPUELFObjectWriter(bool Is64Bit,
68*9880d681SAndroid Build Coastguard Worker bool HasRelocationAddend,
69*9880d681SAndroid Build Coastguard Worker raw_pwrite_stream &OS) {
70*9880d681SAndroid Build Coastguard Worker MCELFObjectTargetWriter *MOTW =
71*9880d681SAndroid Build Coastguard Worker new AMDGPUELFObjectWriter(Is64Bit, HasRelocationAddend);
72*9880d681SAndroid Build Coastguard Worker return createELFObjectWriter(MOTW, OS, true);
73*9880d681SAndroid Build Coastguard Worker }
74