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