• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2010-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 BCC_SCRIPTCACHED_H
18 #define BCC_SCRIPTCACHED_H
19 
20 #include "Config.h"
21 
22 #include <bcc/bcc.h>
23 #include <bcc/bcc_mccache.h>
24 #include "bcc_internal.h"
25 
26 #include "librsloader.h"
27 
28 #include <llvm/ADT/SmallVector.h>
29 
30 #include <map>
31 #include <string>
32 #include <utility>
33 #include <vector>
34 
35 #include <stddef.h>
36 
37 namespace llvm {
38   class Module;
39 }
40 
41 namespace bcc {
42   class Script;
43 
44   class ScriptCached {
45     friend class CacheReader;
46     friend class MCCacheReader;
47 
48   private:
49     enum { SMALL_VECTOR_QUICKN = 16 };
50 
51     typedef llvm::SmallVector<std::pair<char const *, char const *>,
52                               SMALL_VECTOR_QUICKN> PragmaList;
53 
54     typedef std::map<std::string, std::pair<void *, size_t> > FuncTable;
55 
56   private:
57     Script *mpOwner;
58 
59     MCO_ExportVarList *mpExportVars;
60     MCO_ExportFuncList *mpExportFuncs;
61     MCO_ExportForEachList *mpExportForEach;
62     PragmaList mPragmas;
63     MCO_ObjectSlotList *mpObjectSlotList;
64 
65     FuncTable mFunctions;
66 
67     RSExecRef mRSExecutable;
68     llvm::SmallVector<char, 1024> mCachedELFExecutable;
69 
70     MCO_StringPool *mpStringPoolRaw;
71     std::vector<char const *> mStringPool;
72 
73     bool mLibRSThreadable;
74 
75   public:
ScriptCached(Script * owner)76     ScriptCached(Script *owner)
77       : mpOwner(owner),
78         mpExportVars(NULL),
79         mpExportFuncs(NULL),
80         mpExportForEach(NULL),
81         mpObjectSlotList(NULL),
82         mpStringPoolRaw(NULL),
83         mLibRSThreadable(false) {
84     }
85 
86     ~ScriptCached();
87 
88     void *lookup(const char *name);
89 
90 
getExportVarCount()91     size_t getExportVarCount() const {
92       return mpExportVars->count;
93     }
94 
getExportFuncCount()95     size_t getExportFuncCount() const {
96       return mpExportFuncs->count;
97     }
98 
getExportForEachCount()99     size_t getExportForEachCount() const {
100       return mpExportForEach->count;
101     }
102 
getPragmaCount()103     size_t getPragmaCount() const {
104       return mPragmas.size();
105     }
106 
getFuncCount()107     size_t getFuncCount() const {
108       return mFunctions.size();
109     }
110 
getObjectSlotCount()111     size_t getObjectSlotCount() const {
112       return mpObjectSlotList->count;
113     }
114 
115     void getExportVarList(size_t varListSize, void **varList);
116 
117     void getExportFuncList(size_t funcListSize, void **funcList);
118 
119     void getExportForEachList(size_t forEachListSize, void **forEachList);
120 
121     void getPragmaList(size_t pragmaListSize,
122                        char const **keyList,
123                        char const **valueList);
124 
125     void getFuncInfoList(size_t funcInfoListSize, FuncInfo *funcNameList);
126 
127     void getObjectSlotList(size_t objectSlotListSize,
128                            uint32_t *objectSlotList);
129 
getELF()130     const char *getELF() const {
131       return &*mCachedELFExecutable.begin();
132     }
133 
getELFSize()134     size_t getELFSize() const {
135       return mCachedELFExecutable.size();
136     }
137 
138     // Dirty hack for libRS.
139     // TODO(all): This should be removed in the future.
isLibRSThreadable()140     bool isLibRSThreadable() const {
141       return mLibRSThreadable;
142     }
143 
144 #if 0
145     void registerSymbolCallback(BCCSymbolLookupFn pFn, BCCvoid *pContext) {
146       mCompiler.registerSymbolCallback(pFn, pContext);
147     }
148 #endif
149   };
150 
151 } // namespace bcc
152 
153 #endif // BCC_SCRIPTCACHED_H
154