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