blob: 049d6625416e5917c0ec79b4858791bd5660769a [file] [log] [blame]
buzbee67bf8852011-08-17 17:51:35 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Brian Carlstrom265091e2013-01-30 14:08:26 -080017#include <llvm/Support/Threading.h>
18
Ian Rogers1212a022013-03-04 10:48:41 -080019#include "compiler/driver/compiler_driver.h"
buzbeeefc63692012-11-14 16:31:52 -080020#include "compiler_internals.h"
buzbee311ca162013-02-28 15:56:43 -080021#include "dataflow_iterator.h"
Brian Carlstrom265091e2013-01-30 14:08:26 -080022#if defined(ART_USE_PORTABLE_COMPILER)
23#include "compiler/llvm/llvm_compilation_unit.h"
24#endif
Ian Rogers0571d352011-11-03 19:51:38 -070025#include "leb128.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080026#include "mirror/object.h"
Brian Carlstrom1f870082011-08-23 16:02:11 -070027#include "runtime.h"
buzbee395116c2013-02-27 14:30:25 -080028#include "quick/codegen_util.h"
29#include "portable/mir_to_gbc.h"
30#include "quick/mir_to_lir.h"
buzbee67bf8852011-08-17 17:51:35 -070031
buzbee4df2bbd2012-10-11 14:46:06 -070032namespace {
Ian Rogersc928de92013-02-27 14:30:44 -080033#if !defined(ART_USE_PORTABLE_COMPILER)
buzbee4df2bbd2012-10-11 14:46:06 -070034 pthread_once_t llvm_multi_init = PTHREAD_ONCE_INIT;
Shih-wei Liao215a9262012-10-12 10:29:46 -070035#endif
buzbee4df2bbd2012-10-11 14:46:06 -070036 void InitializeLLVMForQuick() {
Ian Rogers4c1c2832013-03-04 18:30:13 -080037 ::llvm::llvm_start_multithreaded();
buzbee4df2bbd2012-10-11 14:46:06 -070038 }
39}
buzbee4df2bbd2012-10-11 14:46:06 -070040
Elliott Hughes11d1b0c2012-01-23 16:57:47 -080041namespace art {
Ian Rogers4c1c2832013-03-04 18:30:13 -080042namespace llvm {
43::llvm::Module* makeLLVMModuleContents(::llvm::Module* module);
Ian Rogers76ae4fe2013-02-27 16:03:41 -080044}
Elliott Hughes11d1b0c2012-01-23 16:57:47 -080045
buzbee4df2bbd2012-10-11 14:46:06 -070046LLVMInfo::LLVMInfo() {
Ian Rogersc928de92013-02-27 14:30:44 -080047#if !defined(ART_USE_PORTABLE_COMPILER)
buzbee4df2bbd2012-10-11 14:46:06 -070048 pthread_once(&llvm_multi_init, InitializeLLVMForQuick);
49#endif
buzbee692be802012-08-29 15:52:59 -070050 // Create context, module, intrinsic helper & ir builder
Ian Rogers4c1c2832013-03-04 18:30:13 -080051 llvm_context_.reset(new ::llvm::LLVMContext());
52 llvm_module_ = new ::llvm::Module("art", *llvm_context_);
53 ::llvm::StructType::create(*llvm_context_, "JavaObject");
54 art::llvm::makeLLVMModuleContents(llvm_module_);
55 intrinsic_helper_.reset( new art::llvm::IntrinsicHelper(*llvm_context_, *llvm_module_));
56 ir_builder_.reset(new art::llvm::IRBuilder(*llvm_context_, *llvm_module_, *intrinsic_helper_));
buzbee692be802012-08-29 15:52:59 -070057}
58
buzbee4df2bbd2012-10-11 14:46:06 -070059LLVMInfo::~LLVMInfo() {
buzbee692be802012-08-29 15:52:59 -070060}
61
Ian Rogers1212a022013-03-04 10:48:41 -080062extern "C" void ArtInitQuickCompilerContext(art::CompilerDriver& compiler) {
buzbee692be802012-08-29 15:52:59 -070063 CHECK(compiler.GetCompilerContext() == NULL);
buzbeefa57c472012-11-21 12:06:18 -080064 LLVMInfo* llvm_info = new LLVMInfo();
65 compiler.SetCompilerContext(llvm_info);
buzbee692be802012-08-29 15:52:59 -070066}
67
Ian Rogers1212a022013-03-04 10:48:41 -080068extern "C" void ArtUnInitQuickCompilerContext(art::CompilerDriver& compiler) {
buzbee4df2bbd2012-10-11 14:46:06 -070069 delete reinterpret_cast<LLVMInfo*>(compiler.GetCompilerContext());
buzbee692be802012-08-29 15:52:59 -070070 compiler.SetCompilerContext(NULL);
71}
buzbee692be802012-08-29 15:52:59 -070072
buzbeece302932011-10-04 14:32:18 -070073/* Default optimizer/debug setting for the compiler. */
Elliott Hughese52e49b2012-04-02 16:05:44 -070074static uint32_t kCompilerOptimizerDisableFlags = 0 | // Disable specific optimizations
buzbee4ef3e452012-12-14 13:35:28 -080075 (1 << kLoadStoreElimination) |
Bill Buzbeea114add2012-05-03 15:00:40 -070076 //(1 << kLoadHoisting) |
77 //(1 << kSuppressLoads) |
78 //(1 << kNullCheckElimination) |
79 //(1 << kPromoteRegs) |
80 //(1 << kTrackLiveTemps) |
Bill Buzbeea114add2012-05-03 15:00:40 -070081 //(1 << kSafeOptimizations) |
82 //(1 << kBBOpt) |
83 //(1 << kMatch) |
84 //(1 << kPromoteCompilerTemps) |
85 0;
buzbeece302932011-10-04 14:32:18 -070086
Elliott Hughese52e49b2012-04-02 16:05:44 -070087static uint32_t kCompilerDebugFlags = 0 | // Enable debug/testing modes
Bill Buzbeea114add2012-05-03 15:00:40 -070088 //(1 << kDebugDisplayMissingTargets) |
89 //(1 << kDebugVerbose) |
90 //(1 << kDebugDumpCFG) |
91 //(1 << kDebugSlowFieldPath) |
92 //(1 << kDebugSlowInvokePath) |
93 //(1 << kDebugSlowStringPath) |
94 //(1 << kDebugSlowestFieldPath) |
95 //(1 << kDebugSlowestStringPath) |
96 //(1 << kDebugExerciseResolveMethod) |
97 //(1 << kDebugVerifyDataflow) |
98 //(1 << kDebugShowMemoryUsage) |
99 //(1 << kDebugShowNops) |
100 //(1 << kDebugCountOpcodes) |
buzbeed1643e42012-09-05 14:06:51 -0700101 //(1 << kDebugDumpCheckStats) |
buzbeead8f15e2012-06-18 14:49:45 -0700102 //(1 << kDebugDumpBitcodeFile) |
Bill Buzbeec9f40dd2012-08-15 11:35:25 -0700103 //(1 << kDebugVerifyBitcode) |
Bill Buzbeea114add2012-05-03 15:00:40 -0700104 0;
buzbeece302932011-10-04 14:32:18 -0700105
Ian Rogers1212a022013-03-04 10:48:41 -0800106static CompiledMethod* CompileMethod(CompilerDriver& compiler,
buzbeefa57c472012-11-21 12:06:18 -0800107 const CompilerBackend compiler_backend,
buzbee52a77fc2012-11-20 19:50:46 -0800108 const DexFile::CodeItem* code_item,
109 uint32_t access_flags, InvokeType invoke_type,
Ian Rogersfffdb022013-01-04 15:14:08 -0800110 uint32_t class_def_idx, uint32_t method_idx,
Brian Carlstrom265091e2013-01-30 14:08:26 -0800111 jobject class_loader, const DexFile& dex_file
112#if defined(ART_USE_PORTABLE_COMPILER)
113 , llvm::LlvmCompilationUnit* llvm_compilation_unit
114#endif
115)
buzbee67bf8852011-08-17 17:51:35 -0700116{
Bill Buzbeea114add2012-05-03 15:00:40 -0700117 VLOG(compiler) << "Compiling " << PrettyMethod(method_idx, dex_file) << "...";
Brian Carlstrom94496d32011-08-22 09:22:47 -0700118
buzbee311ca162013-02-28 15:56:43 -0800119 // FIXME: now we detect this in MIRGraph.
120 SpecialCaseHandler special_case = kNoHandler;
buzbee67bf8852011-08-17 17:51:35 -0700121
Bill Buzbeea114add2012-05-03 15:00:40 -0700122 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
buzbeefa57c472012-11-21 12:06:18 -0800123 UniquePtr<CompilationUnit> cu(new CompilationUnit);
buzbeeba938cb2012-02-03 14:47:55 -0800124
buzbee311ca162013-02-28 15:56:43 -0800125 if (!HeapInit(cu.get())) {
126 LOG(FATAL) << "Failed to initialize compiler heap";
127 }
Elliott Hughesb3bd5f02012-03-08 21:05:27 -0800128
Ian Rogers1212a022013-03-04 10:48:41 -0800129 cu->compiler_driver = &compiler;
buzbeefa57c472012-11-21 12:06:18 -0800130 cu->class_linker = class_linker;
buzbeefa57c472012-11-21 12:06:18 -0800131 cu->instruction_set = compiler.GetInstructionSet();
buzbeefa57c472012-11-21 12:06:18 -0800132 DCHECK((cu->instruction_set == kThumb2) ||
133 (cu->instruction_set == kX86) ||
134 (cu->instruction_set == kMips));
buzbee311ca162013-02-28 15:56:43 -0800135
136 cu->gen_bitcode = (compiler_backend == kPortable);
137
Brian Carlstrom265091e2013-01-30 14:08:26 -0800138#if defined(ART_USE_PORTABLE_COMPILER)
139 cu->llvm_compilation_unit = llvm_compilation_unit;
140 cu->llvm_info = llvm_compilation_unit->GetQuickContext();
141 cu->symbol = llvm_compilation_unit->GetDexCompilationUnit()->GetSymbol();
142#endif
Bill Buzbeea114add2012-05-03 15:00:40 -0700143 /* Adjust this value accordingly once inlining is performed */
buzbeefa57c472012-11-21 12:06:18 -0800144 cu->num_dalvik_registers = code_item->registers_size_;
Bill Buzbeea114add2012-05-03 15:00:40 -0700145 // TODO: set this from command line
buzbeefa57c472012-11-21 12:06:18 -0800146 cu->compiler_flip_match = false;
147 bool use_match = !cu->compiler_method_match.empty();
148 bool match = use_match && (cu->compiler_flip_match ^
149 (PrettyMethod(method_idx, dex_file).find(cu->compiler_method_match) !=
Bill Buzbeea114add2012-05-03 15:00:40 -0700150 std::string::npos));
buzbeefa57c472012-11-21 12:06:18 -0800151 if (!use_match || match) {
152 cu->disable_opt = kCompilerOptimizerDisableFlags;
153 cu->enable_debug = kCompilerDebugFlags;
154 cu->verbose = VLOG_IS_ON(compiler) ||
155 (cu->enable_debug & (1 << kDebugVerbose));
Bill Buzbeea114add2012-05-03 15:00:40 -0700156 }
buzbee311ca162013-02-28 15:56:43 -0800157
158 // If debug build, always verify bitcode.
159 if (kIsDebugBuild && cu->gen_bitcode) {
buzbeefa57c472012-11-21 12:06:18 -0800160 cu->enable_debug |= (1 << kDebugVerifyBitcode);
buzbee6969d502012-06-15 16:40:31 -0700161 }
buzbee9281f002012-10-24 12:17:24 -0700162
buzbeefa57c472012-11-21 12:06:18 -0800163 if (cu->instruction_set == kMips) {
jeffhao7fbee072012-08-24 17:56:54 -0700164 // Disable some optimizations for mips for now
buzbeefa57c472012-11-21 12:06:18 -0800165 cu->disable_opt |= (
jeffhao7fbee072012-08-24 17:56:54 -0700166 (1 << kLoadStoreElimination) |
167 (1 << kLoadHoisting) |
168 (1 << kSuppressLoads) |
169 (1 << kNullCheckElimination) |
170 (1 << kPromoteRegs) |
171 (1 << kTrackLiveTemps) |
jeffhao7fbee072012-08-24 17:56:54 -0700172 (1 << kSafeOptimizations) |
173 (1 << kBBOpt) |
174 (1 << kMatch) |
175 (1 << kPromoteCompilerTemps));
176 }
Bill Buzbeea114add2012-05-03 15:00:40 -0700177
buzbee311ca162013-02-28 15:56:43 -0800178 /* Assume leaf */
179 cu->attributes = METHOD_IS_LEAF;
180
181 cu->mir_graph.reset(new MIRGraph(cu.get()));
182
Bill Buzbeea114add2012-05-03 15:00:40 -0700183 /* Gathering opcode stats? */
184 if (kCompilerDebugFlags & (1 << kDebugCountOpcodes)) {
buzbee311ca162013-02-28 15:56:43 -0800185 cu->mir_graph->EnableOpcodeCounting();
Bill Buzbeea114add2012-05-03 15:00:40 -0700186 }
187
buzbee311ca162013-02-28 15:56:43 -0800188 /* Build the raw MIR graph */
189 cu->mir_graph->InlineMethod(code_item, access_flags, invoke_type, class_def_idx, method_idx,
190 class_loader, dex_file);
buzbee67bf8852011-08-17 17:51:35 -0700191
buzbee0967a252012-09-14 10:43:54 -0700192 /* Do a code layout pass */
buzbee311ca162013-02-28 15:56:43 -0800193 cu->mir_graph->CodeLayout();
buzbeed8506212012-12-20 14:15:05 -0800194
buzbeefa57c472012-11-21 12:06:18 -0800195 if (cu->enable_debug & (1 << kDebugVerifyDataflow)) {
buzbee311ca162013-02-28 15:56:43 -0800196 cu->mir_graph->VerifyDataflow();
Bill Buzbeea114add2012-05-03 15:00:40 -0700197 }
buzbee67bf8852011-08-17 17:51:35 -0700198
Bill Buzbeea114add2012-05-03 15:00:40 -0700199 /* Perform SSA transformation for the whole method */
buzbee311ca162013-02-28 15:56:43 -0800200 cu->mir_graph->SSATransformation();
buzbeed8506212012-12-20 14:15:05 -0800201
buzbee2cfc6392012-05-07 14:51:40 -0700202 /* Do constant propagation */
buzbee311ca162013-02-28 15:56:43 -0800203 cu->mir_graph->PropagateConstants();
buzbee67bf8852011-08-17 17:51:35 -0700204
Bill Buzbeea114add2012-05-03 15:00:40 -0700205 /* Count uses */
buzbee311ca162013-02-28 15:56:43 -0800206 cu->mir_graph->MethodUseCount();
buzbee67bf8852011-08-17 17:51:35 -0700207
Bill Buzbeea114add2012-05-03 15:00:40 -0700208 /* Perform null check elimination */
buzbee311ca162013-02-28 15:56:43 -0800209 cu->mir_graph->NullCheckElimination();
buzbeed8506212012-12-20 14:15:05 -0800210
buzbeed1643e42012-09-05 14:06:51 -0700211 /* Combine basic blocks where possible */
buzbee311ca162013-02-28 15:56:43 -0800212 cu->mir_graph->BasicBlockCombine();
buzbeed8506212012-12-20 14:15:05 -0800213
Bill Buzbeea114add2012-05-03 15:00:40 -0700214 /* Do some basic block optimizations */
buzbee311ca162013-02-28 15:56:43 -0800215 cu->mir_graph->BasicBlockOptimization();
buzbeed8506212012-12-20 14:15:05 -0800216
buzbeefa57c472012-11-21 12:06:18 -0800217 if (cu->enable_debug & (1 << kDebugDumpCheckStats)) {
buzbee311ca162013-02-28 15:56:43 -0800218 cu->mir_graph->DumpCheckStats();
buzbeed1643e42012-09-05 14:06:51 -0700219 }
220
buzbee311ca162013-02-28 15:56:43 -0800221 /* Set up regLocation[] array to describe values - one for each ssa_name. */
222 cu->mir_graph->BuildRegLocations();
buzbee2502e002012-12-31 16:05:53 -0800223
Brian Carlstrom265091e2013-01-30 14:08:26 -0800224#if defined(ART_USE_PORTABLE_COMPILER)
buzbee2cfc6392012-05-07 14:51:40 -0700225 /* Go the LLVM path? */
buzbeefa57c472012-11-21 12:06:18 -0800226 if (cu->gen_bitcode) {
buzbee2cfc6392012-05-07 14:51:40 -0700227 // MIR->Bitcode
buzbeefa57c472012-11-21 12:06:18 -0800228 MethodMIR2Bitcode(cu.get());
229 if (compiler_backend == kPortable) {
buzbeeabc4c6b2012-08-23 08:17:15 -0700230 // all done
buzbeefa57c472012-11-21 12:06:18 -0800231 ArenaReset(cu.get());
buzbeeabc4c6b2012-08-23 08:17:15 -0700232 return NULL;
233 }
Brian Carlstrom265091e2013-01-30 14:08:26 -0800234 } else
235#endif
236 {
buzbee311ca162013-02-28 15:56:43 -0800237 switch (compiler.GetInstructionSet()) {
238 case kThumb2:
239 InitArmCodegen(cu.get()); break;
240 case kMips:
241 InitMipsCodegen(cu.get()); break;
242 case kX86:
243 InitX86Codegen(cu.get()); break;
244 default:
245 LOG(FATAL) << "Unexpected instruction set: " << compiler.GetInstructionSet();
246 }
247
248// ** MOVE ALL OF THIS TO Codegen.materialize()
249
250 /* Initialize the switch_tables list */ // TO CODEGEN
251 CompilerInitGrowableList(cu.get(), &cu->switch_tables, 4,
252 kListSwitchTables);
253
254 /* Intialize the fill_array_data list */ // TO CODEGEN
255 CompilerInitGrowableList(cu.get(), &cu->fill_array_data, 4,
256 kListFillArrayData);
257
258 /* Intialize the throw_launchpads list, estimate size based on insns_size */ // TO CODEGEN
259 CompilerInitGrowableList(cu.get(), &cu->throw_launchpads, code_item->insns_size_in_code_units_,
260 kListThrowLaunchPads);
261
262 /* Intialize the instrinsic_launchpads list */ // TO_CODEGEN
263 CompilerInitGrowableList(cu.get(), &cu->intrinsic_launchpads, 4,
264 kListMisc);
265
266
267 /* Intialize the suspend_launchpads list */ // TO_CODEGEN
268 CompilerInitGrowableList(cu.get(), &cu->suspend_launchpads, 2048,
269 kListSuspendLaunchPads);
270
271 // TODO: Push these to codegen
272 cu.get()->cg->CompilerInitializeRegAlloc(cu.get()); // Needs to happen after SSA naming
273
274 /* Allocate Registers using simple local allocation scheme */
275 cu.get()->cg->SimpleRegAlloc(cu.get());
276
buzbeefa57c472012-11-21 12:06:18 -0800277 if (special_case != kNoHandler) {
buzbee2cfc6392012-05-07 14:51:40 -0700278 /*
279 * Custom codegen for special cases. If for any reason the
buzbeefa57c472012-11-21 12:06:18 -0800280 * special codegen doesn't succeed, cu->first_lir_insn will
buzbee2cfc6392012-05-07 14:51:40 -0700281 * set to NULL;
282 */
buzbeefa57c472012-11-21 12:06:18 -0800283 SpecialMIR2LIR(cu.get(), special_case);
buzbee2cfc6392012-05-07 14:51:40 -0700284 }
buzbee67bf8852011-08-17 17:51:35 -0700285
buzbee2cfc6392012-05-07 14:51:40 -0700286 /* Convert MIR to LIR, etc. */
buzbeefa57c472012-11-21 12:06:18 -0800287 if (cu->first_lir_insn == NULL) {
288 MethodMIR2LIR(cu.get());
buzbee2cfc6392012-05-07 14:51:40 -0700289 }
Bill Buzbeea114add2012-05-03 15:00:40 -0700290 }
buzbee67bf8852011-08-17 17:51:35 -0700291
Bill Buzbeea114add2012-05-03 15:00:40 -0700292 /* Method is not empty */
buzbeefa57c472012-11-21 12:06:18 -0800293 if (cu->first_lir_insn) {
buzbee67bf8852011-08-17 17:51:35 -0700294
Bill Buzbeea114add2012-05-03 15:00:40 -0700295 // mark the targets of switch statement case labels
buzbeefa57c472012-11-21 12:06:18 -0800296 ProcessSwitchTables(cu.get());
buzbee67bf8852011-08-17 17:51:35 -0700297
Bill Buzbeea114add2012-05-03 15:00:40 -0700298 /* Convert LIR into machine code. */
buzbeefa57c472012-11-21 12:06:18 -0800299 AssembleLIR(cu.get());
buzbee99ba9642012-01-25 14:23:14 -0800300
buzbeefa57c472012-11-21 12:06:18 -0800301 if (cu->verbose) {
302 CodegenDump(cu.get());
buzbee67bf8852011-08-17 17:51:35 -0700303 }
304
buzbee311ca162013-02-28 15:56:43 -0800305 }
306
307 if (kCompilerDebugFlags & (1 << kDebugCountOpcodes)) {
308 cu->mir_graph->ShowOpcodeStats();
Bill Buzbeea114add2012-05-03 15:00:40 -0700309 }
buzbeea7c12682012-03-19 13:13:53 -0700310
buzbeefa57c472012-11-21 12:06:18 -0800311 // Combine vmap tables - core regs, then fp regs - into vmap_table
312 std::vector<uint16_t> vmap_table;
buzbeeca7a5e42012-08-20 11:12:18 -0700313 // Core regs may have been inserted out of order - sort first
buzbeefa57c472012-11-21 12:06:18 -0800314 std::sort(cu->core_vmap_table.begin(), cu->core_vmap_table.end());
315 for (size_t i = 0 ; i < cu->core_vmap_table.size(); i++) {
buzbeeca7a5e42012-08-20 11:12:18 -0700316 // Copy, stripping out the phys register sort key
buzbeefa57c472012-11-21 12:06:18 -0800317 vmap_table.push_back(~(-1 << VREG_NUM_WIDTH) & cu->core_vmap_table[i]);
Bill Buzbeea114add2012-05-03 15:00:40 -0700318 }
319 // If we have a frame, push a marker to take place of lr
buzbeefa57c472012-11-21 12:06:18 -0800320 if (cu->frame_size > 0) {
321 vmap_table.push_back(INVALID_VREG);
Bill Buzbeea114add2012-05-03 15:00:40 -0700322 } else {
buzbeefa57c472012-11-21 12:06:18 -0800323 DCHECK_EQ(__builtin_popcount(cu->core_spill_mask), 0);
324 DCHECK_EQ(__builtin_popcount(cu->fp_spill_mask), 0);
Bill Buzbeea114add2012-05-03 15:00:40 -0700325 }
buzbeeca7a5e42012-08-20 11:12:18 -0700326 // Combine vmap tables - core regs, then fp regs. fp regs already sorted
buzbeefa57c472012-11-21 12:06:18 -0800327 for (uint32_t i = 0; i < cu->fp_vmap_table.size(); i++) {
328 vmap_table.push_back(cu->fp_vmap_table[i]);
Bill Buzbeea114add2012-05-03 15:00:40 -0700329 }
330 CompiledMethod* result =
buzbeefa57c472012-11-21 12:06:18 -0800331 new CompiledMethod(cu->instruction_set, cu->code_buffer,
332 cu->frame_size, cu->core_spill_mask, cu->fp_spill_mask,
333 cu->combined_mapping_table, vmap_table, cu->native_gc_map);
buzbee67bf8852011-08-17 17:51:35 -0700334
Bill Buzbeea114add2012-05-03 15:00:40 -0700335 VLOG(compiler) << "Compiled " << PrettyMethod(method_idx, dex_file)
buzbeefa57c472012-11-21 12:06:18 -0800336 << " (" << (cu->code_buffer.size() * sizeof(cu->code_buffer[0]))
Bill Buzbeea114add2012-05-03 15:00:40 -0700337 << " bytes)";
buzbee5abfa3e2012-01-31 17:01:43 -0800338
339#ifdef WITH_MEMSTATS
buzbeefa57c472012-11-21 12:06:18 -0800340 if (cu->enable_debug & (1 << kDebugShowMemoryUsage)) {
341 DumpMemStats(cu.get());
Bill Buzbeea114add2012-05-03 15:00:40 -0700342 }
buzbee5abfa3e2012-01-31 17:01:43 -0800343#endif
buzbee67bf8852011-08-17 17:51:35 -0700344
buzbeefa57c472012-11-21 12:06:18 -0800345 ArenaReset(cu.get());
buzbeeba938cb2012-02-03 14:47:55 -0800346
Bill Buzbeea114add2012-05-03 15:00:40 -0700347 return result;
buzbee67bf8852011-08-17 17:51:35 -0700348}
349
Ian Rogers1212a022013-03-04 10:48:41 -0800350CompiledMethod* CompileOneMethod(CompilerDriver& compiler,
buzbeec531cef2012-10-18 07:09:20 -0700351 const CompilerBackend backend,
buzbeeabc4c6b2012-08-23 08:17:15 -0700352 const DexFile::CodeItem* code_item,
Brian Carlstrom265091e2013-01-30 14:08:26 -0800353 uint32_t access_flags,
354 InvokeType invoke_type,
355 uint32_t class_def_idx,
356 uint32_t method_idx,
357 jobject class_loader,
buzbeec531cef2012-10-18 07:09:20 -0700358 const DexFile& dex_file,
Brian Carlstrom265091e2013-01-30 14:08:26 -0800359 llvm::LlvmCompilationUnit* llvm_compilation_unit)
buzbeeabc4c6b2012-08-23 08:17:15 -0700360{
Ian Rogersfffdb022013-01-04 15:14:08 -0800361 return CompileMethod(compiler, backend, code_item, access_flags, invoke_type, class_def_idx,
Brian Carlstrom265091e2013-01-30 14:08:26 -0800362 method_idx, class_loader, dex_file
363#if defined(ART_USE_PORTABLE_COMPILER)
364 , llvm_compilation_unit
365#endif
366 );
buzbeeabc4c6b2012-08-23 08:17:15 -0700367}
368
Elliott Hughes11d1b0c2012-01-23 16:57:47 -0800369} // namespace art
Elliott Hughesb3bd5f02012-03-08 21:05:27 -0800370
Bill Buzbeea114add2012-05-03 15:00:40 -0700371extern "C" art::CompiledMethod*
Ian Rogers1212a022013-03-04 10:48:41 -0800372 ArtQuickCompileMethod(art::CompilerDriver& compiler,
buzbeec531cef2012-10-18 07:09:20 -0700373 const art::DexFile::CodeItem* code_item,
374 uint32_t access_flags, art::InvokeType invoke_type,
Ian Rogersfffdb022013-01-04 15:14:08 -0800375 uint32_t class_def_idx, uint32_t method_idx, jobject class_loader,
buzbeec531cef2012-10-18 07:09:20 -0700376 const art::DexFile& dex_file)
Elliott Hughesb3bd5f02012-03-08 21:05:27 -0800377{
buzbeec531cef2012-10-18 07:09:20 -0700378 // TODO: check method fingerprint here to determine appropriate backend type. Until then, use build default
379 art::CompilerBackend backend = compiler.GetCompilerBackend();
buzbee52a77fc2012-11-20 19:50:46 -0800380 return art::CompileOneMethod(compiler, backend, code_item, access_flags, invoke_type,
Ian Rogersfffdb022013-01-04 15:14:08 -0800381 class_def_idx, method_idx, class_loader, dex_file,
382 NULL /* use thread llvm_info */);
Elliott Hughesb3bd5f02012-03-08 21:05:27 -0800383}