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