diff options
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 |