xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTUtils.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===- AMDGPUKernelCodeTUtils.h - helpers for amd_kernel_code_t -*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric /// \file AMDKernelCodeTUtils.h
10*0fca6ea1SDimitry Andric /// MC layer struct for AMDGPUMCKernelCodeT, provides MCExpr functionality where
11*0fca6ea1SDimitry Andric /// required.
12*0fca6ea1SDimitry Andric ///
130b57cec5SDimitry Andric //
140b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
150b57cec5SDimitry Andric 
16*0fca6ea1SDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUMCKERNELCODET_H
17*0fca6ea1SDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUMCKERNELCODET_H
180b57cec5SDimitry Andric 
19*0fca6ea1SDimitry Andric #include "AMDKernelCodeT.h"
20*0fca6ea1SDimitry Andric #include "llvm/ADT/ArrayRef.h"
21*0fca6ea1SDimitry Andric #include "llvm/ADT/StringRef.h"
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric namespace llvm {
240b57cec5SDimitry Andric class MCAsmParser;
25*0fca6ea1SDimitry Andric class MCContext;
26*0fca6ea1SDimitry Andric class MCExpr;
27*0fca6ea1SDimitry Andric class MCStreamer;
28*0fca6ea1SDimitry Andric class MCSubtargetInfo;
290b57cec5SDimitry Andric class raw_ostream;
30*0fca6ea1SDimitry Andric namespace AMDGPU {
310b57cec5SDimitry Andric 
32*0fca6ea1SDimitry Andric struct AMDGPUMCKernelCodeT {
33*0fca6ea1SDimitry Andric   AMDGPUMCKernelCodeT() = default;
340b57cec5SDimitry Andric 
35*0fca6ea1SDimitry Andric   // Names of most (if not all) members should match the ones used for table
36*0fca6ea1SDimitry Andric   // driven (array) generation in AMDKernelCodeTInfo.h.
37*0fca6ea1SDimitry Andric   uint32_t amd_kernel_code_version_major = 0;
38*0fca6ea1SDimitry Andric   uint32_t amd_kernel_code_version_minor = 0;
39*0fca6ea1SDimitry Andric   uint16_t amd_machine_kind = 0;
40*0fca6ea1SDimitry Andric   uint16_t amd_machine_version_major = 0;
41*0fca6ea1SDimitry Andric   uint16_t amd_machine_version_minor = 0;
42*0fca6ea1SDimitry Andric   uint16_t amd_machine_version_stepping = 0;
43*0fca6ea1SDimitry Andric   int64_t kernel_code_entry_byte_offset = 0;
44*0fca6ea1SDimitry Andric   int64_t kernel_code_prefetch_byte_offset = 0;
45*0fca6ea1SDimitry Andric   uint64_t kernel_code_prefetch_byte_size = 0;
46*0fca6ea1SDimitry Andric   uint64_t reserved0 = 0;
47*0fca6ea1SDimitry Andric   uint64_t compute_pgm_resource_registers = 0;
48*0fca6ea1SDimitry Andric   uint32_t code_properties = 0;
49*0fca6ea1SDimitry Andric   uint32_t workgroup_group_segment_byte_size = 0;
50*0fca6ea1SDimitry Andric   uint32_t gds_segment_byte_size = 0;
51*0fca6ea1SDimitry Andric   uint64_t kernarg_segment_byte_size = 0;
52*0fca6ea1SDimitry Andric   uint32_t workgroup_fbarrier_count = 0;
53*0fca6ea1SDimitry Andric   uint16_t reserved_vgpr_first = 0;
54*0fca6ea1SDimitry Andric   uint16_t reserved_vgpr_count = 0;
55*0fca6ea1SDimitry Andric   uint16_t reserved_sgpr_first = 0;
56*0fca6ea1SDimitry Andric   uint16_t reserved_sgpr_count = 0;
57*0fca6ea1SDimitry Andric   uint16_t debug_wavefront_private_segment_offset_sgpr = 0;
58*0fca6ea1SDimitry Andric   uint16_t debug_private_segment_buffer_sgpr = 0;
59*0fca6ea1SDimitry Andric   uint8_t kernarg_segment_alignment = 0;
60*0fca6ea1SDimitry Andric   uint8_t group_segment_alignment = 0;
61*0fca6ea1SDimitry Andric   uint8_t private_segment_alignment = 0;
62*0fca6ea1SDimitry Andric   uint8_t wavefront_size = 0;
63*0fca6ea1SDimitry Andric   int32_t call_convention = 0;
64*0fca6ea1SDimitry Andric   uint8_t reserved3[12] = {0};
65*0fca6ea1SDimitry Andric   uint64_t runtime_loader_kernel_symbol = 0;
66*0fca6ea1SDimitry Andric   uint64_t control_directives[16] = {0};
670b57cec5SDimitry Andric 
68*0fca6ea1SDimitry Andric   const MCExpr *compute_pgm_resource1_registers = nullptr;
69*0fca6ea1SDimitry Andric   const MCExpr *compute_pgm_resource2_registers = nullptr;
700b57cec5SDimitry Andric 
71*0fca6ea1SDimitry Andric   const MCExpr *is_dynamic_callstack = nullptr;
72*0fca6ea1SDimitry Andric   const MCExpr *wavefront_sgpr_count = nullptr;
73*0fca6ea1SDimitry Andric   const MCExpr *workitem_vgpr_count = nullptr;
74*0fca6ea1SDimitry Andric   const MCExpr *workitem_private_segment_byte_size = nullptr;
75*0fca6ea1SDimitry Andric 
76*0fca6ea1SDimitry Andric   void initDefault(const MCSubtargetInfo *STI, MCContext &Ctx,
77*0fca6ea1SDimitry Andric                    bool InitMCExpr = true);
78*0fca6ea1SDimitry Andric   void validate(const MCSubtargetInfo *STI, MCContext &Ctx);
79*0fca6ea1SDimitry Andric 
80*0fca6ea1SDimitry Andric   const MCExpr *&getMCExprForIndex(int Index);
81*0fca6ea1SDimitry Andric 
82*0fca6ea1SDimitry Andric   bool ParseKernelCodeT(StringRef ID, MCAsmParser &MCParser, raw_ostream &Err);
83*0fca6ea1SDimitry Andric   void EmitKernelCodeT(raw_ostream &OS, MCContext &Ctx);
84*0fca6ea1SDimitry Andric   void EmitKernelCodeT(MCStreamer &OS, MCContext &Ctx);
85*0fca6ea1SDimitry Andric };
86*0fca6ea1SDimitry Andric 
87*0fca6ea1SDimitry Andric } // end namespace AMDGPU
880b57cec5SDimitry Andric } // end namespace llvm
890b57cec5SDimitry Andric 
90*0fca6ea1SDimitry Andric #endif // LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUMCKERNELCODET_H
91