1//===- PTXParamManager.h - Manager for .param variables ----------*- C++ -*-==//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the PTXParamManager class, which manages all defined .param
11// variables for a particular function.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef PTX_PARAM_MANAGER_H
16#define PTX_PARAM_MANAGER_H
17
18#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/SmallVector.h"
20
21namespace llvm {
22
23/// PTXParamManager - This class manages all .param variables defined for a
24/// particular function.
25class PTXParamManager {
26private:
27
28  /// PTXParamType - Type of a .param variable
29  enum PTXParamType {
30    PTX_PARAM_TYPE_ARGUMENT,
31    PTX_PARAM_TYPE_RETURN,
32    PTX_PARAM_TYPE_LOCAL
33  };
34
35  /// PTXParam - Definition of a PTX .param variable
36  struct PTXParam {
37    PTXParamType  Type;
38    unsigned      Size;
39    std::string   Name;
40  };
41
42  DenseMap<unsigned, PTXParam> AllParams;
43  SmallVector<unsigned, 4> ArgumentParams;
44  SmallVector<unsigned, 4> ReturnParams;
45  SmallVector<unsigned, 4> LocalParams;
46
47public:
48
49  typedef SmallVector<unsigned, 4>::const_iterator param_iterator;
50
51  PTXParamManager();
52
53  param_iterator arg_begin() const { return ArgumentParams.begin(); }
54  param_iterator arg_end() const { return ArgumentParams.end(); }
55  param_iterator ret_begin() const { return ReturnParams.begin(); }
56  param_iterator ret_end() const { return ReturnParams.end(); }
57  param_iterator local_begin() const { return LocalParams.begin(); }
58  param_iterator local_end() const { return LocalParams.end(); }
59
60  /// addArgumentParam - Returns a new .param used as an argument.
61  unsigned addArgumentParam(unsigned Size);
62
63  /// addReturnParam - Returns a new .param used as a return argument.
64  unsigned addReturnParam(unsigned Size);
65
66  /// addLocalParam - Returns a new .param used as a local .param variable.
67  unsigned addLocalParam(unsigned Size);
68
69  /// getParamName - Returns the name of the parameter as a string.
70  const std::string &getParamName(unsigned Param) const {
71    assert(AllParams.count(Param) == 1 && "Param has not been defined!");
72    return AllParams.find(Param)->second.Name;
73  }
74
75  /// getParamSize - Returns the size of the parameter in bits.
76  unsigned getParamSize(unsigned Param) const {
77    assert(AllParams.count(Param) == 1 && "Param has not been defined!");
78    return AllParams.find(Param)->second.Size;
79  }
80
81};
82
83}
84
85#endif
86
87