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