LCOV - code coverage report
Current view: top level - lib/Target/AMDGPU/MCTargetDesc - AMDGPUELFObjectWriter.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 25 26 96.2 %
Date: 2018-06-17 00:07:59 Functions: 3 4 75.0 %
Legend: Lines: hit not hit

          Line data    Source code
       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             : //===----------------------------------------------------------------------===//
       9             : 
      10             : #include "AMDGPUMCTargetDesc.h"
      11             : #include "llvm/BinaryFormat/ELF.h"
      12             : #include "llvm/MC/MCELFObjectWriter.h"
      13             : #include "llvm/MC/MCExpr.h"
      14             : #include "llvm/MC/MCFixup.h"
      15             : #include "llvm/MC/MCObjectWriter.h"
      16             : #include "llvm/MC/MCSymbol.h"
      17             : #include "llvm/MC/MCValue.h"
      18             : #include "llvm/Support/ErrorHandling.h"
      19             : 
      20             : using namespace llvm;
      21             : 
      22             : namespace {
      23             : 
      24        2458 : class AMDGPUELFObjectWriter : public MCELFObjectTargetWriter {
      25             : public:
      26             :   AMDGPUELFObjectWriter(bool Is64Bit, uint8_t OSABI, bool HasRelocationAddend);
      27             : 
      28             : protected:
      29             :   unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
      30             :                         const MCFixup &Fixup, bool IsPCRel) const override;
      31             : };
      32             : 
      33             : 
      34             : } // end anonymous namespace
      35             : 
      36             : AMDGPUELFObjectWriter::AMDGPUELFObjectWriter(bool Is64Bit,
      37             :                                              uint8_t OSABI,
      38        2468 :                                              bool HasRelocationAddend)
      39             :   : MCELFObjectTargetWriter(Is64Bit, OSABI, ELF::EM_AMDGPU,
      40        2468 :                             HasRelocationAddend) {}
      41             : 
      42         208 : unsigned AMDGPUELFObjectWriter::getRelocType(MCContext &Ctx,
      43             :                                              const MCValue &Target,
      44             :                                              const MCFixup &Fixup,
      45             :                                              bool IsPCRel) const {
      46         208 :   if (const auto *SymA = Target.getSymA()) {
      47             :     // SCRATCH_RSRC_DWORD[01] is a special global variable that represents
      48             :     // the scratch buffer.
      49         208 :     if (SymA->getSymbol().getName() == "SCRATCH_RSRC_DWORD0")
      50             :       return ELF::R_AMDGPU_ABS32_LO;
      51             : 
      52             :     if (SymA->getSymbol().getName() == "SCRATCH_RSRC_DWORD1")
      53             :       return ELF::R_AMDGPU_ABS32_HI;
      54             :   }
      55             : 
      56         204 :   switch (Target.getAccessVariant()) {
      57             :   default:
      58             :     break;
      59             :   case MCSymbolRefExpr::VK_GOTPCREL:
      60             :     return ELF::R_AMDGPU_GOTPCREL;
      61          11 :   case MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_LO:
      62          11 :     return ELF::R_AMDGPU_GOTPCREL32_LO;
      63          11 :   case MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_HI:
      64          11 :     return ELF::R_AMDGPU_GOTPCREL32_HI;
      65           5 :   case MCSymbolRefExpr::VK_AMDGPU_REL32_LO:
      66           5 :     return ELF::R_AMDGPU_REL32_LO;
      67           5 :   case MCSymbolRefExpr::VK_AMDGPU_REL32_HI:
      68           5 :     return ELF::R_AMDGPU_REL32_HI;
      69           4 :   case MCSymbolRefExpr::VK_AMDGPU_REL64:
      70           4 :     return ELF::R_AMDGPU_REL64;
      71             :   }
      72             : 
      73         161 :   switch (Fixup.getKind()) {
      74             :   default: break;
      75             :   case FK_PCRel_4:
      76             :     return ELF::R_AMDGPU_REL32;
      77         109 :   case FK_Data_4:
      78             :   case FK_SecRel_4:
      79         109 :     return ELF::R_AMDGPU_ABS32;
      80          49 :   case FK_Data_8:
      81          49 :     return ELF::R_AMDGPU_ABS64;
      82             :   }
      83             : 
      84           0 :   llvm_unreachable("unhandled relocation type");
      85             : }
      86             : 
      87             : std::unique_ptr<MCObjectTargetWriter>
      88        2468 : llvm::createAMDGPUELFObjectWriter(bool Is64Bit, uint8_t OSABI,
      89             :                                   bool HasRelocationAddend) {
      90        4936 :   return llvm::make_unique<AMDGPUELFObjectWriter>(Is64Bit, OSABI,
      91        2468 :                                                   HasRelocationAddend);
      92             : }

Generated by: LCOV version 1.13