slang_rs_export_func.h revision a41ce1d98094da84643995d40d71c529905123fc
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) && 480da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang "Get parameter from export function without 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) && 530da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang "Get parameter from export function without 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