1d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao/* 2d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao * Copyright 2012, The Android Open Source Project 3d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao * 4d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License"); 5d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao * you may not use this file except in compliance with the License. 6d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao * You may obtain a copy of the License at 7d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao * 8d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao * http://www.apache.org/licenses/LICENSE-2.0 9d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao * 10d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao * Unless required by applicable law or agreed to in writing, software 11d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS, 12d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao * See the License for the specific language governing permissions and 14d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao * limitations under the License. 15d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao */ 16d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 17d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <string> 18d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <vector> 19d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 20c3437f05c638f8befda59170ae788873db24dc1cStephen Hines#include <dlfcn.h> 21d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <stdlib.h> 22d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 23d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/ADT/STLExtras.h> 24d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/ADT/SmallString.h> 25d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/Config/config.h> 26d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/Support/CommandLine.h> 27d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/Support/FileSystem.h> 288be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines#include <llvm/Support/MemoryBuffer.h> 29c3437f05c638f8befda59170ae788873db24dc1cStephen Hines#include <llvm/Support/PluginLoader.h> 30d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/Support/raw_ostream.h> 31d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 32d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/BCCContext.h> 33d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Compiler.h> 34d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Config/Config.h> 3509ca95426a7ec66def02e47048bb25289759c6fbShih-wei Liao#include <bcc/ExecutionEngine/CompilerRTSymbolResolver.h> 36d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/ExecutionEngine/ObjectLoader.h> 37d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/ExecutionEngine/SymbolResolverProxy.h> 38d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/ExecutionEngine/SymbolResolvers.h> 398be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines#include <bcc/Renderscript/RSCompilerDriver.h> 40d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Script.h> 41d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Source.h> 42d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Support/CompilerConfig.h> 43d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Support/Initialization.h> 44d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Support/InputFile.h> 45d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Support/OutputFile.h> 46d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 47d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaousing namespace bcc; 48d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 49c3437f05c638f8befda59170ae788873db24dc1cStephen Hines#define STR2(a) #a 50c3437f05c638f8befda59170ae788873db24dc1cStephen Hines#define STR(a) STR2(a) 51c3437f05c638f8befda59170ae788873db24dc1cStephen Hines 52d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao//===----------------------------------------------------------------------===// 53d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao// General Options 54d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao//===----------------------------------------------------------------------===// 55d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaonamespace { 56d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 578be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hinesllvm::cl::opt<std::string> 588be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen HinesOptInputFilename(llvm::cl::Positional, llvm::cl::ValueRequired, 598be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::desc("<input bitcode file>")); 60d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 61d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaollvm::cl::opt<std::string> 62d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei LiaoOptOutputFilename("o", llvm::cl::desc("Specify the output filename"), 638be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::value_desc("filename"), 648be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::init("bcc_output")); 658be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines 668be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hinesllvm::cl::opt<std::string> 678be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen HinesOptBCLibFilename("bclib", llvm::cl::desc("Specify the bclib filename"), 688be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::value_desc("bclib")); 698be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines 708be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hinesllvm::cl::opt<std::string> 718be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen HinesOptOutputPath("output_path", llvm::cl::desc("Specify the output path"), 728be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::value_desc("output path"), 738be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::init(".")); 74d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 757b980e1717f3cf418f7bc4e40597004bc1139b8bTobias Grosserllvm::cl::opt<bool> 767b980e1717f3cf418f7bc4e40597004bc1139b8bTobias GrosserOptEmitLLVM("emit-llvm", 777b980e1717f3cf418f7bc4e40597004bc1139b8bTobias Grosser llvm::cl::desc("Emit an LLVM-IR version of the generated program")); 787b980e1717f3cf418f7bc4e40597004bc1139b8bTobias Grosser 79d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaollvm::cl::opt<std::string> 80d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei LiaoOptTargetTriple("mtriple", 81d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::desc("Specify the target triple (default: " 82d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao DEFAULT_TARGET_TRIPLE_STRING ")"), 83d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::init(DEFAULT_TARGET_TRIPLE_STRING), 84d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::value_desc("triple")); 85d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 86d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaollvm::cl::alias OptTargetTripleC("C", llvm::cl::NotHidden, 87d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::desc("Alias for -mtriple"), 88d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::aliasopt(OptTargetTriple)); 89d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 90c3437f05c638f8befda59170ae788873db24dc1cStephen Hinesllvm::cl::opt<bool> 91c3437f05c638f8befda59170ae788873db24dc1cStephen HinesOptRSDebugContext("rs-debug-ctx", 92c3437f05c638f8befda59170ae788873db24dc1cStephen Hines llvm::cl::desc("Enable build to work with a RenderScript debug context")); 93c3437f05c638f8befda59170ae788873db24dc1cStephen Hines 94d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao//===----------------------------------------------------------------------===// 95d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao// Compiler Options 96d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao//===----------------------------------------------------------------------===// 97d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 987e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines// RenderScript uses -O3 by default 99d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaollvm::cl::opt<char> 100d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei LiaoOptOptLevel("O", llvm::cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " 1017e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines "(default: -O3)"), 1027e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines llvm::cl::Prefix, llvm::cl::ZeroOrMore, llvm::cl::init('3')); 103d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 104d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao// Override "bcc -version" since the LLVM version information is not correct on 105d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao// Android build. 106d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaovoid BCCVersionPrinter() { 107d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::raw_ostream &os = llvm::outs(); 108d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao os << "libbcc (The Android Open Source Project, http://www.android.com/):\n" 109c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet << " Default target: " << DEFAULT_TARGET_TRIPLE_STRING << "\n\n" 110c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet << "LLVM (http://llvm.org/):\n" 111d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao << " Version: " << PACKAGE_VERSION << "\n"; 112d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return; 113d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao} 114d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 115d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao} // end anonymous namespace 116d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 117d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaostatic inline 1187e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hinesbool ConfigCompiler(RSCompilerDriver &pRSCD) { 1197e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines RSCompiler *RSC = pRSCD.getCompiler(); 120d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao CompilerConfig *config = NULL; 121d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 122d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao config = new (std::nothrow) CompilerConfig(OptTargetTriple); 123d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao if (config == NULL) { 124d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::errs() << "Out of memory when create the compiler configuration!\n"; 125d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return false; 126d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 127d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 1289ac104431b18727ee2f2d60be294213a47354266Jian Li // llvm3.5 has removed the auto-detect feature for x86 subtarget, 1299ac104431b18727ee2f2d60be294213a47354266Jian Li // so set features explicitly in bcc. 1309ac104431b18727ee2f2d60be294213a47354266Jian Li if ((config->getTriple().find("i686") != std::string::npos) || 1319ac104431b18727ee2f2d60be294213a47354266Jian Li (config->getTriple().find("x86_64") != std::string::npos)) { 1329ac104431b18727ee2f2d60be294213a47354266Jian Li std::vector<std::string> fv; 1339ac104431b18727ee2f2d60be294213a47354266Jian Li 1349ac104431b18727ee2f2d60be294213a47354266Jian Li#if defined(__SSE3__) 1359ac104431b18727ee2f2d60be294213a47354266Jian Li fv.push_back("+sse3"); 1369ac104431b18727ee2f2d60be294213a47354266Jian Li#endif 1379ac104431b18727ee2f2d60be294213a47354266Jian Li#if defined(__SSSE3__) 1389ac104431b18727ee2f2d60be294213a47354266Jian Li fv.push_back("+ssse3"); 1399ac104431b18727ee2f2d60be294213a47354266Jian Li#endif 1409ac104431b18727ee2f2d60be294213a47354266Jian Li#if defined(__SSE4_1__) 1419ac104431b18727ee2f2d60be294213a47354266Jian Li fv.push_back("+sse4.1"); 1429ac104431b18727ee2f2d60be294213a47354266Jian Li#endif 1439ac104431b18727ee2f2d60be294213a47354266Jian Li#if defined(__SSE4_2__) 1449ac104431b18727ee2f2d60be294213a47354266Jian Li fv.push_back("+sse4.2"); 1459ac104431b18727ee2f2d60be294213a47354266Jian Li#endif 1469ac104431b18727ee2f2d60be294213a47354266Jian Li 1479ac104431b18727ee2f2d60be294213a47354266Jian Li if (fv.size()) { 1489ac104431b18727ee2f2d60be294213a47354266Jian Li config->setFeatureString(fv); 1499ac104431b18727ee2f2d60be294213a47354266Jian Li } 1509ac104431b18727ee2f2d60be294213a47354266Jian Li } 1519ac104431b18727ee2f2d60be294213a47354266Jian Li 152d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao switch (OptOptLevel) { 153d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao case '0': config->setOptimizationLevel(llvm::CodeGenOpt::None); break; 154d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao case '1': config->setOptimizationLevel(llvm::CodeGenOpt::Less); break; 1557e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines case '2': config->setOptimizationLevel(llvm::CodeGenOpt::Default); break; 1567e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines case '3': 157d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao default: { 1587e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines config->setOptimizationLevel(llvm::CodeGenOpt::Aggressive); 159d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao break; 160d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 161d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 162d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 1637e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines pRSCD.setConfig(config); 1647e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines Compiler::ErrorCode result = RSC->config(*config); 165d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 166c3437f05c638f8befda59170ae788873db24dc1cStephen Hines if (OptRSDebugContext) { 167c3437f05c638f8befda59170ae788873db24dc1cStephen Hines pRSCD.setDebugContext(true); 168c3437f05c638f8befda59170ae788873db24dc1cStephen Hines } 169c3437f05c638f8befda59170ae788873db24dc1cStephen Hines 170d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao if (result != Compiler::kSuccess) { 171d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::errs() << "Failed to configure the compiler! (detail: " 172d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao << Compiler::GetErrorString(result) << ")\n"; 173d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return false; 174d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 175d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 176d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return true; 177d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao} 178d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 179d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaoint main(int argc, char **argv) { 180d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::SetVersionPrinter(BCCVersionPrinter); 181d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::ParseCommandLineOptions(argc, argv); 182f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet std::string commandLine = bcc::getCommandLine(argc, argv); 183d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao init::Initialize(); 184d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 185d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao BCCContext context; 1868be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines RSCompilerDriver RSCD; 187d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 188c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet if (OptBCLibFilename.empty()) { 189c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet ALOGE("Failed to compile bit code, -bclib was not specified"); 190c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet return EXIT_FAILURE; 191c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet } 192c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet 193f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> mb_or_error = 194f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines llvm::MemoryBuffer::getFile(OptInputFilename.c_str()); 195f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines if (mb_or_error.getError()) { 1968be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines ALOGE("Failed to load bitcode from path %s! (%s)", 197f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines OptInputFilename.c_str(), mb_or_error.getError().message().c_str()); 198d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return EXIT_FAILURE; 199d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 200f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::unique_ptr<llvm::MemoryBuffer> input_data = std::move(mb_or_error.get()); 201d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 2021ae3fd6e2290fe1635bafe91a65e0e88e641b6fcStephen Hines const char *bitcode = input_data->getBufferStart(); 2031ae3fd6e2290fe1635bafe91a65e0e88e641b6fcStephen Hines size_t bitcodeSize = input_data->getBufferSize(); 2048be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines 2057e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines if (!ConfigCompiler(RSCD)) { 2067e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines ALOGE("Failed to configure compiler"); 2077e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines return EXIT_FAILURE; 2087e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines } 209c3437f05c638f8befda59170ae788873db24dc1cStephen Hines 210c3437f05c638f8befda59170ae788873db24dc1cStephen Hines // Attempt to dynamically initialize the compiler driver if such a function 211c3437f05c638f8befda59170ae788873db24dc1cStephen Hines // is present. It is only present if passed via "-load libFOO.so". 212c3437f05c638f8befda59170ae788873db24dc1cStephen Hines RSCompilerDriverInit_t rscdi = (RSCompilerDriverInit_t) 213c3437f05c638f8befda59170ae788873db24dc1cStephen Hines dlsym(RTLD_DEFAULT, STR(RS_COMPILER_DRIVER_INIT_FN)); 214c3437f05c638f8befda59170ae788873db24dc1cStephen Hines if (rscdi != NULL) { 215c3437f05c638f8befda59170ae788873db24dc1cStephen Hines rscdi(&RSCD); 216c3437f05c638f8befda59170ae788873db24dc1cStephen Hines } 217c3437f05c638f8befda59170ae788873db24dc1cStephen Hines 218f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet bool built = RSCD.build(context, OptOutputPath.c_str(), OptOutputFilename.c_str(), bitcode, 219f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet bitcodeSize, commandLine.c_str(), OptBCLibFilename.c_str(), NULL, 220f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet OptEmitLLVM); 221d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 2228be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines if (!built) { 223d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return EXIT_FAILURE; 224d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 225d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 226d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return EXIT_SUCCESS; 227d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao} 228