slang_rs_export_func.h revision 0da0a7dc51c25943fe31d0bfccbdfee326a3199c
16315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#ifndef _SLANG_COMPILER_RS_EXPORT_FUNC_H
26315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#define _SLANG_COMPILER_RS_EXPORT_FUNC_H
3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <list>
5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string>
6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
76315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/ADT/StringRef.h"
86315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
90da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang#include "slang_rs_export_type.h"
100da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
110da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Changnamespace llvm {
120da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  class StructType;
130da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang}
140da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang {
166315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class FunctionDecl;
179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace clang
18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
210da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Changclass RSContext;
22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportFunc {
249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  friend class RSContext;
259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSContext *mContext;
289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mName;
290da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  RSExportRecordType *mParamPacketType;
309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
316315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  RSExportFunc(RSContext *Context, const llvm::StringRef &Name)
320da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    : mContext(Context),
330da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang      mName(Name.data(), Name.size()),
340da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang      mParamPacketType(NULL) {
359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static RSExportFunc *Create(RSContext *Context,
409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const clang::FunctionDecl *FD);
41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
420da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  typedef RSExportRecordType::const_field_iterator const_param_iterator;
43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_begin() const {
450da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    assert((mParamPacketType != NULL) &&
460da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang           "Get parameter from export function without parameter!");
470da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    return mParamPacketType->fields_begin();
489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_end() const {
500da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    assert((mParamPacketType != NULL) &&
510da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang           "Get parameter from export function without parameter!");
520da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    return mParamPacketType->fields_end();
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
550da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline const std::string &getName() const { return mName; }
560da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline RSContext *getRSContext() const { return mContext; }
57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
580da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline bool hasParam() const
590da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return (mParamPacketType && !mParamPacketType->getFields().empty()); }
600da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline size_t getNumParameters() const
610da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return ((mParamPacketType) ? mParamPacketType->getFields().size() : 0); }
62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
630da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline const RSExportRecordType *getParamPacketType() const
640da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return mParamPacketType; }
65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
660da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // Check whether the given ParamsPacket type (in LLVM type) is "size
670da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // equivalent" to the one obtained from getParamPacketType(). If the @Params
680da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // is NULL, means there must be no any parameters.
690da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  bool checkParameterPacketType(const llvm::StructType *ParamTy) const;
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};  // RSExportFunc
71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
720da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
756315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#endif  // _SLANG_COMPILER_RS_EXPORT_FUNC_H
76