blob: fe74290e6c6eebe32fb078a2ede531d603d6e1c0 [file] [log] [blame]
Konstantin Zhuravlyova63b0f92017-10-11 22:18:53 +00001//===--- AMDGPUHSAMetadataStreamer.h ----------------------------*- C++ -*-===//
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +00002//
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/// \file
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000011/// AMDGPU HSA Metadata Streamer.
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000012///
13//
14//===----------------------------------------------------------------------===//
15
Konstantin Zhuravlyova63b0f92017-10-11 22:18:53 +000016#ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H
17#define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000018
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000019#include "AMDGPU.h"
Konstantin Zhuravlyovca0e7f62017-03-22 22:54:39 +000020#include "AMDKernelCodeT.h"
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000021#include "llvm/ADT/StringRef.h"
Konstantin Zhuravlyova63b0f92017-10-11 22:18:53 +000022#include "llvm/Support/AMDGPUMetadata.h"
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000023
24namespace llvm {
25
26class Argument;
27class DataLayout;
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000028class Function;
29class MDNode;
30class Module;
Scott Linder2ad2c182018-07-10 17:31:32 +000031class SIProgramInfo;
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000032class Type;
33
34namespace AMDGPU {
Konstantin Zhuravlyova63b0f92017-10-11 22:18:53 +000035namespace HSAMD {
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000036
37class MetadataStreamer final {
38private:
Konstantin Zhuravlyova63b0f92017-10-11 22:18:53 +000039 Metadata HSAMetadata;
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000040 AMDGPUAS AMDGPUASI;
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000041
Konstantin Zhuravlyov516651b2017-10-11 22:59:35 +000042 void dump(StringRef HSAMetadataString) const;
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000043
Konstantin Zhuravlyov516651b2017-10-11 22:59:35 +000044 void verify(StringRef HSAMetadataString) const;
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000045
46 AccessQualifier getAccessQualifier(StringRef AccQual) const;
47
48 AddressSpaceQualifier getAddressSpaceQualifer(unsigned AddressSpace) const;
49
50 ValueKind getValueKind(Type *Ty, StringRef TypeQual,
51 StringRef BaseTypeName) const;
52
53 ValueType getValueType(Type *Ty, StringRef TypeName) const;
54
55 std::string getTypeName(Type *Ty, bool Signed) const;
56
57 std::vector<uint32_t> getWorkGroupDimensions(MDNode *Node) const;
58
Scott Linder2ad2c182018-07-10 17:31:32 +000059 Kernel::CodeProps::Metadata getHSACodeProps(
60 const MachineFunction &MF,
61 const SIProgramInfo &ProgramInfo) const;
62 Kernel::DebugProps::Metadata getHSADebugProps(
63 const MachineFunction &MF,
64 const SIProgramInfo &ProgramInfo) const;
65
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000066 void emitVersion();
67
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000068 void emitPrintf(const Module &Mod);
69
70 void emitKernelLanguage(const Function &Func);
71
72 void emitKernelAttrs(const Function &Func);
73
74 void emitKernelArgs(const Function &Func);
75
76 void emitKernelArg(const Argument &Arg);
77
78 void emitKernelArg(const DataLayout &DL, Type *Ty, ValueKind ValueKind,
Matt Arsenault73eeb422018-06-25 14:29:04 +000079 unsigned PointeeAlign = 0,
Konstantin Zhuravlyova01d8b02017-10-14 19:03:51 +000080 StringRef Name = "", StringRef TypeName = "",
81 StringRef BaseTypeName = "", StringRef AccQual = "",
82 StringRef TypeQual = "");
Konstantin Zhuravlyova780ffa2017-03-22 23:10:46 +000083
Konstantin Zhuravlyovf0badd52018-07-10 16:12:51 +000084 void emitHiddenKernelArgs(const Function &Func);
85
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000086public:
87 MetadataStreamer() = default;
88 ~MetadataStreamer() = default;
89
Konstantin Zhuravlyov516651b2017-10-11 22:59:35 +000090 const Metadata &getHSAMetadata() const {
91 return HSAMetadata;
92 }
93
Konstantin Zhuravlyov4cbb6892017-03-22 23:27:09 +000094 void begin(const Module &Mod);
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000095
Konstantin Zhuravlyov516651b2017-10-11 22:59:35 +000096 void end();
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000097
Scott Linder2ad2c182018-07-10 17:31:32 +000098 void emitKernel(const MachineFunction &MF, const SIProgramInfo &ProgramInfo);
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +000099};
100
Konstantin Zhuravlyova63b0f92017-10-11 22:18:53 +0000101} // end namespace HSAMD
Konstantin Zhuravlyov7498cd62017-03-22 22:32:22 +0000102} // end namespace AMDGPU
103} // end namespace llvm
104
Konstantin Zhuravlyova63b0f92017-10-11 22:18:53 +0000105#endif // LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H