brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · 9e854fa Raw
157 lines · c
1//===-- AMDGPUAsmPrinter.h - Print AMDGPU assembly code ---------*- 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 Assembly printer class.11//12//===----------------------------------------------------------------------===//13 14#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H15#define LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H16 17#include "AMDGPUMCResourceInfo.h"18#include "SIProgramInfo.h"19#include "llvm/CodeGen/AsmPrinter.h"20 21namespace llvm {22 23class AMDGPUMachineFunction;24class AMDGPUResourceUsageAnalysis;25class AMDGPUTargetStreamer;26class MCCodeEmitter;27class MCOperand;28class MCResourceInfo;29 30namespace AMDGPU {31struct MCKernelDescriptor;32struct AMDGPUMCKernelCodeT;33namespace HSAMD {34class MetadataStreamer;35}36} // namespace AMDGPU37 38class AMDGPUAsmPrinter final : public AsmPrinter {39public:40  static char ID;41 42private:43  unsigned CodeObjectVersion;44  void initializeTargetID(const Module &M);45 46  const AMDGPUResourceUsageAnalysisWrapperPass::FunctionResourceInfo47      *ResourceUsage;48 49  MCResourceInfo RI;50 51  SIProgramInfo CurrentProgramInfo;52 53  std::unique_ptr<AMDGPU::HSAMD::MetadataStreamer> HSAMetadataStream;54 55  MCCodeEmitter *DumpCodeInstEmitter = nullptr;56 57  // When appropriate, add a _dvgpr$ symbol.58  void emitDVgprSymbol(MachineFunction &MF);59 60  void getSIProgramInfo(SIProgramInfo &Out, const MachineFunction &MF);61  void getAmdKernelCode(AMDGPU::AMDGPUMCKernelCodeT &Out,62                        const SIProgramInfo &KernelInfo,63                        const MachineFunction &MF) const;64 65  /// Emit register usage information so that the GPU driver66  /// can correctly setup the GPU state.67  void EmitProgramInfoSI(const MachineFunction &MF,68                         const SIProgramInfo &KernelInfo);69  void EmitPALMetadata(const MachineFunction &MF,70                       const SIProgramInfo &KernelInfo);71  void emitPALFunctionMetadata(const MachineFunction &MF);72  void emitCommonFunctionComments(const MCExpr *NumVGPR, const MCExpr *NumAGPR,73                                  const MCExpr *TotalNumVGPR,74                                  const MCExpr *NumSGPR,75                                  const MCExpr *ScratchSize, uint64_t CodeSize,76                                  const AMDGPUMachineFunction *MFI);77  void emitResourceUsageRemarks(const MachineFunction &MF,78                                const SIProgramInfo &CurrentProgramInfo,79                                bool isModuleEntryFunction, bool hasMAIInsts);80 81  const MCExpr *getAmdhsaKernelCodeProperties(const MachineFunction &MF) const;82 83  AMDGPU::MCKernelDescriptor84  getAmdhsaKernelDescriptor(const MachineFunction &MF,85                            const SIProgramInfo &PI) const;86 87  void initTargetStreamer(Module &M);88 89  SmallString<128> getMCExprStr(const MCExpr *Value);90 91  /// Attempts to replace the validation that is missed in getSIProgramInfo due92  /// to MCExpr being unknown. Invoked during doFinalization such that the93  /// MCResourceInfo symbols are known.94  void validateMCResourceInfo(Function &F);95 96public:97  explicit AMDGPUAsmPrinter(TargetMachine &TM,98                            std::unique_ptr<MCStreamer> Streamer);99 100  StringRef getPassName() const override;101 102  const MCSubtargetInfo* getGlobalSTI() const;103 104  AMDGPUTargetStreamer* getTargetStreamer() const;105 106  bool doInitialization(Module &M) override;107  bool doFinalization(Module &M) override;108  bool runOnMachineFunction(MachineFunction &MF) override;109 110  /// Wrapper for MCInstLowering.lowerOperand() for the tblgen'erated111  /// pseudo lowering.112  bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const;113 114  /// Lower the specified LLVM Constant to an MCExpr.115  /// The AsmPrinter::lowerConstantof does not know how to lower116  /// addrspacecast, therefore they should be lowered by this function.117  const MCExpr *lowerConstant(const Constant *CV, const Constant *BaseCV,118                              uint64_t Offset) override;119 120  /// tblgen'erated driver function for lowering simple MI->MC pseudo121  /// instructions.122  bool lowerPseudoInstExpansion(const MachineInstr *MI, MCInst &Inst);123 124  /// Implemented in AMDGPUMCInstLower.cpp125  void emitInstruction(const MachineInstr *MI) override;126 127  void emitFunctionBodyStart() override;128 129  void emitFunctionBodyEnd() override;130 131  void emitImplicitDef(const MachineInstr *MI) const override;132 133  void emitFunctionEntryLabel() override;134 135  void emitBasicBlockStart(const MachineBasicBlock &MBB) override;136 137  void emitGlobalVariable(const GlobalVariable *GV) override;138 139  void emitStartOfAsmFile(Module &M) override;140 141  void emitEndOfAsmFile(Module &M) override;142 143  bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,144                       const char *ExtraCode, raw_ostream &O) override;145 146protected:147  void getAnalysisUsage(AnalysisUsage &AU) const override;148 149  std::vector<std::string> DisasmLines, HexLines;150  size_t DisasmLineMaxLen;151  bool IsTargetStreamerInitialized;152};153 154} // end namespace llvm155 156#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H157