blob: 9fd2de52f7f249db5cfac98413100f2af9e9b6c6 [file] [log] [blame]
Justin Holewinski27f08fc2011-09-23 14:18:22 +00001//===- 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"
Justin Holewinskia5745562011-09-23 17:59:11 +000019#include "llvm/ADT/SmallVector.h"
Justin Holewinski27f08fc2011-09-23 14:18:22 +000020
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;
Justin Holewinskia5745562011-09-23 17:59:11 +000043 SmallVector<unsigned, 4> ArgumentParams;
44 SmallVector<unsigned, 4> ReturnParams;
45 SmallVector<unsigned, 4> LocalParams;
Justin Holewinski27f08fc2011-09-23 14:18:22 +000046
47public:
48
Justin Holewinskia5745562011-09-23 17:59:11 +000049 typedef SmallVector<unsigned, 4>::const_iterator param_iterator;
Justin Holewinski27f08fc2011-09-23 14:18:22 +000050
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.
Benjamin Kramer8adae0c2011-09-28 04:08:02 +000070 const std::string &getParamName(unsigned Param) const {
Justin Holewinski27f08fc2011-09-23 14:18:22 +000071 assert(AllParams.count(Param) == 1 && "Param has not been defined!");
Benjamin Kramer8adae0c2011-09-28 04:08:02 +000072 return AllParams.find(Param)->second.Name;
Justin Holewinski27f08fc2011-09-23 14:18:22 +000073 }
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!");
Benjamin Kramer8adae0c2011-09-28 04:08:02 +000078 return AllParams.find(Param)->second.Size;
Justin Holewinski27f08fc2011-09-23 14:18:22 +000079 }
80
81};
82
83}
84
85#endif
86