slang_rs_export_func.h revision 9ef2f785e0cc490af678dfd685995dec787321ff
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#ifndef _SLANG_COMPILER_RS_EXPORT_FUNC_HPP
2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#   define _SLANG_COMPILER_RS_EXPORT_FUNC_HPP
3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
49ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringRef.h"
5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <list>
7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string>
8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang {
109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclass FunctionDecl;
119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace clang
12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSContext;
16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportType;
17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportRecordType;
18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportFunc {
209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  friend class RSContext;
219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  class Parameter {
239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao   private:
249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    RSExportType *mType;
25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    std::string mName;
26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao   public:
289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    Parameter(RSExportType *T, const llvm::StringRef &Name) :
299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mType(T),
309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mName(Name.data(), Name.size())
31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    {
329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return;
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline const RSExportType *getType() const { return mType; }
369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline const std::string &getName() const { return mName; }
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  };
389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSContext *mContext;
419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mName;
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::list<const Parameter*> mParams;
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mutable RSExportRecordType *mParamPacketType;
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportFunc(RSContext *Context, const llvm::StringRef &Name) :
469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mContext(Context),
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mName(Name.data(), Name.size()),
489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mParamPacketType(NULL)
499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  {
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static RSExportFunc *Create(RSContext *Context,
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const clang::FunctionDecl *FD);
56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef std::list<const Parameter*>::const_iterator const_param_iterator;
58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_begin() const {
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return this->mParams.begin();
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_end() const {
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return this->mParams.end();
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const std::string &getName() const {
679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mName;
689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline RSContext *getRSContext() const {
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mContext;
719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
72462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasParam() const {
749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return !mParams.empty();
759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline int getNumParameters() const {
779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mParams.size();
789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const RSExportRecordType *getParamPacketType() const;
81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ~RSExportFunc();
83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};  // RSExportFunc
85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
88462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#endif  // _SLANG_COMPILER_RS_EXPORT_FUNC_HPP
90