Skip to content

Commit 25a1089

Browse files
Dominik InführV8 LUCI CQ
authored andcommitted
[compiler] Invoke method for skipped indirect write barrier
This CL now adds verification calls to skipped indirect write barriers. The compiler is allowed to remove such barriers on the most recent young allocation. When skipped write barrier verification mode is enabled, the compiler will invoke Heap::VerifySkippedIndirectWriteBarrier to check this. Bug: 437096305 Change-Id: I0294bd583654efe95a6c379a7cb0c8962005763c Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6919220 Commit-Queue: Dominik Inführ <[email protected]> Reviewed-by: Darius Mercadier <[email protected]> Cr-Commit-Position: refs/heads/main@{#102334}
1 parent 5abdd62 commit 25a1089

12 files changed

Lines changed: 146 additions & 30 deletions

src/codegen/arm64/macro-assembler-arm64.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4414,6 +4414,22 @@ void MacroAssembler::CallVerifySkippedWriteBarrierStub(Register object,
44144414
SetIsolateDataSlots::kNo);
44154415
}
44164416

4417+
void MacroAssembler::CallVerifySkippedIndirectWriteBarrierStubSaveRegisters(
4418+
Register object, Register value, SaveFPRegsMode fp_mode) {
4419+
ASM_CODE_COMMENT(this);
4420+
PushCallerSaved(fp_mode);
4421+
CallVerifySkippedIndirectWriteBarrierStub(object, value);
4422+
PopCallerSaved(fp_mode);
4423+
}
4424+
4425+
void MacroAssembler::CallVerifySkippedIndirectWriteBarrierStub(Register object,
4426+
Register value) {
4427+
ASM_CODE_COMMENT(this);
4428+
MovePair(kCArgRegs[0], object, kCArgRegs[1], value);
4429+
CallCFunction(ExternalReference::verify_skipped_indirect_write_barrier(), 2,
4430+
SetIsolateDataSlots::kNo);
4431+
}
4432+
44174433
void MacroAssembler::MoveObjectAndSlot(Register dst_object, Register dst_slot,
44184434
Register object, Operand offset) {
44194435
ASM_CODE_COMMENT(this);

src/codegen/arm64/macro-assembler-arm64.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,11 @@ class V8_EXPORT_PRIVATE MacroAssembler : public MacroAssemblerBase {
960960
SaveFPRegsMode fp_mode);
961961
void CallVerifySkippedWriteBarrierStub(Register object, Register value);
962962

963+
void CallVerifySkippedIndirectWriteBarrierStubSaveRegisters(
964+
Register object, Register value, SaveFPRegsMode fp_mode);
965+
void CallVerifySkippedIndirectWriteBarrierStub(Register object,
966+
Register value);
967+
963968
// For a given |object| and |offset|:
964969
// - Move |object| to |dst_object|.
965970
// - Compute the address of the slot pointed to by |offset| in |object| and

src/codegen/external-reference.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,9 @@ FUNCTION_REFERENCE(insert_remembered_set_function,
521521
FUNCTION_REFERENCE(verify_skipped_write_barrier,
522522
Heap::VerifySkippedWriteBarrier)
523523

524+
FUNCTION_REFERENCE(verify_skipped_indirect_write_barrier,
525+
Heap::VerifySkippedIndirectWriteBarrier)
526+
524527
namespace {
525528

526529
intptr_t DebugBreakAtEntry(Isolate* isolate, Address raw_sfi) {

src/codegen/external-reference.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,8 @@ enum class IsolateFieldId : uint8_t;
253253
"simple_name_dictionary_lookup_forwarded_string") \
254254
V(simple_name_dictionary_find_insertion_entry_forwarded_string, \
255255
"simple_name_dictionary_find_insertion_entry_forwarded_string") \
256+
V(verify_skipped_indirect_write_barrier, \
257+
"Heap::VerifySkippedIndirectWriteBarrier") \
256258
V(verify_skipped_write_barrier, "Heap::VerifySkippedWriteBarrier") \
257259
IF_WASM(V, wasm_start_stack, "wasm_start_stack") \
258260
IF_WASM(V, wasm_suspend_stack, "wasm_suspend_stack") \

src/codegen/x64/macro-assembler-x64.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,6 +1137,22 @@ void MacroAssembler::CallVerifySkippedWriteBarrierStub(Register object,
11371137
CallCFunction(ExternalReference::verify_skipped_write_barrier(), 2);
11381138
}
11391139

1140+
void MacroAssembler::CallVerifySkippedIndirectWriteBarrierStubSaveRegisters(
1141+
Register object, Register value, SaveFPRegsMode fp_mode) {
1142+
ASM_CODE_COMMENT(this);
1143+
PushCallerSaved(fp_mode);
1144+
CallVerifySkippedIndirectWriteBarrierStub(object, value);
1145+
PopCallerSaved(fp_mode);
1146+
}
1147+
1148+
void MacroAssembler::CallVerifySkippedIndirectWriteBarrierStub(Register object,
1149+
Register value) {
1150+
ASM_CODE_COMMENT(this);
1151+
MovePair(kCArgRegs[0], object, kCArgRegs[1], value);
1152+
PrepareCallCFunction(2);
1153+
CallCFunction(ExternalReference::verify_skipped_indirect_write_barrier(), 2);
1154+
}
1155+
11401156
#ifdef V8_IS_TSAN
11411157
void MacroAssembler::CallTSANStoreStub(Register address, Register value,
11421158
SaveFPRegsMode fp_mode, int size,

src/codegen/x64/macro-assembler-x64.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,11 @@ class V8_EXPORT_PRIVATE MacroAssembler
692692
SaveFPRegsMode fp_mode);
693693
void CallVerifySkippedWriteBarrierStub(Register object, Register value);
694694

695+
void CallVerifySkippedIndirectWriteBarrierStubSaveRegisters(
696+
Register object, Register value, SaveFPRegsMode fp_mode);
697+
void CallVerifySkippedIndirectWriteBarrierStub(Register object,
698+
Register value);
699+
695700
#ifdef V8_IS_TSAN
696701
void CallTSANStoreStub(Register address, Register value,
697702
SaveFPRegsMode fp_mode, int size, StubCallMode mode,

src/compiler/backend/arm/code-generator-arm.cc

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,12 +1056,11 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
10561056
__ dmb(ISH);
10571057
}
10581058

1059-
if (v8_flags.verify_write_barriers) {
1060-
auto ool = zone()->New<OutOfLineVerifySkippedWriteBarrier>(this, object,
1061-
value);
1062-
__ JumpIfNotSmi(value, ool->entry());
1063-
__ bind(ool->exit());
1064-
}
1059+
DCHECK(v8_flags.verify_write_barriers);
1060+
auto ool =
1061+
zone()->New<OutOfLineVerifySkippedWriteBarrier>(this, object, value);
1062+
__ JumpIfNotSmi(value, ool->entry());
1063+
__ bind(ool->exit());
10651064

10661065
if (addressing_mode == kMode_Offset_RI) {
10671066
int32_t immediate = i.InputInt32(1);

src/compiler/backend/arm64/code-generator-arm64.cc

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,30 @@ class OutOfLineVerifySkippedWriteBarrier final : public OutOfLineCode {
411411
Zone* zone_;
412412
};
413413

414+
class OutOfLineVerifySkippedIndirectWriteBarrier final : public OutOfLineCode {
415+
public:
416+
OutOfLineVerifySkippedIndirectWriteBarrier(CodeGenerator* gen,
417+
Register object, Register value)
418+
: OutOfLineCode(gen),
419+
object_(object),
420+
value_(value),
421+
zone_(gen->zone()) {}
422+
423+
void Generate() final {
424+
SaveFPRegsMode const save_fp_mode = frame()->DidAllocateDoubleRegisters()
425+
? SaveFPRegsMode::kSave
426+
: SaveFPRegsMode::kIgnore;
427+
428+
__ CallVerifySkippedIndirectWriteBarrierStubSaveRegisters(object_, value_,
429+
save_fp_mode);
430+
}
431+
432+
private:
433+
Register const object_;
434+
Register const value_;
435+
Zone* zone_;
436+
};
437+
414438
Condition FlagsConditionToCondition(FlagsCondition condition) {
415439
switch (condition) {
416440
case kEqual:
@@ -1305,12 +1329,11 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
13051329
__ Check(ne, AbortReason::kOperandIsCleared);
13061330
}
13071331

1308-
if (v8_flags.verify_write_barriers) {
1309-
auto ool = zone()->New<OutOfLineVerifySkippedWriteBarrier>(this, object,
1310-
value);
1311-
__ JumpIfNotSmi(value, ool->entry());
1312-
__ bind(ool->exit());
1313-
}
1332+
DCHECK(v8_flags.verify_write_barriers);
1333+
auto ool =
1334+
zone()->New<OutOfLineVerifySkippedWriteBarrier>(this, object, value);
1335+
__ JumpIfNotSmi(value, ool->entry());
1336+
__ bind(ool->exit());
13141337

13151338
RecordTrapInfoIfNeeded(zone(), this, opcode, instr, __ pc_offset());
13161339
__ StoreTaggedField(value, MemOperand(object, offset));
@@ -1355,12 +1378,11 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
13551378
Register temp = i.TempRegister(0);
13561379
__ Add(temp, object, offset);
13571380

1358-
if (v8_flags.verify_write_barriers) {
1359-
auto ool = zone()->New<OutOfLineVerifySkippedWriteBarrier>(this, object,
1360-
value);
1361-
__ JumpIfNotSmi(value, ool->entry());
1362-
__ bind(ool->exit());
1363-
}
1381+
DCHECK(v8_flags.verify_write_barriers);
1382+
auto ool =
1383+
zone()->New<OutOfLineVerifySkippedWriteBarrier>(this, object, value);
1384+
__ JumpIfNotSmi(value, ool->entry());
1385+
__ bind(ool->exit());
13641386

13651387
RecordTrapInfoIfNeeded(zone(), this, opcode, instr, __ pc_offset());
13661388
if (COMPRESS_POINTERS_BOOL) {
@@ -1414,6 +1436,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
14141436
DCHECK(IsValidIndirectPointerTag(tag));
14151437
#endif // DEBUG
14161438

1439+
DCHECK(v8_flags.verify_write_barriers);
1440+
auto ool = zone()->New<OutOfLineVerifySkippedIndirectWriteBarrier>(
1441+
this, object, value);
1442+
__ jmp(ool->entry());
1443+
__ bind(ool->exit());
1444+
14171445
RecordTrapInfoIfNeeded(zone(), this, opcode, instr, __ pc_offset());
14181446
__ StoreIndirectPointerField(value, MemOperand(object, offset));
14191447
break;

src/compiler/backend/ia32/code-generator-ia32.cc

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,12 +1059,11 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
10591059
__ Check(not_equal, AbortReason::kOperandIsCleared);
10601060
}
10611061

1062-
if (v8_flags.verify_write_barriers) {
1063-
auto ool = zone()->New<OutOfLineVerifySkippedWriteBarrier>(this, object,
1064-
value);
1065-
__ JumpIfNotSmi(value, ool->entry());
1066-
__ bind(ool->exit());
1067-
}
1062+
DCHECK(v8_flags.verify_write_barriers);
1063+
auto ool =
1064+
zone()->New<OutOfLineVerifySkippedWriteBarrier>(this, object, value);
1065+
__ JumpIfNotSmi(value, ool->entry());
1066+
__ bind(ool->exit());
10681067

10691068
if (arch_opcode == kArchStoreSkippedWriteBarrier) {
10701069
__ mov(operand, value);

src/compiler/backend/x64/code-generator-x64.cc

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,30 @@ class OutOfLineVerifySkippedWriteBarrier final : public OutOfLineCode {
499499
Zone* zone_;
500500
};
501501

502+
class OutOfLineVerifySkippedIndirectWriteBarrier final : public OutOfLineCode {
503+
public:
504+
OutOfLineVerifySkippedIndirectWriteBarrier(CodeGenerator* gen,
505+
Register object, Register value)
506+
: OutOfLineCode(gen),
507+
object_(object),
508+
value_(value),
509+
zone_(gen->zone()) {}
510+
511+
void Generate() final {
512+
SaveFPRegsMode const save_fp_mode = frame()->DidAllocateDoubleRegisters()
513+
? SaveFPRegsMode::kSave
514+
: SaveFPRegsMode::kIgnore;
515+
516+
__ CallVerifySkippedIndirectWriteBarrierStubSaveRegisters(object_, value_,
517+
save_fp_mode);
518+
}
519+
520+
private:
521+
Register const object_;
522+
Register const value_;
523+
Zone* zone_;
524+
};
525+
502526
template <std::memory_order order>
503527
int EmitStore(MacroAssembler* masm, Operand operand, Register value,
504528
MachineRepresentation rep) {
@@ -1921,12 +1945,11 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
19211945
Operand operand = i.MemoryOperand(&index);
19221946
Register value = i.InputRegister(index);
19231947

1924-
if (v8_flags.verify_write_barriers) {
1925-
auto ool = zone()->New<OutOfLineVerifySkippedWriteBarrier>(this, object,
1926-
value);
1927-
__ JumpIfNotSmi(value, ool->entry());
1928-
__ bind(ool->exit());
1929-
}
1948+
DCHECK(v8_flags.verify_write_barriers);
1949+
auto ool =
1950+
zone()->New<OutOfLineVerifySkippedWriteBarrier>(this, object, value);
1951+
__ JumpIfNotSmi(value, ool->entry());
1952+
__ bind(ool->exit());
19301953

19311954
if (arch_opcode == kArchStoreSkippedWriteBarrier) {
19321955
EmitTSANAwareStore<std::memory_order_relaxed>(
@@ -1964,6 +1987,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
19641987
break;
19651988
}
19661989
case kArchStoreIndirectSkippedWriteBarrier: {
1990+
Register object = i.InputRegister(0);
19671991
size_t index = 0;
19681992
Operand operand = i.MemoryOperand(&index);
19691993
Register value = i.InputRegister(index++);
@@ -1973,6 +1997,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
19731997
DCHECK(IsValidIndirectPointerTag(tag));
19741998
#endif // DEBUG
19751999

2000+
DCHECK(v8_flags.verify_write_barriers);
2001+
auto ool = zone()->New<OutOfLineVerifySkippedIndirectWriteBarrier>(
2002+
this, object, value);
2003+
__ jmp(ool->entry());
2004+
__ bind(ool->exit());
2005+
19762006
EmitTSANAwareStore<std::memory_order_relaxed>(
19772007
zone(), this, masm(), operand, value, i, DetermineStubCallMode(),
19782008
MachineRepresentation::kIndirectPointer, instr);

0 commit comments

Comments
 (0)