slang_rs_export_func.h revision 5abbe0e9ca2508260b627ffef2bf01e2554e8357
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),
595abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes      mParamPacketType(nullptr) {
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    }
689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static RSExportFunc *Create(RSContext *Context,
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const clang::FunctionDecl *FD);
73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
740da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  typedef RSExportRecordType::const_field_iterator const_param_iterator;
75462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_begin() const {
775abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes    slangAssert((mParamPacketType != nullptr) &&
786e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines                "Get parameter from export function having no parameter!");
790da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    return mParamPacketType->fields_begin();
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_end() const {
825abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes    slangAssert((mParamPacketType != nullptr) &&
836e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines                "Get parameter from export function having no parameter!");
840da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    return mParamPacketType->fields_end();
859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
87f2174cfd6a556b51aadf2b8765e50df080e8f18eStephen Hines  inline const std::string &getName(bool mangle = true) const {
883fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao    return (mShouldMangle && mangle) ? mMangledName : mName;
893fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao  }
90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
910da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline bool hasParam() const
920da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return (mParamPacketType && !mParamPacketType->getFields().empty()); }
930da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline size_t getNumParameters() const
940da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return ((mParamPacketType) ? mParamPacketType->getFields().size() : 0); }
95462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
960da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  inline const RSExportRecordType *getParamPacketType() const
970da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    { return mParamPacketType; }
98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
990da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // Check whether the given ParamsPacket type (in LLVM type) is "size
1000da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  // equivalent" to the one obtained from getParamPacketType(). If the @Params
1015abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes  // is nullptr, means there must be no any parameters.
102ab992e59a36a18df49bf4878968ef0598299afd3Logan Chien  bool checkParameterPacketType(llvm::StructType *ParamTy) const;
1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};  // RSExportFunc
104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1050da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang
1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
108e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FUNC_H_  NOLINT
109