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