slang_rs_export_func.h revision ab992e59a36a18df49bf4878968ef0598299afd3
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"
24be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/Support/raw_ostream.h"
25be27482cdeaf08576bc39b72a15d35d13014a636Logan
26be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "clang/AST/Decl.h"
276315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
286e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h"
290da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang#include "slang_rs_export_type.h"
30e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_rs_exportable.h"
310da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
320da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Changnamespace llvm {
330da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  class StructType;
340da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang}
350da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang {
376315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class FunctionDecl;
389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace clang
39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
420da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Changclass RSContext;
43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
44a41ce1d98094da84643995d40d71c529905123fcZonr Changclass RSExportFunc : public RSExportable {
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  friend class RSContext;
469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mName;
493fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao  std::string mMangledName;
503fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao  bool mShouldMangle;
510da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  RSExportRecordType *mParamPacketType;
529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
533fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao  RSExportFunc(RSContext *Context, const llvm::StringRef &Name,
543fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao               const clang::FunctionDecl *FD)
55a41ce1d98094da84643995d40d71c529905123fcZonr Chang    : RSExportable(Context, RSExportable::EX_FUNC),
560da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang      mName(Name.data(), Name.size()),
573fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao      mMangledName(),
583fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao      mShouldMangle(false),
590da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang      mParamPacketType(NULL) {
603fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao
613fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao    mShouldMangle = Context->getMangleContext().shouldMangleDeclName(FD);
623fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao
633fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao    if (mShouldMangle) {
64be27482cdeaf08576bc39b72a15d35d13014a636Logan      llvm::raw_string_ostream BufStm(mMangledName);
65be27482cdeaf08576bc39b72a15d35d13014a636Logan      Context->getMangleContext().mangleName(FD, BufStm);
66be27482cdeaf08576bc39b72a15d35d13014a636Logan      BufStm.flush();
673fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao    }
683fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static RSExportFunc *Create(RSContext *Context,
749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const clang::FunctionDecl *FD);
75462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
760da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  typedef RSExportRecordType::const_field_iterator const_param_iterator;
77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_begin() const {
796e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines    slangAssert((mParamPacketType != NULL) &&
806e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines                "Get parameter from export function having no parameter!");
810da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    return mParamPacketType->fields_begin();
829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_end() const {
846e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines    slangAssert((mParamPacketType != NULL) &&
856e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines                "Get parameter from export function having no parameter!");
860da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    return mParamPacketType->fields_end();
879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
88462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
89f2174cfd6a556b51aadf2b8765e50df080e8f18eStephen Hines  inline const std::string &getName(bool mangle = true) const {
903fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao    return (mShouldMangle && mangle) ? mMangledName : mName;
913fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao  }
92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
930da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline bool hasParam() const
940da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return (mParamPacketType && !mParamPacketType->getFields().empty()); }
950da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline size_t getNumParameters() const
960da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return ((mParamPacketType) ? mParamPacketType->getFields().size() : 0); }
97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
980da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline const RSExportRecordType *getParamPacketType() const
990da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return mParamPacketType; }
100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1010da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // Check whether the given ParamsPacket type (in LLVM type) is "size
1020da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // equivalent" to the one obtained from getParamPacketType(). If the @Params
1030da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // is NULL, means there must be no any parameters.
104ab992e59a36a18df49bf4878968ef0598299afd3Logan Chien  bool checkParameterPacketType(llvm::StructType *ParamTy) const;
1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};  // RSExportFunc
106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1070da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
110e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FUNC_H_  NOLINT
111