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