//===-- AMDGPUAsmPrinter.h - Print AMDGPU assembly code ---------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // /// \file /// \brief AMDGPU Assembly printer class. // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_TARGET_R600_AMDGPUASMPRINTER_H #define LLVM_LIB_TARGET_R600_AMDGPUASMPRINTER_H #include "llvm/CodeGen/AsmPrinter.h" #include <vector> namespace llvm { class AMDGPUAsmPrinter : public AsmPrinter { private: struct SIProgramInfo { SIProgramInfo() : VGPRBlocks(0), SGPRBlocks(0), Priority(0), FloatMode(0), Priv(0), DX10Clamp(0), DebugMode(0), IEEEMode(0), ScratchSize(0), ComputePGMRSrc1(0), LDSBlocks(0), ScratchBlocks(0), ComputePGMRSrc2(0), NumVGPR(0), NumSGPR(0), FlatUsed(false), VCCUsed(false), CodeLen(0) {} // Fields set in PGM_RSRC1 pm4 packet. uint32_t VGPRBlocks; uint32_t SGPRBlocks; uint32_t Priority; uint32_t FloatMode; uint32_t Priv; uint32_t DX10Clamp; uint32_t DebugMode; uint32_t IEEEMode; uint32_t ScratchSize; uint64_t ComputePGMRSrc1; // Fields set in PGM_RSRC2 pm4 packet. uint32_t LDSBlocks; uint32_t ScratchBlocks; uint64_t ComputePGMRSrc2; uint32_t NumVGPR; uint32_t NumSGPR; uint32_t LDSSize; bool FlatUsed; // Bonus information for debugging. bool VCCUsed; uint64_t CodeLen; }; void getSIProgramInfo(SIProgramInfo &Out, const MachineFunction &MF) const; void findNumUsedRegistersSI(const MachineFunction &MF, unsigned &NumSGPR, unsigned &NumVGPR) const; /// \brief Emit register usage information so that the GPU driver /// can correctly setup the GPU state. void EmitProgramInfoR600(const MachineFunction &MF); void EmitProgramInfoSI(const MachineFunction &MF, const SIProgramInfo &KernelInfo); void EmitAmdKernelCodeT(const MachineFunction &MF, const SIProgramInfo &KernelInfo) const; public: explicit AMDGPUAsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer); bool runOnMachineFunction(MachineFunction &MF) override; const char *getPassName() const override { return "AMDGPU Assembly Printer"; } /// Implemented in AMDGPUMCInstLower.cpp void EmitInstruction(const MachineInstr *MI) override; void EmitFunctionBodyStart() override; void EmitFunctionEntryLabel() override; void EmitGlobalVariable(const GlobalVariable *GV) override; bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, unsigned AsmVariant, const char *ExtraCode, raw_ostream &O) override; protected: std::vector<std::string> DisasmLines, HexLines; size_t DisasmLineMaxLen; }; } // End anonymous llvm #endif