Skip to content

Commit afba479

Browse files
ripsawridgeCommit bot
authored andcommitted
Extra code to diagnose a crash bug.
This will catch an invalid receiver before being passed to a load ic miss handler in the runtime. BUG= R=jkummerow@chromium.org Review URL: https://codereview.chromium.org/1351493002 Cr-Commit-Position: refs/heads/master@{#30768}
1 parent b5588f4 commit afba479

12 files changed

Lines changed: 57 additions & 17 deletions

File tree

src/builtins.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1739,7 +1739,7 @@ BUILTIN(HandleApiCallAsConstructor) {
17391739

17401740

17411741
static void Generate_LoadIC_Miss(MacroAssembler* masm) {
1742-
LoadIC::GenerateMiss(masm);
1742+
LoadIC::GenerateMiss(masm, LoadIC::kStressBuiltin);
17431743
}
17441744

17451745

src/full-codegen/x64/full-codegen-x64.cc

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2262,14 +2262,15 @@ void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
22622262
if (FeedbackVector()->GetIndex(prop->PropertyFeedbackSlot()) == 6) {
22632263
__ Pop(LoadDescriptor::ReceiverRegister());
22642264

2265-
Label ok;
2265+
Label ok, sound_alarm;
22662266
__ JumpIfSmi(rax, &ok, Label::kNear);
22672267
__ movp(rbx, FieldOperand(rax, HeapObject::kMapOffset));
2268-
__ CmpInstanceType(rbx, LAST_PRIMITIVE_TYPE);
2269-
__ j(below_equal, &ok, Label::kNear);
2270-
__ CmpInstanceType(rbx, FIRST_JS_RECEIVER_TYPE);
2271-
__ j(above_equal, &ok, Label::kNear);
2268+
__ CompareRoot(rbx, Heap::kMetaMapRootIndex);
2269+
__ j(equal, &sound_alarm);
2270+
__ CompareRoot(rbx, Heap::kFixedArrayMapRootIndex);
2271+
__ j(not_equal, &ok, Label::kNear);
22722272

2273+
__ bind(&sound_alarm);
22732274
__ Push(Smi::FromInt(0xaabbccdd));
22742275
__ Push(LoadDescriptor::ReceiverRegister());
22752276
__ movp(rbx, FieldOperand(LoadDescriptor::ReceiverRegister(),

src/ic/arm/ic-arm.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ static void LoadIC_PushArgs(MacroAssembler* masm) {
300300
}
301301

302302

303-
void LoadIC::GenerateMiss(MacroAssembler* masm) {
303+
void LoadIC::GenerateMiss(MacroAssembler* masm, int stress) {
304304
// The return address is in lr.
305305
Isolate* isolate = masm->isolate();
306306

src/ic/arm64/ic-arm64.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ void LoadIC::GenerateNormal(MacroAssembler* masm, LanguageMode language_mode) {
280280
}
281281

282282

283-
void LoadIC::GenerateMiss(MacroAssembler* masm) {
283+
void LoadIC::GenerateMiss(MacroAssembler* masm, int stress) {
284284
// The return address is in lr.
285285
Isolate* isolate = masm->isolate();
286286
ASM_LOCATION("LoadIC::GenerateMiss");

src/ic/ia32/ic-ia32.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ static void LoadIC_PushArgs(MacroAssembler* masm) {
672672
}
673673

674674

675-
void LoadIC::GenerateMiss(MacroAssembler* masm) {
675+
void LoadIC::GenerateMiss(MacroAssembler* masm, int stress) {
676676
// Return address is on the stack.
677677
__ IncrementCounter(masm->isolate()->counters()->load_miss(), 1);
678678
LoadIC_PushArgs(masm);

src/ic/ic.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,8 +323,17 @@ class LoadIC : public IC {
323323
}
324324

325325
// Code generator routines.
326-
static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); }
327-
static void GenerateMiss(MacroAssembler* masm);
326+
327+
// TODO(jkummerow): Remove the stress parameter and these stress constants
328+
// when a crash bug is fixed.
329+
static const int kStressNone = 0;
330+
static const int kStressInit = 1;
331+
static const int kStressDispatcher = 2;
332+
static const int kStressBuiltin = 3;
333+
static void GenerateInitialize(MacroAssembler* masm) {
334+
GenerateMiss(masm, kStressInit);
335+
}
336+
static void GenerateMiss(MacroAssembler* masm, int stress = kStressNone);
328337
static void GenerateRuntimeGetProperty(MacroAssembler* masm,
329338
LanguageMode language_mode);
330339
static void GenerateNormal(MacroAssembler* masm, LanguageMode language_mode);

src/ic/mips/ic-mips.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ static void LoadIC_PushArgs(MacroAssembler* masm) {
306306
}
307307

308308

309-
void LoadIC::GenerateMiss(MacroAssembler* masm) {
309+
void LoadIC::GenerateMiss(MacroAssembler* masm, int stress) {
310310
// The return address is in ra.
311311
Isolate* isolate = masm->isolate();
312312

src/ic/mips64/ic-mips64.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ static void LoadIC_PushArgs(MacroAssembler* masm) {
303303
}
304304

305305

306-
void LoadIC::GenerateMiss(MacroAssembler* masm) {
306+
void LoadIC::GenerateMiss(MacroAssembler* masm, int stress) {
307307
// The return address is on the stack.
308308
Isolate* isolate = masm->isolate();
309309

src/ic/ppc/ic-ppc.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ static void LoadIC_PushArgs(MacroAssembler* masm) {
310310
}
311311

312312

313-
void LoadIC::GenerateMiss(MacroAssembler* masm) {
313+
void LoadIC::GenerateMiss(MacroAssembler* masm, int stress) {
314314
// The return address is in lr.
315315
Isolate* isolate = masm->isolate();
316316

src/ic/x64/ic-x64.cc

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,14 +667,44 @@ static void LoadIC_PushArgs(MacroAssembler* masm) {
667667
}
668668

669669

670-
void LoadIC::GenerateMiss(MacroAssembler* masm) {
670+
void LoadIC::GenerateMiss(MacroAssembler* masm, int stress) {
671671
// The return address is on the stack.
672672

673673
Counters* counters = masm->isolate()->counters();
674674
__ IncrementCounter(counters->load_miss(), 1);
675675

676676
LoadIC_PushArgs(masm);
677677

678+
Register receiver = LoadDescriptor::ReceiverRegister();
679+
680+
// Sanity check: The receiver must be a JS-exposed kind of object,
681+
// not something internal (like a Map, or FixedArray). Check this here
682+
// to chase after a rare but recurring crash bug.
683+
// TODO(jkummerow): Remove this when it has generated a few crash reports.
684+
685+
Label ok, sound_alarm;
686+
__ JumpIfSmi(receiver, &ok, Label::kNear);
687+
__ movp(rbx, FieldOperand(receiver, HeapObject::kMapOffset));
688+
__ CompareRoot(rbx, Heap::kMetaMapRootIndex);
689+
__ j(equal, &sound_alarm);
690+
__ CompareRoot(rbx, Heap::kFixedArrayMapRootIndex);
691+
__ j(not_equal, &ok, Label::kNear);
692+
693+
// This cmpp instruction is only here to identify which of several kinds
694+
// of code blocks embedded the MISS code. (handler, dispatcher).
695+
__ cmpp(receiver, Immediate(stress));
696+
697+
__ bind(&sound_alarm);
698+
__ Push(Smi::FromInt(0xaabbccdd));
699+
__ Push(receiver);
700+
__ movp(rbx, FieldOperand(receiver, HeapObject::kMapOffset));
701+
__ Push(rbx);
702+
__ movp(rbx, FieldOperand(receiver, JSObject::kPropertiesOffset));
703+
__ Push(rbx);
704+
__ int3();
705+
706+
__ bind(&ok);
707+
678708
// Perform tail call to the entry.
679709
int arg_count = 4;
680710
__ TailCallRuntime(Runtime::kLoadIC_Miss, arg_count, 1);

0 commit comments

Comments
 (0)