diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h new file mode 100644 index 000000000000..c50c19a4609c --- /dev/null +++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h @@ -0,0 +1,153 @@ +//===-- 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 |