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