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