summaryrefslogtreecommitdiff
path: root/compiler/compiler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/compiler.cc')
-rw-r--r--compiler/compiler.cc22
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