slang_rs_export_func.h revision 3a9ca1f0d6bd8f12c2bb2adea51f95c255996180
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
9a41ce1d98094da84643995d40d71c529905123fcZonr Chang#include "slang_rs_exportable.h"
100da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang#include "slang_rs_export_type.h"
110da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
120da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Changnamespace llvm {
130da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  class StructType;
140da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang}
150da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang {
176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class FunctionDecl;
189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace clang
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
220da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Changclass RSContext;
23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
24a41ce1d98094da84643995d40d71c529905123fcZonr Changclass RSExportFunc : public RSExportable {
259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  friend class RSContext;
269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSContext *mContext;
299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mName;
300da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  RSExportRecordType *mParamPacketType;
319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
326315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  RSExportFunc(RSContext *Context, const llvm::StringRef &Name)
33a41ce1d98094da84643995d40d71c529905123fcZonr Chang    : RSExportable(Context, RSExportable::EX_FUNC),
34a41ce1d98094da84643995d40d71c529905123fcZonr Chang      mContext(Context),
350da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang      mName(Name.data(), Name.size()),
360da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang      mParamPacketType(NULL) {
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static RSExportFunc *Create(RSContext *Context,
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const clang::FunctionDecl *FD);
43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
440da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  typedef RSExportRecordType::const_field_iterator const_param_iterator;
45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_begin() const {
470da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    assert((mParamPacketType != NULL) &&
483a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang           "Get parameter from export function having no parameter!");
490da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    return mParamPacketType->fields_begin();
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_end() const {
520da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    assert((mParamPacketType != NULL) &&
533a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang           "Get parameter from export function having no parameter!");
540da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    return mParamPacketType->fields_end();
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
570da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline const std::string &getName() const { return mName; }
580da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline RSContext *getRSContext() const { return mContext; }
59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
600da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline bool hasParam() const
610da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return (mParamPacketType && !mParamPacketType->getFields().empty()); }
620da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline size_t getNumParameters() const
630da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return ((mParamPacketType) ? mParamPacketType->getFields().size() : 0); }
64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
650da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline const RSExportRecordType *getParamPacketType() const
660da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return mParamPacketType; }
67462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
680da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // Check whether the given ParamsPacket type (in LLVM type) is "size
690da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // equivalent" to the one obtained from getParamPacketType(). If the @Params
700da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // is NULL, means there must be no any parameters.
710da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  bool checkParameterPacketType(const llvm::StructType *ParamTy) const;
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};  // RSExportFunc
73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
740da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
76462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
776315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#endif  // _SLANG_COMPILER_RS_EXPORT_FUNC_H
78