brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · 6bad4db Raw
177 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9/// \file10/// AMDGPU HSA Metadata Streamer.11///12//13//===----------------------------------------------------------------------===//14 15#ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H16#define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H17 18#include "Utils/AMDGPUDelayedMCExpr.h"19#include "llvm/BinaryFormat/MsgPackDocument.h"20#include "llvm/Support/AMDGPUMetadata.h"21#include "llvm/Support/Alignment.h"22#include "llvm/Support/Compiler.h"23 24namespace llvm {25 26class AMDGPUTargetMachine;27class AMDGPUTargetStreamer;28class Argument;29class DataLayout;30class Function;31class MachineFunction;32class MDNode;33class Module;34struct SIProgramInfo;35class Type;36 37namespace AMDGPU {38 39namespace IsaInfo {40class AMDGPUTargetID;41}42 43namespace HSAMD {44 45class MetadataStreamer {46public:47  virtual ~MetadataStreamer() = default;48 49  virtual bool emitTo(AMDGPUTargetStreamer &TargetStreamer) = 0;50 51  virtual void begin(const Module &Mod,52                     const IsaInfo::AMDGPUTargetID &TargetID) = 0;53 54  virtual void end() = 0;55 56  virtual void emitKernel(const MachineFunction &MF,57                          const SIProgramInfo &ProgramInfo) = 0;58 59protected:60  virtual void emitVersion() = 0;61  virtual void emitHiddenKernelArgs(const MachineFunction &MF, unsigned &Offset,62                                    msgpack::ArrayDocNode Args) = 0;63  virtual void emitKernelAttrs(const AMDGPUTargetMachine &TM,64                               const MachineFunction &MF,65                               msgpack::MapDocNode Kern) = 0;66};67 68class LLVM_EXTERNAL_VISIBILITY MetadataStreamerMsgPackV469    : public MetadataStreamer {70protected:71  std::unique_ptr<DelayedMCExprs> DelayedExprs =72      std::make_unique<DelayedMCExprs>();73 74  std::unique_ptr<msgpack::Document> HSAMetadataDoc =75      std::make_unique<msgpack::Document>();76 77  void dump(StringRef HSAMetadataString) const;78 79  void verify(StringRef HSAMetadataString) const;80 81  std::optional<StringRef> getAccessQualifier(StringRef AccQual) const;82 83  std::optional<StringRef>84  getAddressSpaceQualifier(unsigned AddressSpace) const;85 86  StringRef getValueKind(Type *Ty, StringRef TypeQual,87                         StringRef BaseTypeName) const;88 89  std::string getTypeName(Type *Ty, bool Signed) const;90 91  msgpack::ArrayDocNode getWorkGroupDimensions(MDNode *Node) const;92 93  msgpack::MapDocNode getHSAKernelProps(const MachineFunction &MF,94                                        const SIProgramInfo &ProgramInfo,95                                        unsigned CodeObjectVersion) const;96 97  void emitVersion() override;98 99  void emitTargetID(const IsaInfo::AMDGPUTargetID &TargetID);100 101  void emitPrintf(const Module &Mod);102 103  void emitKernelLanguage(const Function &Func, msgpack::MapDocNode Kern);104 105  void emitKernelAttrs(const AMDGPUTargetMachine &TM, const MachineFunction &MF,106                       msgpack::MapDocNode Kern) override;107 108  void emitKernelArgs(const MachineFunction &MF, msgpack::MapDocNode Kern);109 110  void emitKernelArg(const Argument &Arg, unsigned &Offset,111                     msgpack::ArrayDocNode Args);112 113  void emitKernelArg(const DataLayout &DL, Type *Ty, Align Alignment,114                     StringRef ValueKind, unsigned &Offset,115                     msgpack::ArrayDocNode Args,116                     MaybeAlign PointeeAlign = std::nullopt,117                     StringRef Name = "", StringRef TypeName = "",118                     StringRef BaseTypeName = "", StringRef ActAccQual = "",119                     StringRef AccQual = "", StringRef TypeQual = "");120 121  void emitHiddenKernelArgs(const MachineFunction &MF, unsigned &Offset,122                            msgpack::ArrayDocNode Args) override;123 124  msgpack::DocNode &getRootMetadata(StringRef Key) {125    return HSAMetadataDoc->getRoot().getMap(/*Convert=*/true)[Key];126  }127 128  msgpack::DocNode &getHSAMetadataRoot() {129    return HSAMetadataDoc->getRoot();130  }131 132public:133  MetadataStreamerMsgPackV4() = default;134  ~MetadataStreamerMsgPackV4() override = default;135 136  bool emitTo(AMDGPUTargetStreamer &TargetStreamer) override;137 138  void begin(const Module &Mod,139             const IsaInfo::AMDGPUTargetID &TargetID) override;140 141  void end() override;142 143  void emitKernel(const MachineFunction &MF,144                  const SIProgramInfo &ProgramInfo) override;145};146 147class MetadataStreamerMsgPackV5 : public MetadataStreamerMsgPackV4 {148protected:149  void emitVersion() override;150  void emitHiddenKernelArgs(const MachineFunction &MF, unsigned &Offset,151                            msgpack::ArrayDocNode Args) override;152  void emitKernelAttrs(const AMDGPUTargetMachine &TM, const MachineFunction &MF,153                       msgpack::MapDocNode Kern) override;154 155public:156  MetadataStreamerMsgPackV5() = default;157  ~MetadataStreamerMsgPackV5() override = default;158};159 160class MetadataStreamerMsgPackV6 final : public MetadataStreamerMsgPackV5 {161protected:162  void emitVersion() override;163 164public:165  MetadataStreamerMsgPackV6() = default;166  ~MetadataStreamerMsgPackV6() override = default;167 168  void emitKernelAttrs(const AMDGPUTargetMachine &TM, const MachineFunction &MF,169                       msgpack::MapDocNode Kern) override;170};171 172} // end namespace HSAMD173} // end namespace AMDGPU174} // end namespace llvm175 176#endif // LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H177