summaryrefslogtreecommitdiffstats
path: root/compiler/dex/dex_to_dex_compiler.cc
diff options
context:
space:
mode:
authorBrian Carlstrom <bdc@google.com>2013-07-31 11:26:53 -0700
committerBrian Carlstrom <bdc@google.com>2013-07-31 11:31:45 -0700
commit65573efdbaece978173ac45c170b1fe21c700396 (patch)
treef6aa5056f824f7ad81c8eac11d59b54a2e3b8d46 /compiler/dex/dex_to_dex_compiler.cc
parent025218c7e4330a4942b14f9a8f1f68bd3390261c (diff)
parent7ac77026f147ed0b04f6e26e4e3b9365380b2c90 (diff)
downloadandroid_art-65573efdbaece978173ac45c170b1fe21c700396.tar.gz
android_art-65573efdbaece978173ac45c170b1fe21c700396.tar.bz2
android_art-65573efdbaece978173ac45c170b1fe21c700396.zip
Merge remote-tracking branch 'goog/dalvik-dev' into merge-art-to-dalvik-dev
Change-Id: I323e9e8c29c3e39d50d9aba93121b26266c52a46
Diffstat (limited to 'compiler/dex/dex_to_dex_compiler.cc')
-rw-r--r--compiler/dex/dex_to_dex_compiler.cc35
1 files changed, 22 insertions, 13 deletions
diff --git a/compiler/dex/dex_to_dex_compiler.cc b/compiler/dex/dex_to_dex_compiler.cc
index 3c491ce20f..1ee29cbae1 100644
--- a/compiler/dex/dex_to_dex_compiler.cc
+++ b/compiler/dex/dex_to_dex_compiler.cc
@@ -36,9 +36,11 @@ const bool kEnableCheckCastEllision = true;
class DexCompiler {
public:
DexCompiler(art::CompilerDriver& compiler,
- const DexCompilationUnit& unit)
+ const DexCompilationUnit& unit,
+ DexToDexCompilationLevel dex_to_dex_compilation_level)
: driver_(compiler),
- unit_(unit) {}
+ unit_(unit),
+ dex_to_dex_compilation_level_(dex_to_dex_compilation_level) {}
~DexCompiler() {}
@@ -55,6 +57,10 @@ class DexCompiler {
return *const_cast<DexFile*>(unit_.GetDexFile());
}
+ bool PerformOptimizations() const {
+ return dex_to_dex_compilation_level_ >= kOptimize;
+ }
+
// Compiles a RETURN-VOID into a RETURN-VOID-BARRIER within a constructor where
// a barrier is required.
void CompileReturnVoid(Instruction* inst, uint32_t dex_pc);
@@ -84,6 +90,7 @@ class DexCompiler {
CompilerDriver& driver_;
const DexCompilationUnit& unit_;
+ const DexToDexCompilationLevel dex_to_dex_compilation_level_;
DISALLOW_COPY_AND_ASSIGN(DexCompiler);
};
@@ -138,6 +145,7 @@ class ScopedDexWriteAccess {
};
void DexCompiler::Compile() {
+ DCHECK_GE(dex_to_dex_compilation_level_, kRequired);
const DexFile::CodeItem* code_item = unit_.GetCodeItem();
const uint16_t* insns = code_item->insns_;
const uint32_t insns_size = code_item->insns_size_in_code_units_;
@@ -220,7 +228,7 @@ void DexCompiler::CompileReturnVoid(Instruction* inst, uint32_t dex_pc) {
}
Instruction* DexCompiler::CompileCheckCast(Instruction* inst, uint32_t dex_pc) {
- if (!kEnableCheckCastEllision) {
+ if (!kEnableCheckCastEllision || !PerformOptimizations()) {
return inst;
}
MethodReference referrer(&GetDexFile(), unit_.GetDexMethodIndex());
@@ -253,7 +261,7 @@ void DexCompiler::CompileInstanceFieldAccess(Instruction* inst,
uint32_t dex_pc,
Instruction::Code new_opcode,
bool is_put) {
- if (!kEnableQuickening) {
+ if (!kEnableQuickening || !PerformOptimizations()) {
return;
}
uint32_t field_idx = inst->VRegC_22c();
@@ -280,7 +288,7 @@ void DexCompiler::CompileInvokeVirtual(Instruction* inst,
uint32_t dex_pc,
Instruction::Code new_opcode,
bool is_range) {
- if (!kEnableQuickening) {
+ if (!kEnableQuickening || !PerformOptimizations()) {
return;
}
uint32_t method_idx = is_range ? inst->VRegB_3rc() : inst->VRegB_35c();
@@ -320,14 +328,15 @@ void DexCompiler::CompileInvokeVirtual(Instruction* inst,
} // namespace optimizer
} // namespace art
-extern "C" art::CompiledMethod*
- ArtCompileDEX(art::CompilerDriver& compiler, const art::DexFile::CodeItem* code_item,
+extern "C" void ArtCompileDEX(art::CompilerDriver& compiler, const art::DexFile::CodeItem* code_item,
uint32_t access_flags, art::InvokeType invoke_type,
uint32_t class_def_idx, uint32_t method_idx, jobject class_loader,
- const art::DexFile& dex_file) {
- art::DexCompilationUnit unit(NULL, class_loader, art::Runtime::Current()->GetClassLinker(),
- dex_file, code_item, class_def_idx, method_idx, access_flags);
- art::optimizer::DexCompiler dex_compiler(compiler, unit);
- dex_compiler.Compile();
- return NULL;
+ const art::DexFile& dex_file,
+ art::DexToDexCompilationLevel dex_to_dex_compilation_level) {
+ if (dex_to_dex_compilation_level != art::kDontDexToDexCompile) {
+ art::DexCompilationUnit unit(NULL, class_loader, art::Runtime::Current()->GetClassLinker(),
+ dex_file, code_item, class_def_idx, method_idx, access_flags);
+ art::optimizer::DexCompiler dex_compiler(compiler, unit, dex_to_dex_compilation_level);
+ dex_compiler.Compile();
+ }
}