slang_rs_export_func.h revision 6e6578a360497f78a181e63d7783422a9c9bfb15
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/*
2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project
3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License.
6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at
7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software
11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and
14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License.
15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */
16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang
17e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FUNC_H_  // NOLINT
18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FUNC_H_
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <list>
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string>
22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
236315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/ADT/StringRef.h"
246315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
256e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h"
260da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang#include "slang_rs_export_type.h"
27e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_rs_exportable.h"
280da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
290da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Changnamespace llvm {
300da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  class StructType;
310da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang}
320da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang {
346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class FunctionDecl;
359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace clang
36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
37462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
390da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Changclass RSContext;
40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
41a41ce1d98094da84643995d40d71c529905123fcZonr Changclass RSExportFunc : public RSExportable {
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  friend class RSContext;
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mName;
460da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  RSExportRecordType *mParamPacketType;
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
486315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  RSExportFunc(RSContext *Context, const llvm::StringRef &Name)
49a41ce1d98094da84643995d40d71c529905123fcZonr Chang    : RSExportable(Context, RSExportable::EX_FUNC),
500da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang      mName(Name.data(), Name.size()),
510da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang      mParamPacketType(NULL) {
529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static RSExportFunc *Create(RSContext *Context,
579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const clang::FunctionDecl *FD);
58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
590da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  typedef RSExportRecordType::const_field_iterator const_param_iterator;
60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_begin() const {
626e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines    slangAssert((mParamPacketType != NULL) &&
636e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines                "Get parameter from export function having no parameter!");
640da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    return mParamPacketType->fields_begin();
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_end() const {
676e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines    slangAssert((mParamPacketType != NULL) &&
686e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines                "Get parameter from export function having no parameter!");
690da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    return mParamPacketType->fields_end();
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
720da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline const std::string &getName() const { return mName; }
73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
740da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline bool hasParam() const
750da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return (mParamPacketType && !mParamPacketType->getFields().empty()); }
760da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline size_t getNumParameters() const
770da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return ((mParamPacketType) ? mParamPacketType->getFields().size() : 0); }
78462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
790da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline const RSExportRecordType *getParamPacketType() const
800da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return mParamPacketType; }
81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
820da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // Check whether the given ParamsPacket type (in LLVM type) is "size
830da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // equivalent" to the one obtained from getParamPacketType(). If the @Params
840da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // is NULL, means there must be no any parameters.
850da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  bool checkParameterPacketType(const llvm::StructType *ParamTy) const;
869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};  // RSExportFunc
87462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
880da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
91e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FUNC_H_  NOLINT
92