Line data Source code
1 : //===-- AMDGPUAsmPrinter.h - Print AMDGPU assembly code ---------*- C++ -*-===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 : //
10 : /// \file
11 : /// AMDGPU Assembly printer class.
12 : //
13 : //===----------------------------------------------------------------------===//
14 :
15 : #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H
16 : #define LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H
17 :
18 : #include "AMDGPU.h"
19 : #include "AMDKernelCodeT.h"
20 : #include "MCTargetDesc/AMDGPUHSAMetadataStreamer.h"
21 : #include "SIProgramInfo.h"
22 : #include "llvm/ADT/StringRef.h"
23 : #include "llvm/CodeGen/AsmPrinter.h"
24 : #include "llvm/Support/AMDHSAKernelDescriptor.h"
25 : #include <cstddef>
26 : #include <cstdint>
27 : #include <limits>
28 : #include <memory>
29 : #include <string>
30 : #include <vector>
31 :
32 : namespace llvm {
33 :
34 : class AMDGPUMachineFunction;
35 : class AMDGPUTargetStreamer;
36 : class MCOperand;
37 : class SISubtarget;
38 :
39 5319 : class AMDGPUAsmPrinter final : public AsmPrinter {
40 : private:
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.
45 : int32_t NumVGPR = 0;
46 : int32_t NumExplicitSGPR = 0;
47 : uint64_t PrivateSegmentSize = 0;
48 : bool UsesVCC = false;
49 : bool UsesFlatScratch = false;
50 : bool HasDynamicallySizedStack = false;
51 : bool HasRecursion = false;
52 :
53 : int32_t getTotalNumSGPRs(const SISubtarget &ST) const;
54 : };
55 :
56 : SIProgramInfo CurrentProgramInfo;
57 : DenseMap<const Function *, SIFunctionResourceInfo> CallGraphResourceInfo;
58 :
59 : AMDGPU::HSAMD::MetadataStreamer HSAMetadataStream;
60 : std::map<uint32_t, uint32_t> PALMetadataMap;
61 :
62 : uint64_t getFunctionCodeSize(const MachineFunction &MF) const;
63 : SIFunctionResourceInfo analyzeResourceUsage(const MachineFunction &MF) const;
64 :
65 : void readPALMetadata(Module &M);
66 : void getSIProgramInfo(SIProgramInfo &Out, const MachineFunction &MF);
67 : void getAmdKernelCode(amd_kernel_code_t &Out, const SIProgramInfo &KernelInfo,
68 : const MachineFunction &MF) const;
69 : void findNumUsedRegistersSI(const MachineFunction &MF,
70 : unsigned &NumSGPR,
71 : unsigned &NumVGPR) const;
72 :
73 : /// Emit register usage information so that the GPU driver
74 : /// can correctly setup the GPU state.
75 : void EmitProgramInfoSI(const MachineFunction &MF,
76 : const SIProgramInfo &KernelInfo);
77 : void EmitPALMetadata(const MachineFunction &MF,
78 : const SIProgramInfo &KernelInfo);
79 : void emitCommonFunctionComments(uint32_t NumVGPR,
80 : uint32_t NumSGPR,
81 : uint64_t ScratchSize,
82 : uint64_t CodeSize,
83 : const AMDGPUMachineFunction* MFI);
84 :
85 : uint16_t getAmdhsaKernelCodeProperties(
86 : const MachineFunction &MF) const;
87 :
88 : amdhsa::kernel_descriptor_t getAmdhsaKernelDescriptor(
89 : const MachineFunction &MF,
90 : const SIProgramInfo &PI) const;
91 :
92 : public:
93 : explicit AMDGPUAsmPrinter(TargetMachine &TM,
94 : std::unique_ptr<MCStreamer> Streamer);
95 :
96 : StringRef getPassName() const override;
97 :
98 : const MCSubtargetInfo* getSTI() const;
99 :
100 : AMDGPUTargetStreamer* getTargetStreamer() const;
101 :
102 : bool doFinalization(Module &M) override;
103 : bool runOnMachineFunction(MachineFunction &MF) override;
104 :
105 : /// Wrapper for MCInstLowering.lowerOperand() for the tblgen'erated
106 : /// pseudo lowering.
107 : bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const;
108 :
109 : /// Lower the specified LLVM Constant to an MCExpr.
110 : /// The AsmPrinter::lowerConstantof does not know how to lower
111 : /// addrspacecast, therefore they should be lowered by this function.
112 : const MCExpr *lowerConstant(const Constant *CV) override;
113 :
114 : /// tblgen'erated driver function for lowering simple MI->MC pseudo
115 : /// instructions.
116 : bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
117 : const MachineInstr *MI);
118 :
119 : /// Implemented in AMDGPUMCInstLower.cpp
120 : void EmitInstruction(const MachineInstr *MI) override;
121 :
122 : void EmitFunctionBodyStart() override;
123 :
124 : void EmitFunctionBodyEnd() override;
125 :
126 : void EmitFunctionEntryLabel() override;
127 :
128 : void EmitBasicBlockStart(const MachineBasicBlock &MBB) const override;
129 :
130 : void EmitGlobalVariable(const GlobalVariable *GV) override;
131 :
132 : void EmitStartOfAsmFile(Module &M) override;
133 :
134 : void EmitEndOfAsmFile(Module &M) override;
135 :
136 : bool isBlockOnlyReachableByFallthrough(
137 : const MachineBasicBlock *MBB) const override;
138 :
139 : bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
140 : unsigned AsmVariant, const char *ExtraCode,
141 : raw_ostream &O) override;
142 :
143 : protected:
144 : mutable std::vector<std::string> DisasmLines, HexLines;
145 : mutable size_t DisasmLineMaxLen;
146 : AMDGPUAS AMDGPUASI;
147 : };
148 :
149 : } // end namespace llvm
150 :
151 : #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H
|