xref: /aosp_15_r20/external/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUELFObjectWriter.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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