brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.7 KiB · 22afcde Raw
225 lines · c
1//===-- AMDGPUTargetStreamer.h - AMDGPU Target Streamer --------*- 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#ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H10#define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H11 12#include "Utils/AMDGPUBaseInfo.h"13#include "Utils/AMDGPUPALMetadata.h"14#include "llvm/MC/MCStreamer.h"15 16namespace llvm {17 18class MCELFStreamer;19class MCSymbol;20class formatted_raw_ostream;21 22namespace AMDGPU {23 24struct AMDGPUMCKernelCodeT;25struct MCKernelDescriptor;26namespace HSAMD {27struct Metadata;28}29} // namespace AMDGPU30 31class AMDGPUTargetStreamer : public MCTargetStreamer {32  AMDGPUPALMetadata PALMetadata;33 34protected:35  // TODO: Move HSAMetadataStream to AMDGPUTargetStreamer.36  std::optional<AMDGPU::IsaInfo::AMDGPUTargetID> TargetID;37  unsigned CodeObjectVersion;38 39  MCContext &getContext() const { return Streamer.getContext(); }40 41public:42  AMDGPUTargetStreamer(MCStreamer &S)43      : MCTargetStreamer(S),44        // Assume the default COV for now, EmitDirectiveAMDHSACodeObjectVersion45        // will update this if it is encountered.46        CodeObjectVersion(AMDGPU::getDefaultAMDHSACodeObjectVersion()) {}47 48  AMDGPUPALMetadata *getPALMetadata() { return &PALMetadata; }49 50  virtual void EmitDirectiveAMDGCNTarget(){};51 52  virtual void EmitDirectiveAMDHSACodeObjectVersion(unsigned COV) {53    CodeObjectVersion = COV;54  }55 56  virtual void EmitAMDKernelCodeT(AMDGPU::AMDGPUMCKernelCodeT &Header) {};57 58  virtual void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type){};59 60  virtual void emitAMDGPULDS(MCSymbol *Symbol, unsigned Size, Align Alignment) {61  }62 63  virtual void EmitMCResourceInfo(64      const MCSymbol *NumVGPR, const MCSymbol *NumAGPR,65      const MCSymbol *NumExplicitSGPR, const MCSymbol *NumNamedBarrier,66      const MCSymbol *PrivateSegmentSize, const MCSymbol *UsesVCC,67      const MCSymbol *UsesFlatScratch, const MCSymbol *HasDynamicallySizedStack,68      const MCSymbol *HasRecursion, const MCSymbol *HasIndirectCall) {};69 70  virtual void EmitMCResourceMaximums(const MCSymbol *MaxVGPR,71                                      const MCSymbol *MaxAGPR,72                                      const MCSymbol *MaxSGPR) {};73 74  /// \returns True on success, false on failure.75  virtual bool EmitISAVersion() { return true; }76 77  /// \returns True on success, false on failure.78  virtual bool EmitHSAMetadataV3(StringRef HSAMetadataString);79 80  /// Emit HSA Metadata81  ///82  /// When \p Strict is true, known metadata elements must already be83  /// well-typed. When \p Strict is false, known types are inferred and84  /// the \p HSAMetadata structure is updated with the correct types.85  ///86  /// \returns True on success, false on failure.87  virtual bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) {88    return true;89  }90 91  /// \returns True on success, false on failure.92  virtual bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata) {93    return true;94  }95 96  /// \returns True on success, false on failure.97  virtual bool EmitCodeEnd(const MCSubtargetInfo &STI) { return true; }98 99  virtual void100  EmitAmdhsaKernelDescriptor(const MCSubtargetInfo &STI, StringRef KernelName,101                             const AMDGPU::MCKernelDescriptor &KernelDescriptor,102                             const MCExpr *NextVGPR, const MCExpr *NextSGPR,103                             const MCExpr *ReserveVCC,104                             const MCExpr *ReserveFlatScr) {}105 106  static StringRef getArchNameFromElfMach(unsigned ElfMach);107  static unsigned getElfMach(StringRef GPU);108 109  const std::optional<AMDGPU::IsaInfo::AMDGPUTargetID> &getTargetID() const {110    return TargetID;111  }112  std::optional<AMDGPU::IsaInfo::AMDGPUTargetID> &getTargetID() {113    return TargetID;114  }115  void initializeTargetID(const MCSubtargetInfo &STI) {116    assert(TargetID == std::nullopt && "TargetID can only be initialized once");117    TargetID.emplace(STI);118  }119  void initializeTargetID(const MCSubtargetInfo &STI, StringRef FeatureString) {120    initializeTargetID(STI);121 122    assert(getTargetID() != std::nullopt && "TargetID is None");123    getTargetID()->setTargetIDFromFeaturesString(FeatureString);124  }125};126 127class AMDGPUTargetAsmStreamer final : public AMDGPUTargetStreamer {128  formatted_raw_ostream &OS;129public:130  AMDGPUTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);131 132  void finish() override;133 134  void EmitDirectiveAMDGCNTarget() override;135 136  void EmitDirectiveAMDHSACodeObjectVersion(unsigned COV) override;137 138  void EmitAMDKernelCodeT(AMDGPU::AMDGPUMCKernelCodeT &Header) override;139 140  void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override;141 142  void emitAMDGPULDS(MCSymbol *Sym, unsigned Size, Align Alignment) override;143 144  void EmitMCResourceInfo(145      const MCSymbol *NumVGPR, const MCSymbol *NumAGPR,146      const MCSymbol *NumExplicitSGPR, const MCSymbol *NumNamedBarrier,147      const MCSymbol *PrivateSegmentSize, const MCSymbol *UsesVCC,148      const MCSymbol *UsesFlatScratch, const MCSymbol *HasDynamicallySizedStack,149      const MCSymbol *HasRecursion, const MCSymbol *HasIndirectCall) override;150 151  void EmitMCResourceMaximums(const MCSymbol *MaxVGPR, const MCSymbol *MaxAGPR,152                              const MCSymbol *MaxSGPR) override;153 154  /// \returns True on success, false on failure.155  bool EmitISAVersion() override;156 157  /// \returns True on success, false on failure.158  bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) override;159 160  /// \returns True on success, false on failure.161  bool EmitCodeEnd(const MCSubtargetInfo &STI) override;162 163  void164  EmitAmdhsaKernelDescriptor(const MCSubtargetInfo &STI, StringRef KernelName,165                             const AMDGPU::MCKernelDescriptor &KernelDescriptor,166                             const MCExpr *NextVGPR, const MCExpr *NextSGPR,167                             const MCExpr *ReserveVCC,168                             const MCExpr *ReserveFlatScr) override;169};170 171class AMDGPUTargetELFStreamer final : public AMDGPUTargetStreamer {172  const MCSubtargetInfo &STI;173  MCStreamer &Streamer;174 175  void EmitNote(StringRef Name, const MCExpr *DescSize, unsigned NoteType,176                function_ref<void(MCELFStreamer &)> EmitDesc);177 178  unsigned getEFlags();179 180  unsigned getEFlagsR600();181  unsigned getEFlagsAMDGCN();182 183  unsigned getEFlagsUnknownOS();184  unsigned getEFlagsAMDHSA();185  unsigned getEFlagsAMDPAL();186  unsigned getEFlagsMesa3D();187 188  unsigned getEFlagsV3();189  unsigned getEFlagsV4();190  unsigned getEFlagsV6();191 192public:193  AMDGPUTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);194 195  MCELFStreamer &getStreamer();196 197  void finish() override;198 199  void EmitDirectiveAMDGCNTarget() override;200 201  void EmitAMDKernelCodeT(AMDGPU::AMDGPUMCKernelCodeT &Header) override;202 203  void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override;204 205  void emitAMDGPULDS(MCSymbol *Sym, unsigned Size, Align Alignment) override;206 207  /// \returns True on success, false on failure.208  bool EmitISAVersion() override;209 210  /// \returns True on success, false on failure.211  bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) override;212 213  /// \returns True on success, false on failure.214  bool EmitCodeEnd(const MCSubtargetInfo &STI) override;215 216  void217  EmitAmdhsaKernelDescriptor(const MCSubtargetInfo &STI, StringRef KernelName,218                             const AMDGPU::MCKernelDescriptor &KernelDescriptor,219                             const MCExpr *NextVGPR, const MCExpr *NextSGPR,220                             const MCExpr *ReserveVCC,221                             const MCExpr *ReserveFlatScr) override;222};223}224#endif225