119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===- PTXParamManager.h - Manager for .param variables ----------*- C++ -*-==// 219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// The LLVM Compiler Infrastructure 419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source 619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details. 719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file defines the PTXParamManager class, which manages all defined .param 1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// variables for a particular function. 1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#ifndef PTX_PARAM_MANAGER_H 1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define PTX_PARAM_MANAGER_H 1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/DenseMap.h" 1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/SmallVector.h" 2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace llvm { 2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// PTXParamManager - This class manages all .param variables defined for a 2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// particular function. 2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass PTXParamManager { 2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanprivate: 2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// PTXParamType - Type of a .param variable 2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman enum PTXParamType { 3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_PARAM_TYPE_ARGUMENT, 3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_PARAM_TYPE_RETURN, 3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTX_PARAM_TYPE_LOCAL 3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman }; 3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// PTXParam - Definition of a PTX .param variable 3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman struct PTXParam { 3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTXParamType Type; 3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Size; 3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman std::string Name; 4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman }; 4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman DenseMap<unsigned, PTXParam> AllParams; 4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallVector<unsigned, 4> ArgumentParams; 4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallVector<unsigned, 4> ReturnParams; 4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallVector<unsigned, 4> LocalParams; 4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic: 4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman typedef SmallVector<unsigned, 4>::const_iterator param_iterator; 5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTXParamManager(); 5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman param_iterator arg_begin() const { return ArgumentParams.begin(); } 5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman param_iterator arg_end() const { return ArgumentParams.end(); } 5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman param_iterator ret_begin() const { return ReturnParams.begin(); } 5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman param_iterator ret_end() const { return ReturnParams.end(); } 5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman param_iterator local_begin() const { return LocalParams.begin(); } 5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman param_iterator local_end() const { return LocalParams.end(); } 5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// addArgumentParam - Returns a new .param used as an argument. 6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned addArgumentParam(unsigned Size); 6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// addReturnParam - Returns a new .param used as a return argument. 6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned addReturnParam(unsigned Size); 6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// addLocalParam - Returns a new .param used as a local .param variable. 6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned addLocalParam(unsigned Size); 6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// getParamName - Returns the name of the parameter as a string. 7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const std::string &getParamName(unsigned Param) const { 7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(AllParams.count(Param) == 1 && "Param has not been defined!"); 7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return AllParams.find(Param)->second.Name; 7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// getParamSize - Returns the size of the parameter in bits. 7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned getParamSize(unsigned Param) const { 7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(AllParams.count(Param) == 1 && "Param has not been defined!"); 7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return AllParams.find(Param)->second.Size; 7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}; 8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#endif 8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 87