Coverage Report

Created: 2019-07-24 05:18

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUELFObjectWriter.cpp
Line
Count
Source (jump to first uncovered line)
1
//===- AMDGPUELFObjectWriter.cpp - AMDGPU ELF Writer ----------------------===//
2
//
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
6
//
7
//===----------------------------------------------------------------------===//
8
9
#include "AMDGPUMCTargetDesc.h"
10
#include "llvm/BinaryFormat/ELF.h"
11
#include "llvm/MC/MCELFObjectWriter.h"
12
#include "llvm/MC/MCExpr.h"
13
#include "llvm/MC/MCFixup.h"
14
#include "llvm/MC/MCObjectWriter.h"
15
#include "llvm/MC/MCSymbol.h"
16
#include "llvm/MC/MCValue.h"
17
#include "llvm/Support/ErrorHandling.h"
18
19
using namespace llvm;
20
21
namespace {
22
23
class AMDGPUELFObjectWriter : public MCELFObjectTargetWriter {
24
public:
25
  AMDGPUELFObjectWriter(bool Is64Bit, uint8_t OSABI, bool HasRelocationAddend,
26
                        uint8_t ABIVersion);
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
                                             bool HasRelocationAddend,
39
                                             uint8_t ABIVersion)
40
  : MCELFObjectTargetWriter(Is64Bit, OSABI, ELF::EM_AMDGPU,
41
3.27k
                            HasRelocationAddend, ABIVersion) {}
42
43
unsigned AMDGPUELFObjectWriter::getRelocType(MCContext &Ctx,
44
                                             const MCValue &Target,
45
                                             const MCFixup &Fixup,
46
456
                                             bool IsPCRel) const {
47
456
  if (const auto *SymA = Target.getSymA()) {
48
456
    // SCRATCH_RSRC_DWORD[01] is a special global variable that represents
49
456
    // the scratch buffer.
50
456
    if (SymA->getSymbol().getName() == "SCRATCH_RSRC_DWORD0" ||
51
456
        
SymA->getSymbol().getName() == "SCRATCH_RSRC_DWORD1"448
)
52
16
      return ELF::R_AMDGPU_ABS32_LO;
53
440
  }
54
440
55
440
  switch (Target.getAccessVariant()) {
56
440
  default:
57
114
    break;
58
440
  case MCSymbolRefExpr::VK_GOTPCREL:
59
6
    return ELF::R_AMDGPU_GOTPCREL;
60
440
  case MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_LO:
61
17
    return ELF::R_AMDGPU_GOTPCREL32_LO;
62
440
  case MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_HI:
63
17
    return ELF::R_AMDGPU_GOTPCREL32_HI;
64
440
  case MCSymbolRefExpr::VK_AMDGPU_REL32_LO:
65
4
    return ELF::R_AMDGPU_REL32_LO;
66
440
  case MCSymbolRefExpr::VK_AMDGPU_REL32_HI:
67
2
    return ELF::R_AMDGPU_REL32_HI;
68
440
  case MCSymbolRefExpr::VK_AMDGPU_REL64:
69
280
    return ELF::R_AMDGPU_REL64;
70
114
  }
71
114
72
114
  switch (Fixup.getKind()) {
73
114
  
default: break0
;
74
114
  case FK_PCRel_4:
75
0
    return ELF::R_AMDGPU_REL32;
76
114
  case FK_Data_4:
77
80
  case FK_SecRel_4:
78
80
    return ELF::R_AMDGPU_ABS32;
79
80
  case FK_Data_8:
80
34
    return ELF::R_AMDGPU_ABS64;
81
0
  }
82
0
83
0
  llvm_unreachable("unhandled relocation type");
84
0
}
85
86
std::unique_ptr<MCObjectTargetWriter>
87
llvm::createAMDGPUELFObjectWriter(bool Is64Bit, uint8_t OSABI,
88
                                  bool HasRelocationAddend,
89
3.27k
                                  uint8_t ABIVersion) {
90
3.27k
  return llvm::make_unique<AMDGPUELFObjectWriter>(Is64Bit, OSABI,
91
3.27k
                                                  HasRelocationAddend,
92
3.27k
                                                  ABIVersion);
93
3.27k
}