slang_rs_export_func.h revision 3fa286b4c2f110c6be2bbfac9c715bb1ec880338
1be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root/* 2be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Copyright 2010, The Android Open Source Project 3be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 4be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 5be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * you may not use this file except in compliance with the License. 6be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * You may obtain a copy of the License at 7be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 8be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * http://www.apache.org/licenses/LICENSE-2.0 9be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 10be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Unless required by applicable law or agreed to in writing, software 11be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * distributed under the License is distributed on an "AS IS" BASIS, 12be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * See the License for the specific language governing permissions and 14be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * limitations under the License. 15be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 16be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 17be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FUNC_H_ // NOLINT 18be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FUNC_H_ 19be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 20be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#include <list> 21be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#include <string> 22be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 23be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#include "llvm/ADT/StringRef.h" 24be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 25be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#include "slang_assert.h" 26be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#include "slang_rs_export_type.h" 27be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#include "slang_rs_exportable.h" 28be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 29be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootnamespace llvm { 30be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root class StructType; 31be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root} 32be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 33be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootnamespace clang { 34be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root class FunctionDecl; 35be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root} // namespace clang 36be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 37be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootnamespace slang { 38be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 39be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootclass RSContext; 40be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 41be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootclass RSExportFunc : public RSExportable { 42be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root friend class RSContext; 43be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 44be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root private: 45be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root std::string mName; 46 std::string mMangledName; 47 bool mShouldMangle; 48 RSExportRecordType *mParamPacketType; 49 50 RSExportFunc(RSContext *Context, const llvm::StringRef &Name, 51 const clang::FunctionDecl *FD) 52 : RSExportable(Context, RSExportable::EX_FUNC), 53 mName(Name.data(), Name.size()), 54 mMangledName(), 55 mShouldMangle(false), 56 mParamPacketType(NULL) { 57 58 mShouldMangle = Context->getMangleContext().shouldMangleDeclName(FD); 59 60 if (mShouldMangle) { 61 llvm::SmallString<256> Buffer; 62 Context->getMangleContext().mangleName(FD, Buffer); 63 64 mMangledName = Buffer.str(); 65 } 66 67 return; 68 } 69 70 public: 71 static RSExportFunc *Create(RSContext *Context, 72 const clang::FunctionDecl *FD); 73 74 typedef RSExportRecordType::const_field_iterator const_param_iterator; 75 76 inline const_param_iterator params_begin() const { 77 slangAssert((mParamPacketType != NULL) && 78 "Get parameter from export function having no parameter!"); 79 return mParamPacketType->fields_begin(); 80 } 81 inline const_param_iterator params_end() const { 82 slangAssert((mParamPacketType != NULL) && 83 "Get parameter from export function having no parameter!"); 84 return mParamPacketType->fields_end(); 85 } 86 87 inline const std::string &getName(bool mangle=true) const { 88 return (mShouldMangle && mangle) ? mMangledName : mName; 89 } 90 91 inline bool hasParam() const 92 { return (mParamPacketType && !mParamPacketType->getFields().empty()); } 93 inline size_t getNumParameters() const 94 { return ((mParamPacketType) ? mParamPacketType->getFields().size() : 0); } 95 96 inline const RSExportRecordType *getParamPacketType() const 97 { return mParamPacketType; } 98 99 // Check whether the given ParamsPacket type (in LLVM type) is "size 100 // equivalent" to the one obtained from getParamPacketType(). If the @Params 101 // is NULL, means there must be no any parameters. 102 bool checkParameterPacketType(const llvm::StructType *ParamTy) const; 103}; // RSExportFunc 104 105 106} // namespace slang 107 108#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FUNC_H_ NOLINT 109