• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2011-2012, The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FOREACH_H_  // NOLINT
18 #define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FOREACH_H_
19 
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/Support/raw_ostream.h"
22 
23 #include "clang/AST/Decl.h"
24 
25 #include "slang_assert.h"
26 #include "slang_rs_context.h"
27 #include "slang_rs_exportable.h"
28 #include "slang_rs_export_type.h"
29 
30 namespace clang {
31   class FunctionDecl;
32 }  // namespace clang
33 
34 namespace slang {
35 
36 // Base class for reflecting control-side forEach (currently for root()
37 // functions that fit appropriate criteria)
38 class RSExportForEach : public RSExportable {
39  private:
40   std::string mName;
41   RSExportRecordType *mParamPacketType;
42   RSExportType *mInType;
43   RSExportType *mOutType;
44   size_t numParams;
45 
46   unsigned int mSignatureMetadata;
47 
48   const clang::ParmVarDecl *mIn;
49   const clang::ParmVarDecl *mOut;
50   const clang::ParmVarDecl *mUsrData;
51   const clang::ParmVarDecl *mX;
52   const clang::ParmVarDecl *mY;
53   const clang::ParmVarDecl *mZ;
54   const clang::ParmVarDecl *mAr;
55 
56   bool mDummyRoot;
57 
58   // TODO(all): Add support for LOD/face when we have them
RSExportForEach(RSContext * Context,const llvm::StringRef & Name)59   RSExportForEach(RSContext *Context, const llvm::StringRef &Name)
60     : RSExportable(Context, RSExportable::EX_FOREACH),
61       mName(Name.data(), Name.size()), mParamPacketType(NULL), mInType(NULL),
62       mOutType(NULL), numParams(0), mSignatureMetadata(0),
63       mIn(NULL), mOut(NULL), mUsrData(NULL),
64       mX(NULL), mY(NULL), mZ(NULL), mAr(NULL), mDummyRoot(false) {
65     return;
66   }
67 
68   bool validateAndConstructParams(RSContext *Context,
69                                   const clang::FunctionDecl *FD);
70 
71  public:
72   static RSExportForEach *Create(RSContext *Context,
73                                  const clang::FunctionDecl *FD);
74 
75   static RSExportForEach *CreateDummyRoot(RSContext *Context);
76 
getName()77   inline const std::string &getName() const {
78     return mName;
79   }
80 
getNumParameters()81   inline size_t getNumParameters() const {
82     return numParams;
83   }
84 
hasIn()85   inline bool hasIn() const {
86     return (mIn != NULL);
87   }
88 
hasOut()89   inline bool hasOut() const {
90     return (mOut != NULL);
91   }
92 
hasUsrData()93   inline bool hasUsrData() const {
94     return (mUsrData != NULL);
95   }
96 
getInType()97   inline const RSExportType *getInType() const {
98     return mInType;
99   }
100 
getOutType()101   inline const RSExportType *getOutType() const {
102     return mOutType;
103   }
104 
getParamPacketType()105   inline const RSExportRecordType *getParamPacketType() const {
106     return mParamPacketType;
107   }
108 
getSignatureMetadata()109   inline unsigned int getSignatureMetadata() const {
110     return mSignatureMetadata;
111   }
112 
isDummyRoot()113   inline bool isDummyRoot() const {
114     return mDummyRoot;
115   }
116 
117   typedef RSExportRecordType::const_field_iterator const_param_iterator;
118 
params_begin()119   inline const_param_iterator params_begin() const {
120     slangAssert((mParamPacketType != NULL) &&
121                 "Get parameter from export foreach having no parameter!");
122     return mParamPacketType->fields_begin();
123   }
124 
params_end()125   inline const_param_iterator params_end() const {
126     slangAssert((mParamPacketType != NULL) &&
127                 "Get parameter from export foreach having no parameter!");
128     return mParamPacketType->fields_end();
129   }
130 
isInitRSFunc(const clang::FunctionDecl * FD)131   inline static bool isInitRSFunc(const clang::FunctionDecl *FD) {
132     if (!FD) {
133       return false;
134     }
135     const llvm::StringRef Name = FD->getName();
136     static llvm::StringRef FuncInit("init");
137     return Name.equals(FuncInit);
138   }
139 
isRootRSFunc(const clang::FunctionDecl * FD)140   inline static bool isRootRSFunc(const clang::FunctionDecl *FD) {
141     if (!FD) {
142       return false;
143     }
144     const llvm::StringRef Name = FD->getName();
145     static llvm::StringRef FuncRoot("root");
146     return Name.equals(FuncRoot);
147   }
148 
isDtorRSFunc(const clang::FunctionDecl * FD)149   inline static bool isDtorRSFunc(const clang::FunctionDecl *FD) {
150     if (!FD) {
151       return false;
152     }
153     const llvm::StringRef Name = FD->getName();
154     static llvm::StringRef FuncDtor(".rs.dtor");
155     return Name.equals(FuncDtor);
156   }
157 
158   static bool isGraphicsRootRSFunc(int targetAPI,
159                                    const clang::FunctionDecl *FD);
160 
161   static bool isRSForEachFunc(int targetAPI, const clang::FunctionDecl *FD);
162 
isSpecialRSFunc(int targetAPI,const clang::FunctionDecl * FD)163   inline static bool isSpecialRSFunc(int targetAPI,
164                                      const clang::FunctionDecl *FD) {
165     return isGraphicsRootRSFunc(targetAPI, FD) || isInitRSFunc(FD) ||
166            isDtorRSFunc(FD);
167   }
168 
169   static bool validateSpecialFuncDecl(int targetAPI,
170                                       clang::DiagnosticsEngine *DiagEngine,
171                                       const clang::FunctionDecl *FD);
172 };  // RSExportForEach
173 
174 }  // namespace slang
175 
176 #endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FOREACH_H_  NOLINT
177