diff options
author | 2014-10-30 10:58:41 +0000 | |
---|---|---|
committer | 2014-10-31 12:21:53 +0000 | |
commit | b5f62b3dc5ac2731ba8ad53cdf3d9bdb14fbf86b (patch) | |
tree | fb2d33e43de1476af33112f263fd3c3a775917d0 /compiler/compiler.cc | |
parent | 29ce77f654412dbb5fb3d5949da4053952917101 (diff) |
Support for CONST_STRING in optimizing compiler.
Change-Id: Iab8517bdadd1d15ffbe570010f093660be7c51aa
Diffstat (limited to 'compiler/compiler.cc')
-rw-r--r-- | compiler/compiler.cc | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/compiler/compiler.cc b/compiler/compiler.cc index 36213ca417..744bafa0fe 100644 --- a/compiler/compiler.cc +++ b/compiler/compiler.cc @@ -79,4 +79,26 @@ Compiler* Compiler::Create(CompilerDriver* driver, Compiler::Kind kind) { } } +bool Compiler::IsPathologicalCase(const DexFile::CodeItem& code_item, + uint32_t method_idx, + const DexFile& dex_file) { + /* + * Skip compilation for pathologically large methods - either by instruction count or num vregs. + * Dalvik uses 16-bit uints for instruction and register counts. We'll limit to a quarter + * of that, which also guarantees we cannot overflow our 16-bit internal Quick SSA name space. + */ + if (code_item.insns_size_in_code_units_ >= UINT16_MAX / 4) { + LOG(INFO) << "Method exceeds compiler instruction limit: " + << code_item.insns_size_in_code_units_ + << " in " << PrettyMethod(method_idx, dex_file); + return true; + } + if (code_item.registers_size_ >= UINT16_MAX / 4) { + LOG(INFO) << "Method exceeds compiler virtual register limit: " + << code_item.registers_size_ << " in " << PrettyMethod(method_idx, dex_file); + return true; + } + return false; +} + } // namespace art |