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_SCRIPT_H 18 #define BCC_SCRIPT_H 19 20 #include <bcc/bcc.h> 21 #include "bcc_internal.h" 22 23 #include "Compiler.h" 24 25 #include <vector> 26 #include <string> 27 28 #include <stddef.h> 29 30 namespace llvm { 31 class Module; 32 } 33 34 namespace bcc { 35 class ScriptCompiled; 36 class ScriptCached; 37 class SourceInfo; 38 39 namespace ScriptStatus { 40 enum StatusType { 41 Unknown, 42 Compiled, 43 #if USE_CACHE 44 Cached, 45 #endif 46 }; 47 } 48 49 class Script { 50 private: 51 int mErrorCode; 52 53 ScriptStatus::StatusType mStatus; 54 55 union { 56 ScriptCompiled *mCompiled; 57 #if USE_CACHE 58 ScriptCached *mCached; 59 #endif 60 }; 61 62 #if USE_CACHE 63 std::string mCacheDir; 64 std::string mCacheName; 65 #endif 66 67 bool mIsContextSlotNotAvail; 68 69 // Source List 70 SourceInfo *mSourceList[2]; 71 // Note: mSourceList[0] (main source) 72 // Note: mSourceList[1] (library source) 73 // TODO(logan): Generalize this, use vector or SmallVector instead! 74 75 // External Function List 76 std::vector<char const *> mUserDefinedExternalSymbols; 77 78 // Register Symbol Lookup Function 79 BCCSymbolLookupFn mpExtSymbolLookupFn; 80 void *mpExtSymbolLookupFnContext; 81 82 public: 83 Script() : mErrorCode(BCC_NO_ERROR), mStatus(ScriptStatus::Unknown), 84 mIsContextSlotNotAvail(false), 85 mpExtSymbolLookupFn(NULL), mpExtSymbolLookupFnContext(NULL) { 86 Compiler::GlobalInitialization(); 87 88 mSourceList[0] = NULL; 89 mSourceList[1] = NULL; 90 } 91 92 ~Script(); 93 94 int addSourceBC(size_t idx, 95 char const *resName, 96 const char *bitcode, 97 size_t bitcodeSize, 98 unsigned long flags); 99 100 int addSourceModule(size_t idx, 101 llvm::Module *module, 102 unsigned long flags); 103 104 int addSourceFile(size_t idx, 105 char const *path, 106 unsigned long flags); 107 108 void markExternalSymbol(char const *name) { 109 mUserDefinedExternalSymbols.push_back(name); 110 } 111 112 std::vector<char const *> const &getUserDefinedExternalSymbols() const { 113 return mUserDefinedExternalSymbols; 114 } 115 116 int prepareExecutable(char const *cacheDir, 117 char const *cacheName, 118 unsigned long flags); 119 120 int prepareSharedObject(char const *cacheDir, 121 char const *cacheName, 122 unsigned long flags); 123 124 char const *getCompilerErrorMessage(); 125 126 void *lookup(const char *name); 127 128 129 size_t getExportVarCount() const; 130 131 size_t getExportFuncCount() const; 132 133 size_t getPragmaCount() const; 134 135 size_t getFuncCount() const; 136 137 size_t getObjectSlotCount() const; 138 139 void getExportVarList(size_t size, void **list); 140 141 void getExportFuncList(size_t size, void **list); 142 143 void getExportVarNameList(std::vector<std::string> &list); 144 145 void getExportFuncNameList(std::vector<std::string> &list); 146 147 void getPragmaList(size_t size, 148 char const **keyList, 149 char const **valueList); 150 151 void getFuncInfoList(size_t size, FuncInfo *list); 152 153 void getObjectSlotList(size_t size, uint32_t *list); 154 155 size_t getELFSize() const; 156 157 const char *getELF() const; 158 159 int registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext); 160 161 #if USE_OLD_JIT 162 char *getContext(); 163 #endif 164 165 166 void setError(int error) { 167 if (mErrorCode == BCC_NO_ERROR && error != BCC_NO_ERROR) { 168 mErrorCode = error; 169 } 170 } 171 172 int getError() { 173 int result = mErrorCode; 174 mErrorCode = BCC_NO_ERROR; 175 return result; 176 } 177 178 private: 179 #if USE_CACHE 180 int internalLoadCache(bool checkOnly); 181 #endif 182 int internalCompile(bool compileOnly); 183 184 }; 185 186 } // namespace bcc 187 188 #endif // BCC_SCRIPT_H 189