• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2010, 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_SCRIPTCOMPILED_H
18 #define BCC_SCRIPTCOMPILED_H
19 
20 #include "Compiler.h"
21 #include "Script.h"
22 
23 #include <bcc/bcc.h>
24 
25 #include <list>
26 #include <map>
27 #include <string>
28 #include <utility>
29 #include <vector>
30 
31 namespace llvm {
32   class Module;
33 }
34 
35 namespace bcc {
36   class ScriptCompiled {
37     friend class Compiler;
38     friend class CodeEmitter;
39 
40   private:
41     typedef std::list<std::pair<std::string, std::string> > PragmaList;
42     typedef std::list<void*> ExportVarList;
43     typedef std::list<void*> ExportFuncList;
44     typedef std::map<std::string, FuncInfo *> FuncInfoMap;
45     typedef std::list<uint32_t> ObjectSlotList;
46 
47   private:
48     Script *mpOwner;
49 
50     Compiler mCompiler;
51 
52     ExportVarList mExportVars;
53 
54     std::vector<std::string> mExportVarsName;
55     std::vector<std::string> mExportFuncsName;
56 
57     ExportFuncList mExportFuncs;
58     PragmaList mPragmas;
59     ObjectSlotList mObjectSlots;
60 
61     FuncInfoMap mEmittedFunctions;
62 
63 #if USE_OLD_JIT
64     char *mContext; // Context of BCC script (code and data)
65 #endif
66 
67   public:
ScriptCompiled(Script * owner)68     ScriptCompiled(Script *owner)
69       : mpOwner(owner), mCompiler(this)
70 #if USE_OLD_JIT
71         , mContext(NULL)
72 #endif
73     {
74     }
75 
76     ~ScriptCompiled();
77 
parseBitcodeFile(llvm::MemoryBuffer * MEM)78     llvm::Module *parseBitcodeFile(llvm::MemoryBuffer *MEM) {
79       return mCompiler.parseBitcodeFile(MEM);
80     }
81 
readModule(llvm::Module * module)82     int readModule(llvm::Module *module) {
83       return mCompiler.readModule(module);
84     }
85 
linkModule(llvm::Module * module)86     int linkModule(llvm::Module *module) {
87       return mCompiler.linkModule(module);
88     }
89 
compile(bool compileOnly)90     int compile(bool compileOnly) {
91       return mCompiler.compile(compileOnly);
92     }
93 
getCompilerErrorMessage()94     char const *getCompilerErrorMessage() {
95       return mCompiler.getErrorMessage();
96     }
97 
98     void *lookup(const char *name);
99 
100 
getExportVarCount()101     size_t getExportVarCount() const {
102       return mExportVars.size();
103     }
104 
getExportFuncCount()105     size_t getExportFuncCount() const {
106       return mExportFuncs.size();
107     }
108 
getPragmaCount()109     size_t getPragmaCount() const {
110       return mPragmas.size();
111     }
112 
getFuncCount()113     size_t getFuncCount() const {
114       return mEmittedFunctions.size();
115     }
116 
getObjectSlotCount()117     size_t getObjectSlotCount() const {
118       return mObjectSlots.size();
119     }
120 
121     void getExportVarList(size_t varListSize, void **varList);
122 
123     void getExportFuncList(size_t funcListSize, void **funcList);
124 
125     void getExportVarNameList(std::vector<std::string> &varList);
126 
127     void getExportFuncNameList(std::vector<std::string> &funcList);
128 
129     void getPragmaList(size_t pragmaListSize,
130                        char const **keyList,
131                        char const **valueList);
132 
133     void getFuncInfoList(size_t funcInfoListSize,
134                          FuncInfo *funcInfoList);
135 
136     void getObjectSlotList(size_t objectSlotListSize,
137                            uint32_t *objectSlotList);
138 
getUserDefinedExternalSymbols()139     std::vector<char const *> const & getUserDefinedExternalSymbols() const {
140       return mpOwner->getUserDefinedExternalSymbols();
141     }
142 
143 #if USE_OLD_JIT
getContext()144     char *getContext() {
145       return mContext;
146     }
147 #endif
148 
149 #if USE_MCJIT
getELF()150     const char *getELF() const {
151       return &*mCompiler.getELF().begin();
152     }
153 
getELFSize()154     size_t getELFSize() const {
155       return mCompiler.getELF().size();
156     }
157 #endif
158 
registerSymbolCallback(BCCSymbolLookupFn pFn,void * pContext)159     void registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext) {
160       mCompiler.registerSymbolCallback(pFn, pContext);
161     }
162   };
163 
164 } // namespace bcc
165 
166 #endif // BCC_SCRIPTCOMPILED_H
167