Coverage Report

Created: 2019-07-24 05:18

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.h
Line
Count
Source (jump to first uncovered line)
1
//===--- AMDGPUHSAMetadataStreamer.h ----------------------------*- C++ -*-===//
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
/// \file
10
/// AMDGPU HSA Metadata Streamer.
11
///
12
//
13
//===----------------------------------------------------------------------===//
14
15
#ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H
16
#define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H
17
18
#include "AMDGPU.h"
19
#include "AMDKernelCodeT.h"
20
#include "llvm/ADT/StringRef.h"
21
#include "llvm/BinaryFormat/MsgPackDocument.h"
22
#include "llvm/Support/AMDGPUMetadata.h"
23
24
namespace llvm {
25
26
class AMDGPUTargetStreamer;
27
class Argument;
28
class DataLayout;
29
class Function;
30
class MDNode;
31
class Module;
32
struct SIProgramInfo;
33
class Type;
34
35
namespace AMDGPU {
36
namespace HSAMD {
37
38
class MetadataStreamer {
39
public:
40
2.39k
  virtual ~MetadataStreamer(){};
41
42
  virtual bool emitTo(AMDGPUTargetStreamer &TargetStreamer) = 0;
43
44
  virtual void begin(const Module &Mod) = 0;
45
46
  virtual void end() = 0;
47
48
  virtual void emitKernel(const MachineFunction &MF,
49
                          const SIProgramInfo &ProgramInfo) = 0;
50
};
51
52
class MetadataStreamerV3 final : public MetadataStreamer {
53
private:
54
  std::unique_ptr<msgpack::Document> HSAMetadataDoc =
55
      llvm::make_unique<msgpack::Document>();
56
57
  void dump(StringRef HSAMetadataString) const;
58
59
  void verify(StringRef HSAMetadataString) const;
60
61
  Optional<StringRef> getAccessQualifier(StringRef AccQual) const;
62
63
  Optional<StringRef> getAddressSpaceQualifier(unsigned AddressSpace) const;
64
65
  StringRef getValueKind(Type *Ty, StringRef TypeQual,
66
                         StringRef BaseTypeName) const;
67
68
  StringRef getValueType(Type *Ty, StringRef TypeName) const;
69
70
  std::string getTypeName(Type *Ty, bool Signed) const;
71
72
  msgpack::ArrayDocNode getWorkGroupDimensions(MDNode *Node) const;
73
74
  msgpack::MapDocNode getHSAKernelProps(const MachineFunction &MF,
75
                                        const SIProgramInfo &ProgramInfo) const;
76
77
  void emitVersion();
78
79
  void emitPrintf(const Module &Mod);
80
81
  void emitKernelLanguage(const Function &Func, msgpack::MapDocNode Kern);
82
83
  void emitKernelAttrs(const Function &Func, msgpack::MapDocNode Kern);
84
85
  void emitKernelArgs(const Function &Func, msgpack::MapDocNode Kern);
86
87
  void emitKernelArg(const Argument &Arg, unsigned &Offset,
88
                     msgpack::ArrayDocNode Args);
89
90
  void emitKernelArg(const DataLayout &DL, Type *Ty, StringRef ValueKind,
91
                     unsigned &Offset, msgpack::ArrayDocNode Args,
92
                     unsigned PointeeAlign = 0, StringRef Name = "",
93
                     StringRef TypeName = "", StringRef BaseTypeName = "",
94
                     StringRef AccQual = "", StringRef TypeQual = "");
95
96
  void emitHiddenKernelArgs(const Function &Func, unsigned &Offset,
97
                            msgpack::ArrayDocNode Args);
98
99
3.85k
  msgpack::DocNode &getRootMetadata(StringRef Key) {
100
3.85k
    return HSAMetadataDoc->getRoot().getMap(/*Convert=*/true)[Key];
101
3.85k
  }
102
103
0
  msgpack::DocNode &getHSAMetadataRoot() {
104
0
    return HSAMetadataDoc->getRoot();
105
0
  }
106
107
public:
108
290
  MetadataStreamerV3() = default;
109
289
  ~MetadataStreamerV3() = default;
110
111
  bool emitTo(AMDGPUTargetStreamer &TargetStreamer) override;
112
113
  void begin(const Module &Mod) override;
114
115
  void end() override;
116
117
  void emitKernel(const MachineFunction &MF,
118
                  const SIProgramInfo &ProgramInfo) override;
119
};
120
121
class MetadataStreamerV2 final : public MetadataStreamer {
122
private:
123
  Metadata HSAMetadata;
124
125
  void dump(StringRef HSAMetadataString) const;
126
127
  void verify(StringRef HSAMetadataString) const;
128
129
  AccessQualifier getAccessQualifier(StringRef AccQual) const;
130
131
  AddressSpaceQualifier getAddressSpaceQualifier(unsigned AddressSpace) const;
132
133
  ValueKind getValueKind(Type *Ty, StringRef TypeQual,
134
                         StringRef BaseTypeName) const;
135
136
  ValueType getValueType(Type *Ty, StringRef TypeName) const;
137
138
  std::string getTypeName(Type *Ty, bool Signed) const;
139
140
  std::vector<uint32_t> getWorkGroupDimensions(MDNode *Node) const;
141
142
  Kernel::CodeProps::Metadata getHSACodeProps(
143
      const MachineFunction &MF,
144
      const SIProgramInfo &ProgramInfo) const;
145
  Kernel::DebugProps::Metadata getHSADebugProps(
146
      const MachineFunction &MF,
147
      const SIProgramInfo &ProgramInfo) const;
148
149
  void emitVersion();
150
151
  void emitPrintf(const Module &Mod);
152
153
  void emitKernelLanguage(const Function &Func);
154
155
  void emitKernelAttrs(const Function &Func);
156
157
  void emitKernelArgs(const Function &Func);
158
159
  void emitKernelArg(const Argument &Arg);
160
161
  void emitKernelArg(const DataLayout &DL, Type *Ty, ValueKind ValueKind,
162
                     unsigned PointeeAlign = 0,
163
                     StringRef Name = "", StringRef TypeName = "",
164
                     StringRef BaseTypeName = "", StringRef AccQual = "",
165
                     StringRef TypeQual = "");
166
167
  void emitHiddenKernelArgs(const Function &Func);
168
169
165
  const Metadata &getHSAMetadata() const {
170
165
    return HSAMetadata;
171
165
  }
172
173
public:
174
2.12k
  MetadataStreamerV2() = default;
175
2.10k
  ~MetadataStreamerV2() = default;
176
177
  bool emitTo(AMDGPUTargetStreamer &TargetStreamer) override;
178
179
  void begin(const Module &Mod) override;
180
181
  void end() override;
182
183
  void emitKernel(const MachineFunction &MF,
184
                  const SIProgramInfo &ProgramInfo) override;
185
};
186
187
} // end namespace HSAMD
188
} // end namespace AMDGPU
189
} // end namespace llvm
190
191
#endif // LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H