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