1 //===-- AMDGPUAsmPrinter.h - Print AMDGPU assembly code ---------*- C++ -*-===//
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-exception
7 //===----------------------------------------------------------------------===//
10 /// AMDGPU Assembly printer class.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H
15 #define LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H
18 #include "AMDKernelCodeT.h"
19 #include "AMDGPUHSAMetadataStreamer.h"
20 #include "SIProgramInfo.h"
21 #include "llvm/ADT/StringRef.h"
22 #include "llvm/CodeGen/AsmPrinter.h"
23 #include "llvm/Support/AMDHSAKernelDescriptor.h"
33 class AMDGPUMachineFunction
;
34 class AMDGPUTargetStreamer
;
39 class AMDGPUAsmPrinter final
: public AsmPrinter
{
41 // Track resource usage for callee functions.
42 struct SIFunctionResourceInfo
{
43 // Track the number of explicitly used VGPRs. Special registers reserved at
44 // the end are tracked separately.
47 int32_t NumExplicitSGPR
= 0;
48 uint64_t PrivateSegmentSize
= 0;
50 bool UsesFlatScratch
= false;
51 bool HasDynamicallySizedStack
= false;
52 bool HasRecursion
= false;
54 int32_t getTotalNumSGPRs(const GCNSubtarget
&ST
) const;
55 int32_t getTotalNumVGPRs(const GCNSubtarget
&ST
) const;
58 SIProgramInfo CurrentProgramInfo
;
59 DenseMap
<const Function
*, SIFunctionResourceInfo
> CallGraphResourceInfo
;
61 std::unique_ptr
<AMDGPU::HSAMD::MetadataStreamer
> HSAMetadataStream
;
63 MCCodeEmitter
*DumpCodeInstEmitter
= nullptr;
65 uint64_t getFunctionCodeSize(const MachineFunction
&MF
) const;
66 SIFunctionResourceInfo
analyzeResourceUsage(const MachineFunction
&MF
) const;
68 void getSIProgramInfo(SIProgramInfo
&Out
, const MachineFunction
&MF
);
69 void getAmdKernelCode(amd_kernel_code_t
&Out
, const SIProgramInfo
&KernelInfo
,
70 const MachineFunction
&MF
) const;
71 void findNumUsedRegistersSI(const MachineFunction
&MF
,
73 unsigned &NumVGPR
) const;
75 /// Emit register usage information so that the GPU driver
76 /// can correctly setup the GPU state.
77 void EmitProgramInfoSI(const MachineFunction
&MF
,
78 const SIProgramInfo
&KernelInfo
);
79 void EmitPALMetadata(const MachineFunction
&MF
,
80 const SIProgramInfo
&KernelInfo
);
81 void emitCommonFunctionComments(uint32_t NumVGPR
,
82 Optional
<uint32_t> NumAGPR
,
83 uint32_t TotalNumVGPR
,
87 const AMDGPUMachineFunction
* MFI
);
89 uint16_t getAmdhsaKernelCodeProperties(
90 const MachineFunction
&MF
) const;
92 amdhsa::kernel_descriptor_t
getAmdhsaKernelDescriptor(
93 const MachineFunction
&MF
,
94 const SIProgramInfo
&PI
) const;
97 explicit AMDGPUAsmPrinter(TargetMachine
&TM
,
98 std::unique_ptr
<MCStreamer
> Streamer
);
100 StringRef
getPassName() const override
;
102 const MCSubtargetInfo
* getGlobalSTI() const;
104 AMDGPUTargetStreamer
* getTargetStreamer() const;
106 bool doFinalization(Module
&M
) override
;
107 bool runOnMachineFunction(MachineFunction
&MF
) override
;
109 /// Wrapper for MCInstLowering.lowerOperand() for the tblgen'erated
111 bool lowerOperand(const MachineOperand
&MO
, MCOperand
&MCOp
) const;
113 /// Lower the specified LLVM Constant to an MCExpr.
114 /// The AsmPrinter::lowerConstantof does not know how to lower
115 /// addrspacecast, therefore they should be lowered by this function.
116 const MCExpr
*lowerConstant(const Constant
*CV
) override
;
118 /// tblgen'erated driver function for lowering simple MI->MC pseudo
120 bool emitPseudoExpansionLowering(MCStreamer
&OutStreamer
,
121 const MachineInstr
*MI
);
123 /// Implemented in AMDGPUMCInstLower.cpp
124 void EmitInstruction(const MachineInstr
*MI
) override
;
126 void EmitFunctionBodyStart() override
;
128 void EmitFunctionBodyEnd() override
;
130 void EmitFunctionEntryLabel() override
;
132 void EmitBasicBlockStart(const MachineBasicBlock
&MBB
) override
;
134 void EmitGlobalVariable(const GlobalVariable
*GV
) override
;
136 void EmitStartOfAsmFile(Module
&M
) override
;
138 void EmitEndOfAsmFile(Module
&M
) override
;
140 bool isBlockOnlyReachableByFallthrough(
141 const MachineBasicBlock
*MBB
) const override
;
143 bool PrintAsmOperand(const MachineInstr
*MI
, unsigned OpNo
,
144 const char *ExtraCode
, raw_ostream
&O
) override
;
147 std::vector
<std::string
> DisasmLines
, HexLines
;
148 size_t DisasmLineMaxLen
;
151 } // end namespace llvm
153 #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H