|  | //===-- AMDGPUAsmPrinter.h - Print AMDGPU assembly code ---------*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | /// \file | 
|  | /// AMDGPU Assembly printer class. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H | 
|  | #define LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H | 
|  |  | 
|  | #include "AMDGPU.h" | 
|  | #include "AMDKernelCodeT.h" | 
|  | #include "AMDGPUHSAMetadataStreamer.h" | 
|  | #include "SIProgramInfo.h" | 
|  | #include "llvm/ADT/StringRef.h" | 
|  | #include "llvm/CodeGen/AsmPrinter.h" | 
|  | #include "llvm/Support/AMDHSAKernelDescriptor.h" | 
|  | #include <cstddef> | 
|  | #include <cstdint> | 
|  | #include <limits> | 
|  | #include <memory> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | class AMDGPUMachineFunction; | 
|  | class AMDGPUTargetStreamer; | 
|  | class MCCodeEmitter; | 
|  | class MCOperand; | 
|  | class GCNSubtarget; | 
|  |  | 
|  | class AMDGPUAsmPrinter final : public AsmPrinter { | 
|  | private: | 
|  | // Track resource usage for callee functions. | 
|  | struct SIFunctionResourceInfo { | 
|  | // Track the number of explicitly used VGPRs. Special registers reserved at | 
|  | // the end are tracked separately. | 
|  | int32_t NumVGPR = 0; | 
|  | int32_t NumAGPR = 0; | 
|  | int32_t NumExplicitSGPR = 0; | 
|  | uint64_t PrivateSegmentSize = 0; | 
|  | bool UsesVCC = false; | 
|  | bool UsesFlatScratch = false; | 
|  | bool HasDynamicallySizedStack = false; | 
|  | bool HasRecursion = false; | 
|  |  | 
|  | int32_t getTotalNumSGPRs(const GCNSubtarget &ST) const; | 
|  | int32_t getTotalNumVGPRs(const GCNSubtarget &ST) const; | 
|  | }; | 
|  |  | 
|  | SIProgramInfo CurrentProgramInfo; | 
|  | DenseMap<const Function *, SIFunctionResourceInfo> CallGraphResourceInfo; | 
|  |  | 
|  | std::unique_ptr<AMDGPU::HSAMD::MetadataStreamer> HSAMetadataStream; | 
|  |  | 
|  | MCCodeEmitter *DumpCodeInstEmitter = nullptr; | 
|  |  | 
|  | uint64_t getFunctionCodeSize(const MachineFunction &MF) const; | 
|  | SIFunctionResourceInfo analyzeResourceUsage(const MachineFunction &MF) const; | 
|  |  | 
|  | void getSIProgramInfo(SIProgramInfo &Out, const MachineFunction &MF); | 
|  | void getAmdKernelCode(amd_kernel_code_t &Out, const SIProgramInfo &KernelInfo, | 
|  | const MachineFunction &MF) const; | 
|  | void findNumUsedRegistersSI(const MachineFunction &MF, | 
|  | unsigned &NumSGPR, | 
|  | unsigned &NumVGPR) const; | 
|  |  | 
|  | /// Emit register usage information so that the GPU driver | 
|  | /// can correctly setup the GPU state. | 
|  | void EmitProgramInfoSI(const MachineFunction &MF, | 
|  | const SIProgramInfo &KernelInfo); | 
|  | void EmitPALMetadata(const MachineFunction &MF, | 
|  | const SIProgramInfo &KernelInfo); | 
|  | void emitCommonFunctionComments(uint32_t NumVGPR, | 
|  | Optional<uint32_t> NumAGPR, | 
|  | uint32_t TotalNumVGPR, | 
|  | uint32_t NumSGPR, | 
|  | uint64_t ScratchSize, | 
|  | uint64_t CodeSize, | 
|  | const AMDGPUMachineFunction* MFI); | 
|  |  | 
|  | uint16_t getAmdhsaKernelCodeProperties( | 
|  | const MachineFunction &MF) const; | 
|  |  | 
|  | amdhsa::kernel_descriptor_t getAmdhsaKernelDescriptor( | 
|  | const MachineFunction &MF, | 
|  | const SIProgramInfo &PI) const; | 
|  |  | 
|  | public: | 
|  | explicit AMDGPUAsmPrinter(TargetMachine &TM, | 
|  | std::unique_ptr<MCStreamer> Streamer); | 
|  |  | 
|  | StringRef getPassName() const override; | 
|  |  | 
|  | const MCSubtargetInfo* getGlobalSTI() const; | 
|  |  | 
|  | AMDGPUTargetStreamer* getTargetStreamer() const; | 
|  |  | 
|  | bool doFinalization(Module &M) override; | 
|  | bool runOnMachineFunction(MachineFunction &MF) override; | 
|  |  | 
|  | /// Wrapper for MCInstLowering.lowerOperand() for the tblgen'erated | 
|  | /// pseudo lowering. | 
|  | bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const; | 
|  |  | 
|  | /// Lower the specified LLVM Constant to an MCExpr. | 
|  | /// The AsmPrinter::lowerConstantof does not know how to lower | 
|  | /// addrspacecast, therefore they should be lowered by this function. | 
|  | const MCExpr *lowerConstant(const Constant *CV) override; | 
|  |  | 
|  | /// tblgen'erated driver function for lowering simple MI->MC pseudo | 
|  | /// instructions. | 
|  | bool emitPseudoExpansionLowering(MCStreamer &OutStreamer, | 
|  | const MachineInstr *MI); | 
|  |  | 
|  | /// Implemented in AMDGPUMCInstLower.cpp | 
|  | void EmitInstruction(const MachineInstr *MI) override; | 
|  |  | 
|  | void EmitFunctionBodyStart() override; | 
|  |  | 
|  | void EmitFunctionBodyEnd() override; | 
|  |  | 
|  | void EmitFunctionEntryLabel() override; | 
|  |  | 
|  | void EmitBasicBlockStart(const MachineBasicBlock &MBB) override; | 
|  |  | 
|  | void EmitGlobalVariable(const GlobalVariable *GV) override; | 
|  |  | 
|  | void EmitStartOfAsmFile(Module &M) override; | 
|  |  | 
|  | void EmitEndOfAsmFile(Module &M) override; | 
|  |  | 
|  | bool isBlockOnlyReachableByFallthrough( | 
|  | const MachineBasicBlock *MBB) const override; | 
|  |  | 
|  | bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, | 
|  | const char *ExtraCode, raw_ostream &O) override; | 
|  |  | 
|  | protected: | 
|  | std::vector<std::string> DisasmLines, HexLines; | 
|  | size_t DisasmLineMaxLen; | 
|  | }; | 
|  |  | 
|  | } // end namespace llvm | 
|  |  | 
|  | #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H |