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