Main.cpp revision c46a3f5370364ad5698756d5da5b8845be9970d0
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> 28c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray#include <llvm/Support/ManagedStatic.h> 298be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines#include <llvm/Support/MemoryBuffer.h> 301e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar#include <llvm/Support/Path.h> 31c3437f05c638f8befda59170ae788873db24dc1cStephen Hines#include <llvm/Support/PluginLoader.h> 32d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <llvm/Support/raw_ostream.h> 33d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 34d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/BCCContext.h> 35d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Compiler.h> 36d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Config/Config.h> 3709ca95426a7ec66def02e47048bb25289759c6fbShih-wei Liao#include <bcc/ExecutionEngine/CompilerRTSymbolResolver.h> 38d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/ExecutionEngine/ObjectLoader.h> 39d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/ExecutionEngine/SymbolResolverProxy.h> 40d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/ExecutionEngine/SymbolResolvers.h> 418be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines#include <bcc/Renderscript/RSCompilerDriver.h> 42d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Script.h> 43d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Source.h> 44d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Support/CompilerConfig.h> 45d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Support/Initialization.h> 46d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Support/InputFile.h> 47d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao#include <bcc/Support/OutputFile.h> 48d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 49d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaousing namespace bcc; 50d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 51c3437f05c638f8befda59170ae788873db24dc1cStephen Hines#define STR2(a) #a 52c3437f05c638f8befda59170ae788873db24dc1cStephen Hines#define STR(a) STR2(a) 53c3437f05c638f8befda59170ae788873db24dc1cStephen Hines 54d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao//===----------------------------------------------------------------------===// 55d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao// General Options 56d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao//===----------------------------------------------------------------------===// 57d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaonamespace { 58d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 598be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hinesllvm::cl::opt<std::string> 608be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen HinesOptInputFilename(llvm::cl::Positional, llvm::cl::ValueRequired, 618be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::desc("<input bitcode file>")); 62d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 63d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaollvm::cl::opt<std::string> 64d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei LiaoOptOutputFilename("o", llvm::cl::desc("Specify the output filename"), 658be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::value_desc("filename"), 668be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::init("bcc_output")); 678be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines 688be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hinesllvm::cl::opt<std::string> 698be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen HinesOptBCLibFilename("bclib", llvm::cl::desc("Specify the bclib filename"), 708be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::value_desc("bclib")); 718be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines 728be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hinesllvm::cl::opt<std::string> 738be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen HinesOptOutputPath("output_path", llvm::cl::desc("Specify the output path"), 748be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::value_desc("output path"), 758be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines llvm::cl::init(".")); 76d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 777b980e1717f3cf418f7bc4e40597004bc1139b8bTobias Grosserllvm::cl::opt<bool> 787b980e1717f3cf418f7bc4e40597004bc1139b8bTobias GrosserOptEmitLLVM("emit-llvm", 797b980e1717f3cf418f7bc4e40597004bc1139b8bTobias Grosser llvm::cl::desc("Emit an LLVM-IR version of the generated program")); 807b980e1717f3cf418f7bc4e40597004bc1139b8bTobias Grosser 81d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaollvm::cl::opt<std::string> 82d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei LiaoOptTargetTriple("mtriple", 83d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::desc("Specify the target triple (default: " 84d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao DEFAULT_TARGET_TRIPLE_STRING ")"), 85d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::init(DEFAULT_TARGET_TRIPLE_STRING), 86d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::value_desc("triple")); 87d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 88d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaollvm::cl::alias OptTargetTripleC("C", llvm::cl::NotHidden, 89d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::desc("Alias for -mtriple"), 90d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::aliasopt(OptTargetTriple)); 91d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 92c3437f05c638f8befda59170ae788873db24dc1cStephen Hinesllvm::cl::opt<bool> 93c3437f05c638f8befda59170ae788873db24dc1cStephen HinesOptRSDebugContext("rs-debug-ctx", 94c3437f05c638f8befda59170ae788873db24dc1cStephen Hines llvm::cl::desc("Enable build to work with a RenderScript debug context")); 95c3437f05c638f8befda59170ae788873db24dc1cStephen Hines 96d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao//===----------------------------------------------------------------------===// 97d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao// Compiler Options 98d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao//===----------------------------------------------------------------------===// 991e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainarllvm::cl::opt<bool> 1001e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga NainarOptPIC("fPIC", llvm::cl::desc("Generate fully relocatable, position independent" 1011e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar " code")); 1021e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar 1031e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar// If set, use buildForCompatLib to embed RS symbol information into the object 1041e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar// file. The information is stored in the .rs.info variable. This option is 1051e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar// to be used in tandem with -fPIC. 1061e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainarllvm::cl::opt<bool> 1071e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga NainarOptEmbedRSInfo("embedRSInfo", 1081e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar llvm::cl::desc("Embed RS Info into the object file instead of generating" 1091e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar " a separate .o.info file")); 110d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 1117e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines// RenderScript uses -O3 by default 112d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaollvm::cl::opt<char> 113d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei LiaoOptOptLevel("O", llvm::cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " 1147e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines "(default: -O3)"), 1157e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines llvm::cl::Prefix, llvm::cl::ZeroOrMore, llvm::cl::init('3')); 116d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 117d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao// Override "bcc -version" since the LLVM version information is not correct on 118d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao// Android build. 119d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaovoid BCCVersionPrinter() { 120d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::raw_ostream &os = llvm::outs(); 121d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao os << "libbcc (The Android Open Source Project, http://www.android.com/):\n" 122c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet << " Default target: " << DEFAULT_TARGET_TRIPLE_STRING << "\n\n" 123c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet << "LLVM (http://llvm.org/):\n" 124d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao << " Version: " << PACKAGE_VERSION << "\n"; 125d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return; 126d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao} 127d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 128d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao} // end anonymous namespace 129d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 130d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaostatic inline 1317e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hinesbool ConfigCompiler(RSCompilerDriver &pRSCD) { 132b4447cd2b14f53efd9102d28da48000be7b2d4fdChris Wailes Compiler *RSC = pRSCD.getCompiler(); 133900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes CompilerConfig *config = nullptr; 134d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 135d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao config = new (std::nothrow) CompilerConfig(OptTargetTriple); 136900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (config == nullptr) { 137d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::errs() << "Out of memory when create the compiler configuration!\n"; 138d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return false; 139d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 140d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 141602ce0336c0ff5109923cee9b4426e913e718605Jian Li // llvm3.5 has removed the auto-detect feature for x86 subtarget, 142602ce0336c0ff5109923cee9b4426e913e718605Jian Li // so set features explicitly in bcc. 143602ce0336c0ff5109923cee9b4426e913e718605Jian Li if ((config->getTriple().find("i686") != std::string::npos) || 144602ce0336c0ff5109923cee9b4426e913e718605Jian Li (config->getTriple().find("x86_64") != std::string::npos)) { 145602ce0336c0ff5109923cee9b4426e913e718605Jian Li std::vector<std::string> fv; 146602ce0336c0ff5109923cee9b4426e913e718605Jian Li 147602ce0336c0ff5109923cee9b4426e913e718605Jian Li#if defined(__SSE3__) 148602ce0336c0ff5109923cee9b4426e913e718605Jian Li fv.push_back("+sse3"); 149602ce0336c0ff5109923cee9b4426e913e718605Jian Li#endif 150602ce0336c0ff5109923cee9b4426e913e718605Jian Li#if defined(__SSSE3__) 151602ce0336c0ff5109923cee9b4426e913e718605Jian Li fv.push_back("+ssse3"); 152602ce0336c0ff5109923cee9b4426e913e718605Jian Li#endif 153602ce0336c0ff5109923cee9b4426e913e718605Jian Li#if defined(__SSE4_1__) 154602ce0336c0ff5109923cee9b4426e913e718605Jian Li fv.push_back("+sse4.1"); 155602ce0336c0ff5109923cee9b4426e913e718605Jian Li#endif 156602ce0336c0ff5109923cee9b4426e913e718605Jian Li#if defined(__SSE4_2__) 157602ce0336c0ff5109923cee9b4426e913e718605Jian Li fv.push_back("+sse4.2"); 158602ce0336c0ff5109923cee9b4426e913e718605Jian Li#endif 159602ce0336c0ff5109923cee9b4426e913e718605Jian Li 160602ce0336c0ff5109923cee9b4426e913e718605Jian Li if (fv.size()) { 161602ce0336c0ff5109923cee9b4426e913e718605Jian Li config->setFeatureString(fv); 162602ce0336c0ff5109923cee9b4426e913e718605Jian Li } 163602ce0336c0ff5109923cee9b4426e913e718605Jian Li } 164602ce0336c0ff5109923cee9b4426e913e718605Jian Li 1651e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar if (OptPIC) { 1661e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar config->setRelocationModel(llvm::Reloc::PIC_); 1671e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar 1681e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar // For x86_64, CodeModel needs to be small if PIC_ reloc is used. 1691e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar // Otherwise, we end up with TEXTRELs in the shared library. 1701e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar if (config->getTriple().find("x86_64") != std::string::npos) { 1711e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar config->setCodeModel(llvm::CodeModel::Small); 1721e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar } 1731e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar } 174d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao switch (OptOptLevel) { 175d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao case '0': config->setOptimizationLevel(llvm::CodeGenOpt::None); break; 176d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao case '1': config->setOptimizationLevel(llvm::CodeGenOpt::Less); break; 1777e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines case '2': config->setOptimizationLevel(llvm::CodeGenOpt::Default); break; 1787e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines case '3': 179d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao default: { 1807e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines config->setOptimizationLevel(llvm::CodeGenOpt::Aggressive); 181d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao break; 182d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 183d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 184d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 1857e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines pRSCD.setConfig(config); 1867e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines Compiler::ErrorCode result = RSC->config(*config); 187d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 188c3437f05c638f8befda59170ae788873db24dc1cStephen Hines if (OptRSDebugContext) { 189c3437f05c638f8befda59170ae788873db24dc1cStephen Hines pRSCD.setDebugContext(true); 190c3437f05c638f8befda59170ae788873db24dc1cStephen Hines } 191c3437f05c638f8befda59170ae788873db24dc1cStephen Hines 192d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao if (result != Compiler::kSuccess) { 193d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::errs() << "Failed to configure the compiler! (detail: " 194d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao << Compiler::GetErrorString(result) << ")\n"; 195d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return false; 196d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 197d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 198d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return true; 199d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao} 200d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 201d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liaoint main(int argc, char **argv) { 202c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray 203c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::llvm_shutdown_obj Y; 204c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray init::Initialize(); 205d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::SetVersionPrinter(BCCVersionPrinter); 206d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao llvm::cl::ParseCommandLineOptions(argc, argv); 207f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet std::string commandLine = bcc::getCommandLine(argc, argv); 208d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 209d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao BCCContext context; 2108be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines RSCompilerDriver RSCD; 211d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 212c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet if (OptBCLibFilename.empty()) { 213c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet ALOGE("Failed to compile bit code, -bclib was not specified"); 214c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet return EXIT_FAILURE; 215c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet } 216c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet 217d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> mb_or_error = 218d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines llvm::MemoryBuffer::getFile(OptInputFilename.c_str()); 219d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines if (mb_or_error.getError()) { 2208be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines ALOGE("Failed to load bitcode from path %s! (%s)", 221d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines OptInputFilename.c_str(), mb_or_error.getError().message().c_str()); 222d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return EXIT_FAILURE; 223d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 224d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines std::unique_ptr<llvm::MemoryBuffer> input_data = std::move(mb_or_error.get()); 225d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 2261ae3fd6e2290fe1635bafe91a65e0e88e641b6fcStephen Hines const char *bitcode = input_data->getBufferStart(); 2271ae3fd6e2290fe1635bafe91a65e0e88e641b6fcStephen Hines size_t bitcodeSize = input_data->getBufferSize(); 2288be8dba08c97dff239ac8c6bdc7f3a52d96116aeStephen Hines 2297e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines if (!ConfigCompiler(RSCD)) { 2307e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines ALOGE("Failed to configure compiler"); 2317e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines return EXIT_FAILURE; 2327e9c1853efd1615e9187611e8f47ef3ec30de686Stephen Hines } 233c3437f05c638f8befda59170ae788873db24dc1cStephen Hines 234c3437f05c638f8befda59170ae788873db24dc1cStephen Hines // Attempt to dynamically initialize the compiler driver if such a function 235c3437f05c638f8befda59170ae788873db24dc1cStephen Hines // is present. It is only present if passed via "-load libFOO.so". 236c3437f05c638f8befda59170ae788873db24dc1cStephen Hines RSCompilerDriverInit_t rscdi = (RSCompilerDriverInit_t) 237c3437f05c638f8befda59170ae788873db24dc1cStephen Hines dlsym(RTLD_DEFAULT, STR(RS_COMPILER_DRIVER_INIT_FN)); 238900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (rscdi != nullptr) { 239c3437f05c638f8befda59170ae788873db24dc1cStephen Hines rscdi(&RSCD); 240c3437f05c638f8befda59170ae788873db24dc1cStephen Hines } 241c3437f05c638f8befda59170ae788873db24dc1cStephen Hines 2421e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar if (!OptEmbedRSInfo) { 2431e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar bool built = RSCD.build(context, OptOutputPath.c_str(), OptOutputFilename.c_str(), bitcode, 2441e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar bitcodeSize, commandLine.c_str(), OptBCLibFilename.c_str(), nullptr, 2451e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar OptEmitLLVM); 246d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 2471e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar if (!built) { 2481e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar return EXIT_FAILURE; 2491e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar } 2501e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar } 2511e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar else { 2521e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar // embedRSInfo is set. Use buildForCompatLib to embed RS symbol information 2531e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar // into the .rs.info symbol. 2541e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar Source *source = Source::CreateFromBuffer(context, OptInputFilename.c_str(), 2551e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar bitcode, bitcodeSize); 2561e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar RSScript *s = new (std::nothrow) RSScript(*source); 2571e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar if (s == nullptr) { 2581e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar llvm::errs() << "Out of memory when creating script for file `" 2591e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar << OptInputFilename << "'!\n"; 2601e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar delete source; 2611e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar return EXIT_FAILURE; 2621e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar } 2631e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar 2641e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar llvm::SmallString<80> output(OptOutputPath); 2651e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar llvm::sys::path::append(output, "/", OptOutputFilename); 2661e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar llvm::sys::path::replace_extension(output, ".o"); 2671e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar 2681e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar if (!RSCD.buildForCompatLib(*s, output.c_str(), OptBCLibFilename.c_str())) { 2691e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar fprintf(stderr, "Failed to compile script!"); 2701e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar return EXIT_FAILURE; 2711e0557ae75ae780352845bd2ba0f4babdc5ae4e6Pirama Arumuga Nainar } 272d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao } 273d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao 274d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao return EXIT_SUCCESS; 275d577d11347cdad9b88c0802bf6f5ee1fd3c06f19Shih-wei Liao} 276