1cf3e5219a81a19773bc36368876deb378ad513bfLogan/* 2cf3e5219a81a19773bc36368876deb378ad513bfLogan * Copyright 2010, The Android Open Source Project 3cf3e5219a81a19773bc36368876deb378ad513bfLogan * 4cf3e5219a81a19773bc36368876deb378ad513bfLogan * Licensed under the Apache License, Version 2.0 (the "License"); 5cf3e5219a81a19773bc36368876deb378ad513bfLogan * you may not use this file except in compliance with the License. 6cf3e5219a81a19773bc36368876deb378ad513bfLogan * You may obtain a copy of the License at 7cf3e5219a81a19773bc36368876deb378ad513bfLogan * 8cf3e5219a81a19773bc36368876deb378ad513bfLogan * http://www.apache.org/licenses/LICENSE-2.0 9cf3e5219a81a19773bc36368876deb378ad513bfLogan * 10cf3e5219a81a19773bc36368876deb378ad513bfLogan * Unless required by applicable law or agreed to in writing, software 11cf3e5219a81a19773bc36368876deb378ad513bfLogan * distributed under the License is distributed on an "AS IS" BASIS, 12cf3e5219a81a19773bc36368876deb378ad513bfLogan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cf3e5219a81a19773bc36368876deb378ad513bfLogan * See the License for the specific language governing permissions and 14cf3e5219a81a19773bc36368876deb378ad513bfLogan * limitations under the License. 15cf3e5219a81a19773bc36368876deb378ad513bfLogan */ 16cf3e5219a81a19773bc36368876deb378ad513bfLogan 17cf3e5219a81a19773bc36368876deb378ad513bfLogan#ifndef BCC_SCRIPTCOMPILED_H 18cf3e5219a81a19773bc36368876deb378ad513bfLogan#define BCC_SCRIPTCOMPILED_H 19cf3e5219a81a19773bc36368876deb378ad513bfLogan 20cf3e5219a81a19773bc36368876deb378ad513bfLogan#include "Compiler.h" 217890d437030c1594bc9c9f61fa1e80a57754b078Logan Chien#include "Script.h" 22cf3e5219a81a19773bc36368876deb378ad513bfLogan 23cf3e5219a81a19773bc36368876deb378ad513bfLogan#include <bcc/bcc.h> 24cf3e5219a81a19773bc36368876deb378ad513bfLogan 257dcaac9898741e701098537808296f4e2f2fb422Logan#include <list> 267dcaac9898741e701098537808296f4e2f2fb422Logan#include <map> 277dcaac9898741e701098537808296f4e2f2fb422Logan#include <string> 287dcaac9898741e701098537808296f4e2f2fb422Logan#include <utility> 297dcaac9898741e701098537808296f4e2f2fb422Logan#include <vector> 307dcaac9898741e701098537808296f4e2f2fb422Logan 31cf3e5219a81a19773bc36368876deb378ad513bfLogannamespace llvm { 32cf3e5219a81a19773bc36368876deb378ad513bfLogan class Module; 33cf3e5219a81a19773bc36368876deb378ad513bfLogan} 34cf3e5219a81a19773bc36368876deb378ad513bfLogan 35cf3e5219a81a19773bc36368876deb378ad513bfLogannamespace bcc { 36cf3e5219a81a19773bc36368876deb378ad513bfLogan class ScriptCompiled { 372a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan friend class Compiler; 387dcaac9898741e701098537808296f4e2f2fb422Logan friend class CodeEmitter; 392a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 402a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan private: 417dcaac9898741e701098537808296f4e2f2fb422Logan typedef std::list<std::pair<std::string, std::string> > PragmaList; 422a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan typedef std::list<void*> ExportVarList; 432a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan typedef std::list<void*> ExportFuncList; 44f340bf71ff377979d279132dcf5a801d76747d1fLogan typedef std::map<std::string, FuncInfo *> FuncInfoMap; 45071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines typedef std::list<uint32_t> ObjectSlotList; 462a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 47cf3e5219a81a19773bc36368876deb378ad513bfLogan private: 48cf3e5219a81a19773bc36368876deb378ad513bfLogan Script *mpOwner; 49cf3e5219a81a19773bc36368876deb378ad513bfLogan 50cf3e5219a81a19773bc36368876deb378ad513bfLogan Compiler mCompiler; 51cf3e5219a81a19773bc36368876deb378ad513bfLogan 522a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan ExportVarList mExportVars; 53f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen 54f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen std::vector<std::string> mExportVarsName; 55f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen std::vector<std::string> mExportFuncsName; 56f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen 572a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan ExportFuncList mExportFuncs; 5802286cbd7505ed355cb9b301326db51639789049Logan PragmaList mPragmas; 59071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines ObjectSlotList mObjectSlots; 6002286cbd7505ed355cb9b301326db51639789049Logan 61f340bf71ff377979d279132dcf5a801d76747d1fLogan FuncInfoMap mEmittedFunctions; 622a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 63d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien#if USE_OLD_JIT 6402286cbd7505ed355cb9b301326db51639789049Logan char *mContext; // Context of BCC script (code and data) 65d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien#endif 6602286cbd7505ed355cb9b301326db51639789049Logan 67cf3e5219a81a19773bc36368876deb378ad513bfLogan public: 6865719819c51612480a355267c160af56a37c01a9Logan ScriptCompiled(Script *owner) 69d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien : mpOwner(owner), mCompiler(this) 70d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien#if USE_OLD_JIT 71d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien , mContext(NULL) 72d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien#endif 73d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien { 74cf3e5219a81a19773bc36368876deb378ad513bfLogan } 75cf3e5219a81a19773bc36368876deb378ad513bfLogan 767dcaac9898741e701098537808296f4e2f2fb422Logan ~ScriptCompiled(); 777dcaac9898741e701098537808296f4e2f2fb422Logan 78474cbd2fde362e63375f7a5099ca38b5c67835cfLogan llvm::Module *parseBitcodeFile(llvm::MemoryBuffer *MEM) { 79474cbd2fde362e63375f7a5099ca38b5c67835cfLogan return mCompiler.parseBitcodeFile(MEM); 80cf3e5219a81a19773bc36368876deb378ad513bfLogan } 81cf3e5219a81a19773bc36368876deb378ad513bfLogan 82474cbd2fde362e63375f7a5099ca38b5c67835cfLogan int readModule(llvm::Module *module) { 83f340bf71ff377979d279132dcf5a801d76747d1fLogan return mCompiler.readModule(module); 84f340bf71ff377979d279132dcf5a801d76747d1fLogan } 85f340bf71ff377979d279132dcf5a801d76747d1fLogan 86474cbd2fde362e63375f7a5099ca38b5c67835cfLogan int linkModule(llvm::Module *module) { 87474cbd2fde362e63375f7a5099ca38b5c67835cfLogan return mCompiler.linkModule(module); 88cf3e5219a81a19773bc36368876deb378ad513bfLogan } 89cf3e5219a81a19773bc36368876deb378ad513bfLogan 9034c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen int compile(bool compileOnly) { 9134c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen return mCompiler.compile(compileOnly); 92cf3e5219a81a19773bc36368876deb378ad513bfLogan } 93cf3e5219a81a19773bc36368876deb378ad513bfLogan 94cf3e5219a81a19773bc36368876deb378ad513bfLogan char const *getCompilerErrorMessage() { 95cf3e5219a81a19773bc36368876deb378ad513bfLogan return mCompiler.getErrorMessage(); 96cf3e5219a81a19773bc36368876deb378ad513bfLogan } 97cf3e5219a81a19773bc36368876deb378ad513bfLogan 987dcaac9898741e701098537808296f4e2f2fb422Logan void *lookup(const char *name); 99cf3e5219a81a19773bc36368876deb378ad513bfLogan 100cf3e5219a81a19773bc36368876deb378ad513bfLogan 101be79ada39b5e77b638940d2e157a45904ee09275Logan size_t getExportVarCount() const { 102be79ada39b5e77b638940d2e157a45904ee09275Logan return mExportVars.size(); 103be79ada39b5e77b638940d2e157a45904ee09275Logan } 104be79ada39b5e77b638940d2e157a45904ee09275Logan 105be79ada39b5e77b638940d2e157a45904ee09275Logan size_t getExportFuncCount() const { 106be79ada39b5e77b638940d2e157a45904ee09275Logan return mExportFuncs.size(); 107be79ada39b5e77b638940d2e157a45904ee09275Logan } 108be79ada39b5e77b638940d2e157a45904ee09275Logan 109be79ada39b5e77b638940d2e157a45904ee09275Logan size_t getPragmaCount() const { 110be79ada39b5e77b638940d2e157a45904ee09275Logan return mPragmas.size(); 111be79ada39b5e77b638940d2e157a45904ee09275Logan } 112be79ada39b5e77b638940d2e157a45904ee09275Logan 113be79ada39b5e77b638940d2e157a45904ee09275Logan size_t getFuncCount() const { 114be79ada39b5e77b638940d2e157a45904ee09275Logan return mEmittedFunctions.size(); 115be79ada39b5e77b638940d2e157a45904ee09275Logan } 116be79ada39b5e77b638940d2e157a45904ee09275Logan 117071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines size_t getObjectSlotCount() const { 118071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines return mObjectSlots.size(); 119071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines } 120be79ada39b5e77b638940d2e157a45904ee09275Logan 121be79ada39b5e77b638940d2e157a45904ee09275Logan void getExportVarList(size_t varListSize, void **varList); 122be79ada39b5e77b638940d2e157a45904ee09275Logan 123be79ada39b5e77b638940d2e157a45904ee09275Logan void getExportFuncList(size_t funcListSize, void **funcList); 124cf3e5219a81a19773bc36368876deb378ad513bfLogan 125f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen void getExportVarNameList(std::vector<std::string> &varList); 126f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen 127f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen void getExportFuncNameList(std::vector<std::string> &funcList); 128f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen 129be79ada39b5e77b638940d2e157a45904ee09275Logan void getPragmaList(size_t pragmaListSize, 130be79ada39b5e77b638940d2e157a45904ee09275Logan char const **keyList, 131be79ada39b5e77b638940d2e157a45904ee09275Logan char const **valueList); 132cf3e5219a81a19773bc36368876deb378ad513bfLogan 133f340bf71ff377979d279132dcf5a801d76747d1fLogan void getFuncInfoList(size_t funcInfoListSize, 134f340bf71ff377979d279132dcf5a801d76747d1fLogan FuncInfo *funcInfoList); 135cf3e5219a81a19773bc36368876deb378ad513bfLogan 136071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines void getObjectSlotList(size_t objectSlotListSize, 137071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines uint32_t *objectSlotList); 138071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines 1397890d437030c1594bc9c9f61fa1e80a57754b078Logan Chien std::vector<char const *> const & getUserDefinedExternalSymbols() const { 1407890d437030c1594bc9c9f61fa1e80a57754b078Logan Chien return mpOwner->getUserDefinedExternalSymbols(); 1417890d437030c1594bc9c9f61fa1e80a57754b078Logan Chien } 1427890d437030c1594bc9c9f61fa1e80a57754b078Logan Chien 143d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien#if USE_OLD_JIT 144a27a83f2b01b1710238d077dc9dfd7655f4513cdLogan char *getContext() { 14502286cbd7505ed355cb9b301326db51639789049Logan return mContext; 14602286cbd7505ed355cb9b301326db51639789049Logan } 147d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien#endif 148d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien 1495e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#if USE_MCJIT 1505e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao const char *getELF() const { 1515e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return &*mCompiler.getELF().begin(); 1525e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 1535e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1545e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao size_t getELFSize() const { 1555e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return mCompiler.getELF().size(); 1565e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 1575e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#endif 15802286cbd7505ed355cb9b301326db51639789049Logan 159f340bf71ff377979d279132dcf5a801d76747d1fLogan void registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext) { 160cf3e5219a81a19773bc36368876deb378ad513bfLogan mCompiler.registerSymbolCallback(pFn, pContext); 161cf3e5219a81a19773bc36368876deb378ad513bfLogan } 162cf3e5219a81a19773bc36368876deb378ad513bfLogan }; 163cf3e5219a81a19773bc36368876deb378ad513bfLogan 164cf3e5219a81a19773bc36368876deb378ad513bfLogan} // namespace bcc 165cf3e5219a81a19773bc36368876deb378ad513bfLogan 166cf3e5219a81a19773bc36368876deb378ad513bfLogan#endif // BCC_SCRIPTCOMPILED_H 167