10fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang/*
20fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang * Copyright 2012, The Android Open Source Project
30fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang *
40fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
50fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang * you may not use this file except in compliance with the License.
60fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang * You may obtain a copy of the License at
70fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang *
80fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
90fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang *
100fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang * Unless required by applicable law or agreed to in writing, software
110fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
120fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang * See the License for the specific language governing permissions and
140fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang * limitations under the License.
150fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang */
160fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang
17c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#ifndef BCC_RS_COMPILER_DRIVER_H
18c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#define BCC_RS_COMPILER_DRIVER_H
190fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang
2009ca95426a7ec66def02e47048bb25289759c6fbShih-wei Liao#include "bcc/ExecutionEngine/CompilerRTSymbolResolver.h"
21c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/ExecutionEngine/SymbolResolvers.h"
22c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/ExecutionEngine/SymbolResolverProxy.h"
23e198abec6c5e3eab380ccf6897b0a0b9c2dd92ddStephen Hines#include "bcc/Renderscript/RSInfo.h"
24e198abec6c5e3eab380ccf6897b0a0b9c2dd92ddStephen Hines#include "bcc/Renderscript/RSCompiler.h"
2501f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hines#include "bcc/Renderscript/RSScript.h"
260fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang
270fffa7e4adc90079dc0f252359050fe872b360ddZonr Changnamespace bcc {
280fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang
297bcec85228c1eceade6efc9cd7d02ef81c8d55e9Shih-wei Liaoclass BCCContext;
300fffa7e4adc90079dc0f252359050fe872b360ddZonr Changclass CompilerConfig;
310fffa7e4adc90079dc0f252359050fe872b360ddZonr Changclass RSExecutable;
320fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang
330fffa7e4adc90079dc0f252359050fe872b360ddZonr Changclass RSCompilerDriver {
340fffa7e4adc90079dc0f252359050fe872b360ddZonr Changprivate:
350fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  CompilerConfig *mConfig;
360fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  RSCompiler mCompiler;
370fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang
383ab9da1e1b3d7794994393af086d096397fb84dbStephen Hines  CompilerRTSymbolResolver *mCompilerRuntime;
390fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  LookupFunctionSymbolResolver<void*> mRSRuntime;
400fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  SymbolResolverProxy mResolver;
410fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang
421d4a9e4646e8786623daa6ac3917782be56a8fb2Stephen Hines  // Are we compiling under an RS debug context with additional checks?
431d4a9e4646e8786623daa6ac3917782be56a8fb2Stephen Hines  bool mDebugContext;
441d4a9e4646e8786623daa6ac3917782be56a8fb2Stephen Hines
45c06cd06078a8c866d5cecbf897326092b55a8955Stephen Hines  // Do we merge global variables on ARM using LLVM's optimization pass?
46ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines  // Disabling LLVM's global merge pass allows static globals to be correctly
47ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines  // emitted to ELF. This can result in decreased performance due to increased
48ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines  // register pressure, but it does make the resulting code easier to debug
49ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines  // and work with.
50ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines  bool mEnableGlobalMerge;
51ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines
520fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  // Setup the compiler config for the given script. Return true if mConfig has
530fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  // been changed and false if it remains unchanged.
540fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  bool setupConfig(const RSScript &pScript);
550fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang
5647f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines  Compiler::ErrorCode compileScript(RSScript &pScript,
5747f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines                                    const char* pScriptName,
5847f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines                                    const char *pOutputPath,
5947f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines                                    const char *pRuntimePath,
6047f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines                                    const RSInfo::DependencyTableTy &pDeps,
617b980e1717f3cf418f7bc4e40597004bc1139b8bTobias Grosser                                    bool pSkipLoad, bool pDumpIR = false);
620fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang
630fffa7e4adc90079dc0f252359050fe872b360ddZonr Changpublic:
643ab9da1e1b3d7794994393af086d096397fb84dbStephen Hines  RSCompilerDriver(bool pUseCompilerRT = true);
650fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  ~RSCompilerDriver();
660fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang
670fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  inline void setRSRuntimeLookupFunction(
680fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang      LookupFunctionSymbolResolver<>::LookupFunctionTy pLookupFunc)
690fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  { mRSRuntime.setLookupFunction(pLookupFunc); }
700fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  inline void setRSRuntimeLookupContext(void *pContext)
710fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  { mRSRuntime.setContext(pContext); }
720fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang
73331310e1f3f86a795f78e42b3f03558a43829f09Stephen Hines  RSCompiler *getCompiler() {
74331310e1f3f86a795f78e42b3f03558a43829f09Stephen Hines    return &mCompiler;
75331310e1f3f86a795f78e42b3f03558a43829f09Stephen Hines  }
76331310e1f3f86a795f78e42b3f03558a43829f09Stephen Hines
77331310e1f3f86a795f78e42b3f03558a43829f09Stephen Hines  void setConfig(CompilerConfig *config) {
78331310e1f3f86a795f78e42b3f03558a43829f09Stephen Hines    mConfig = config;
79331310e1f3f86a795f78e42b3f03558a43829f09Stephen Hines  }
80331310e1f3f86a795f78e42b3f03558a43829f09Stephen Hines
811d4a9e4646e8786623daa6ac3917782be56a8fb2Stephen Hines  void setDebugContext(bool v) {
821d4a9e4646e8786623daa6ac3917782be56a8fb2Stephen Hines    mDebugContext = v;
831d4a9e4646e8786623daa6ac3917782be56a8fb2Stephen Hines  }
841d4a9e4646e8786623daa6ac3917782be56a8fb2Stephen Hines
85c06cd06078a8c866d5cecbf897326092b55a8955Stephen Hines  // This function enables/disables merging of global static variables.
86c06cd06078a8c866d5cecbf897326092b55a8955Stephen Hines  // Note that it only takes effect on ARM architectures (other architectures
87c06cd06078a8c866d5cecbf897326092b55a8955Stephen Hines  // do not offer this option).
88ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines  void setEnableGlobalMerge(bool v) {
89ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines    mEnableGlobalMerge = v;
90ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines  }
91ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines
92ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines  bool getEnableGlobalMerge() const {
93ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines    return mEnableGlobalMerge;
94ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines  }
95ad69476ec040ba9ee07176ccb758aabb5ff6d51cStephen Hines
9647f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines  // FIXME: This method accompany with loadScript and compileScript should
970fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  //        all be const-methods. They're not now because the getAddress() in
980fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang  //        SymbolResolverInterface is not a const-method.
9947f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines  // Returns true if script is successfully compiled.
10047f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines  bool build(BCCContext &pContext, const char *pCacheDir, const char *pResName,
10147f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines             const char *pBitcode, size_t pBitcodeSize,
10247f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines             const char *pRuntimePath,
1037b980e1717f3cf418f7bc4e40597004bc1139b8bTobias Grosser             RSLinkRuntimeCallback pLinkRuntimeCallback = NULL,
1047b980e1717f3cf418f7bc4e40597004bc1139b8bTobias Grosser             bool pDumpIR = false);
10547f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines
10647f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines  // Returns true if script is successfully compiled.
10747f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines  bool build(RSScript &pScript, const char *pOut, const char *pRuntimePath);
10847f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines
10947f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines  RSExecutable *loadScript(const char *pCacheDir, const char *pResName,
11047f0d5a8d9ed629a6d58d3e69891f2c7fdee44d9Stephen Hines                           const char *pBitcode, size_t pBitcodeSize);
1110fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang};
1120fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang
1130fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang} // end namespace bcc
1140fffa7e4adc90079dc0f252359050fe872b360ddZonr Chang
115c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#endif // BCC_RS_COMPILER_DRIVER_H
116