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