================ @@ -0,0 +1,225 @@ +//===- AMDGPUMCResourceInfo.cpp --- MC Resource Info ----------------------===// +// +// 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 +/// \brief MC infrastructure to propagate the function level resource usage +/// info. +/// +//===----------------------------------------------------------------------===// + +#include "AMDGPUMCResourceInfo.h" +#include "Utils/AMDGPUBaseInfo.h" +#include "llvm/ADT/SmallSet.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/MC/MCContext.h" +#include "llvm/MC/MCSymbol.h" + +using namespace llvm; + +MCSymbol *MCResourceInfo::getSymbol(StringRef FuncName, ResourceInfoKind RIK, + MCContext &OutContext) { + auto GOCS = [this, FuncName, &OutContext](StringRef Suffix) { + return OutContext.getOrCreateSymbol(FuncName + Twine(Suffix)); + }; + switch (RIK) { + case RIK_NumVGPR: + return GOCS(".num_vgpr"); + case RIK_NumAGPR: + return GOCS(".num_agpr"); + case RIK_NumSGPR: + return GOCS(".numbered_sgpr"); + case RIK_PrivateSegSize: + return GOCS(".private_seg_size"); + case RIK_UsesVCC: + return GOCS(".uses_vcc"); + case RIK_UsesFlatScratch: + return GOCS(".uses_flat_scratch"); + case RIK_HasDynSizedStack: + return GOCS(".has_dyn_sized_stack"); + case RIK_HasRecursion: + return GOCS(".has_recursion"); + case RIK_HasIndirectCall: + return GOCS(".has_indirect_call"); + } + llvm_unreachable("Unexpected ResourceInfoKind."); +} + +const MCExpr *MCResourceInfo::getSymRefExpr(StringRef FuncName, + ResourceInfoKind RIK, + MCContext &Ctx) { + return MCSymbolRefExpr::create(getSymbol(FuncName, RIK, Ctx), Ctx); +} + +void MCResourceInfo::assignMaxRegs(MCContext &OutContext) { + // Assign expression to get the max register use to the max_num_Xgpr symbol. + MCSymbol *MaxVGPRSym = getMaxVGPRSymbol(OutContext); + MCSymbol *MaxAGPRSym = getMaxAGPRSymbol(OutContext); + MCSymbol *MaxSGPRSym = getMaxSGPRSymbol(OutContext); + + auto assignMaxRegSym = [this, &OutContext](MCSymbol *Sym, int32_t RegCount) { + const MCExpr *MaxExpr = MCConstantExpr::create(RegCount, OutContext); + Sym->setVariableValue(MaxExpr); + }; + + assignMaxRegSym(MaxVGPRSym, MaxVGPR); + assignMaxRegSym(MaxAGPRSym, MaxAGPR); + assignMaxRegSym(MaxSGPRSym, MaxSGPR); +} + +void MCResourceInfo::finalize(MCContext &OutContext) { + assert(!Finalized && "Cannot finalize ResourceInfo again."); + Finalized = true; + assignMaxRegs(OutContext); +} + +MCSymbol *MCResourceInfo::getMaxVGPRSymbol(MCContext &OutContext) { + return OutContext.getOrCreateSymbol("max_num_vgpr"); +} + +MCSymbol *MCResourceInfo::getMaxAGPRSymbol(MCContext &OutContext) { + return OutContext.getOrCreateSymbol("max_num_agpr"); +} + +MCSymbol *MCResourceInfo::getMaxSGPRSymbol(MCContext &OutContext) { + return OutContext.getOrCreateSymbol("max_num_sgpr"); +} ---------------- JanekvO wrote:
I've put these in their own section for now, albeit without any module-unique identifiers (`.AMDGPU.gpr_maximums`). https://github.com/llvm/llvm-project/pull/102913 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits