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 20d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <stdlib.h> 21d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 22d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/ADT/STLExtras.h> 23d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/ADT/SmallString.h> 24d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/Config/config.h> 25d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/Support/CommandLine.h> 26d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/Support/FileSystem.h> 278be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines#include <llvm/Support/MemoryBuffer.h> 28d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/Support/raw_ostream.h> 29d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/Support/system_error.h> 30d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 31d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/BCCContext.h> 32d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Compiler.h> 33d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Config/BuildInfo.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#include <bcc/Support/TargetCompilerConfigs.h> 47d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 48d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaousing namespace bcc; 49d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 50d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao//===----------------------------------------------------------------------===// 51d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao// General Options 52d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao//===----------------------------------------------------------------------===// 53d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaonamespace { 54d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 558be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hinesllvm::cl::opt<std::string> 568be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen HinesOptInputFilename(llvm::cl::Positional, llvm::cl::ValueRequired, 578be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::desc("<input bitcode file>")); 58d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 59d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaollvm::cl::opt<std::string> 60d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei LiaoOptOutputFilename("o", llvm::cl::desc("Specify the output filename"), 618be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::value_desc("filename"), 628be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::init("bcc_output")); 638be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines 648be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hinesllvm::cl::opt<std::string> 658be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen HinesOptBCLibFilename("bclib", llvm::cl::desc("Specify the bclib filename"), 668be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::value_desc("bclib")); 678be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines 688be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hinesllvm::cl::opt<std::string> 698be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen HinesOptOutputPath("output_path", llvm::cl::desc("Specify the output path"), 708be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::value_desc("output path"), 718be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::init(".")); 72d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 737b980e1717f3cf418f7bc4e40597004bc1139b8bTobias Grosserllvm::cl::opt<bool> 747b980e1717f3cf418f7bc4e40597004bc1139b8bTobias GrosserOptEmitLLVM("emit-llvm", 757b980e1717f3cf418f7bc4e40597004bc1139b8bTobias Grosser llvm::cl::desc("Emit an LLVM-IR version of the generated program")); 767b980e1717f3cf418f7bc4e40597004bc1139b8bTobias Grosser 77d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#ifdef TARGET_BUILD 78d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaoconst std::string OptTargetTriple(DEFAULT_TARGET_TRIPLE_STRING); 79d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#else 80d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaollvm::cl::opt<std::string> 81d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei LiaoOptTargetTriple("mtriple", 82d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::desc("Specify the target triple (default: " 83d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao DEFAULT_TARGET_TRIPLE_STRING ")"), 84d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::init(DEFAULT_TARGET_TRIPLE_STRING), 85d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::value_desc("triple")); 86d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 87d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaollvm::cl::alias OptTargetTripleC("C", llvm::cl::NotHidden, 88d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::desc("Alias for -mtriple"), 89d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::aliasopt(OptTargetTriple)); 90d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#endif 91d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 92d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao//===----------------------------------------------------------------------===// 93d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao// Compiler Options 94d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao//===----------------------------------------------------------------------===// 95d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 967e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines// RenderScript uses -O3 by default 97d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaollvm::cl::opt<char> 98d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei LiaoOptOptLevel("O", llvm::cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " 997e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines "(default: -O3)"), 1007e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines llvm::cl::Prefix, llvm::cl::ZeroOrMore, llvm::cl::init('3')); 101d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 102d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao// Override "bcc -version" since the LLVM version information is not correct on 103d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao// Android build. 104d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaovoid BCCVersionPrinter() { 105d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::raw_ostream &os = llvm::outs(); 106d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao os << "libbcc (The Android Open Source Project, http://www.android.com/):\n" 107d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao << " Build time: " << BuildInfo::GetBuildTime() << "\n" 108d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao << " Build revision: " << BuildInfo::GetBuildRev() << "\n" 109d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao << " Build source blob: " << BuildInfo::GetBuildSourceBlob() << "\n" 110d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao << " Default target: " << DEFAULT_TARGET_TRIPLE_STRING << "\n"; 111d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 112d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao os << "\n"; 113d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 114d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao os << "LLVM (http://llvm.org/):\n" 115d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao << " Version: " << PACKAGE_VERSION << "\n"; 116d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return; 117d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao} 118d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 119d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao} // end anonymous namespace 120d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 121d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaostatic inline 1227e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hinesbool ConfigCompiler(RSCompilerDriver &pRSCD) { 1237e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines RSCompiler *RSC = pRSCD.getCompiler(); 124d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao CompilerConfig *config = NULL; 125d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 126d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#ifdef TARGET_BUILD 127d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao config = new (std::nothrow) DefaultCompilerConfig(); 128d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#else 129d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao config = new (std::nothrow) CompilerConfig(OptTargetTriple); 130d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#endif 131d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao if (config == NULL) { 132d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::errs() << "Out of memory when create the compiler configuration!\n"; 133d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return false; 134d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 135d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 136d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao switch (OptOptLevel) { 137d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao case '0': config->setOptimizationLevel(llvm::CodeGenOpt::None); break; 138d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao case '1': config->setOptimizationLevel(llvm::CodeGenOpt::Less); break; 1397e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines case '2': config->setOptimizationLevel(llvm::CodeGenOpt::Default); break; 1407e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines case '3': 141d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao default: { 1427e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines config->setOptimizationLevel(llvm::CodeGenOpt::Aggressive); 143d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao break; 144d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 145d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 146d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 1477e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines pRSCD.setConfig(config); 1487e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines Compiler::ErrorCode result = RSC->config(*config); 149d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 150d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao if (result != Compiler::kSuccess) { 151d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::errs() << "Failed to configure the compiler! (detail: " 152d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao << Compiler::GetErrorString(result) << ")\n"; 153d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return false; 154d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 155d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 156d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return true; 157d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao} 158d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 159d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaostatic inline 160d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaobool CompileScript(Compiler &pCompiler, Script &pScript, 161d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao const std::string &pOutputPath) { 162d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao // Open the output file. 163c02eae6f35de7dfd92233d591b27c05f15c2a6a1Shih-wei Liao OutputFile output_file(pOutputPath, FileBase::kTruncate); 164d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 165d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao if (output_file.hasError()) { 166d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::errs() << "Failed to open the output file `" << pOutputPath 167d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao << "'! (detail: " << output_file.getErrorMessage() << ")\n"; 168d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return false; 169d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 170d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 171d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao // Run the compiler. 172d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao Compiler::ErrorCode result = pCompiler.compile(pScript, output_file); 173d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao if (result != Compiler::kSuccess) { 174d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::errs() << "Fatal error during compilation (detail: " 175d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao << Compiler::GetErrorString(result) << ".)\n"; 176d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return false; 177d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 178d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 179d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return true; 180d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao} 181d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 182d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaoint main(int argc, char **argv) { 183d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::SetVersionPrinter(BCCVersionPrinter); 184d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::ParseCommandLineOptions(argc, argv); 185d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao init::Initialize(); 186d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 187d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao BCCContext context; 1888be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines RSCompilerDriver RSCD; 189d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 1908be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::OwningPtr<llvm::MemoryBuffer> input_data; 191d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 1928be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::error_code ec = 1938be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::MemoryBuffer::getFile(OptInputFilename.c_str(), input_data); 1948be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines if (ec != llvm::error_code::success()) { 1958be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines ALOGE("Failed to load bitcode from path %s! (%s)", 1968be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines OptInputFilename.c_str(), ec.message().c_str()); 197d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return EXIT_FAILURE; 198d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 199d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 2008be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::MemoryBuffer *input_memory = input_data.take(); 2018be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines 2028be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines const char *bitcode = input_memory->getBufferStart(); 2038be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines size_t bitcodeSize = input_memory->getBufferSize(); 2048be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines 2057e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines if (!ConfigCompiler(RSCD)) { 2067e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines ALOGE("Failed to configure compiler"); 2077e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines return EXIT_FAILURE; 2087e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines } 2098be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines bool built = RSCD.build(context, OptOutputPath.c_str(), 2108be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines OptOutputFilename.c_str(), bitcode, bitcodeSize, 2117b980e1717f3cf418f7bc4e40597004bc1139b8bTobias Grosser OptBCLibFilename.c_str(), NULL, OptEmitLLVM); 212d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 2138be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines if (!built) { 214d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return EXIT_FAILURE; 215d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 216d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 217d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return EXIT_SUCCESS; 218d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao} 219