Index: src/ic/ic.cc |
diff --git a/src/ic/ic.cc b/src/ic/ic.cc |
index 162e282d6a347fc03461c48d0376f8a37b7dc589..53dbe694eb31b17899d93c7e275ffe2c60e30487 100644 |
--- a/src/ic/ic.cc |
+++ b/src/ic/ic.cc |
@@ -2535,6 +2535,27 @@ MaybeHandle<Object> BinaryOpIC::Transition( |
Handle<Object> right) { |
BinaryOpICState state(isolate(), extra_ic_state()); |
+#ifdef V8_TARGET_ARCH_X64 |
+ // Crash instrumentation for crbug.com/621147. |
+ uintptr_t left_raw = reinterpret_cast<uintptr_t>(*left); |
+ uintptr_t hole_raw = |
+ reinterpret_cast<uintptr_t>(isolate()->heap()->the_hole_value()); |
+ if ((hole_raw & ((1ull << 32) - 1)) == (left_raw & ((1ull << 32) - 1))) { |
+ Code* c = GetCode(); |
+ Code::Kind kind = c->kind(); |
+ int instruction_size = c->instruction_size() + 2 * sizeof(Address); |
+ byte* instructions = static_cast<byte*>(alloca(instruction_size)); |
+ Address* start = reinterpret_cast<Address*>(instructions); |
+ start[0] = fp(); |
+ start[1] = pc(); |
+ for (int i = 2 * sizeof(Address); i < instruction_size; i++) { |
+ instructions[i] = c->instruction_start()[i]; |
+ } |
+ isolate()->PushStackTraceAndDie(0xBAAAAAAD, instructions, fp(), |
+ static_cast<unsigned int>(kind)); |
+ } |
+#endif // V8_TARGET_ARCH_X64 |
+ |
// Compute the actual result using the builtin for the binary operation. |
Handle<Object> result; |
switch (state.op()) { |