slang_rs_export_func.h revision e639eb5caa2c386b4a60659a4929e8a6141a2cbe
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
250da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang#include "slang_rs_export_type.h"
26e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_rs_exportable.h"
270da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
280da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Changnamespace llvm {
290da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  class StructType;
300da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang}
310da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang {
336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class FunctionDecl;
349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace clang
35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
37462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
380da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Changclass RSContext;
39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
40a41ce1d98094da84643995d40d71c529905123fcZonr Changclass RSExportFunc : public RSExportable {
419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  friend class RSContext;
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mName;
450da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  RSExportRecordType *mParamPacketType;
469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
476315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  RSExportFunc(RSContext *Context, const llvm::StringRef &Name)
48a41ce1d98094da84643995d40d71c529905123fcZonr Chang    : RSExportable(Context, RSExportable::EX_FUNC),
490da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang      mName(Name.data(), Name.size()),
500da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang      mParamPacketType(NULL) {
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static RSExportFunc *Create(RSContext *Context,
569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const clang::FunctionDecl *FD);
57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
580da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  typedef RSExportRecordType::const_field_iterator const_param_iterator;
59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_begin() const {
610da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    assert((mParamPacketType != NULL) &&
623a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang           "Get parameter from export function having no parameter!");
630da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    return mParamPacketType->fields_begin();
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_end() const {
660da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    assert((mParamPacketType != NULL) &&
673a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang           "Get parameter from export function having no parameter!");
680da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    return mParamPacketType->fields_end();
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
70462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
710da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline const std::string &getName() const { return mName; }
72462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
730da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline bool hasParam() const
740da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return (mParamPacketType && !mParamPacketType->getFields().empty()); }
750da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline size_t getNumParameters() const
760da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return ((mParamPacketType) ? mParamPacketType->getFields().size() : 0); }
77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
780da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline const RSExportRecordType *getParamPacketType() const
790da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return mParamPacketType; }
80462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
810da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // Check whether the given ParamsPacket type (in LLVM type) is "size
820da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // equivalent" to the one obtained from getParamPacketType(). If the @Params
830da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // is NULL, means there must be no any parameters.
840da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  bool checkParameterPacketType(const llvm::StructType *ParamTy) const;
859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};  // RSExportFunc
86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
870da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
90e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FUNC_H_  NOLINT
91