Commit c2c6bfba authored by Igor Sheludko's avatar Igor Sheludko Committed by V8 LUCI CQ

[ext-code-space] Migrate more code entries to CodeT

Namely,
- StackFrameInfo::code_object
- DependentCode's code entries
- OSROptimizedCodeCache's code entries

Bug: v8:11880
Change-Id: I49bc28f2935dd1561901932a2dfe0bf01bc6836e
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2969824Reviewed-by: 's avatarToon Verwaest <verwaest@chromium.org>
Commit-Queue: Igor Sheludko <ishell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#75234}
parent 046b58d6
...@@ -2430,7 +2430,7 @@ void StackFrameInfo::StackFrameInfoPrint(std::ostream& os) { ...@@ -2430,7 +2430,7 @@ void StackFrameInfo::StackFrameInfoPrint(std::ostream& os) {
PrintHeader(os, "StackFrameInfo"); PrintHeader(os, "StackFrameInfo");
os << "\n - receiver_or_instance: " << Brief(receiver_or_instance()); os << "\n - receiver_or_instance: " << Brief(receiver_or_instance());
os << "\n - function: " << Brief(function()); os << "\n - function: " << Brief(function());
os << "\n - code_object: " << Brief(code_object()); os << "\n - code_object: " << Brief(TorqueGeneratedClass::code_object());
os << "\n - code_offset_or_source_position: " os << "\n - code_offset_or_source_position: "
<< code_offset_or_source_position(); << code_offset_or_source_position();
os << "\n - flags: " << flags(); os << "\n - flags: " << flags();
......
...@@ -785,7 +785,8 @@ Handle<DependentCode> DependentCode::InsertWeakCode( ...@@ -785,7 +785,8 @@ Handle<DependentCode> DependentCode::InsertWeakCode(
// Check for existing entry to avoid duplicates. // Check for existing entry to avoid duplicates.
{ {
DisallowHeapAllocation no_gc; DisallowHeapAllocation no_gc;
HeapObjectReference weak_code_entry = HeapObjectReference::Weak(*code); HeapObjectReference weak_code_entry =
HeapObjectReference::Weak(ToCodeT(*code));
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
if (entries->object_at(i) == weak_code_entry) return entries; if (entries->object_at(i) == weak_code_entry) return entries;
} }
...@@ -796,7 +797,8 @@ Handle<DependentCode> DependentCode::InsertWeakCode( ...@@ -796,7 +797,8 @@ Handle<DependentCode> DependentCode::InsertWeakCode(
count = entries->count(); count = entries->count();
} }
DisallowHeapAllocation no_gc; DisallowHeapAllocation no_gc;
HeapObjectReference weak_code_entry = HeapObjectReference::Weak(*code); HeapObjectReference weak_code_entry =
HeapObjectReference::Weak(ToCodeT(*code));
entries->set_object_at(count, weak_code_entry); entries->set_object_at(count, weak_code_entry);
entries->set_count(count + 1); entries->set_count(count + 1);
return entries; return entries;
...@@ -812,7 +814,8 @@ Handle<DependentCode> DependentCode::New(Isolate* isolate, ...@@ -812,7 +814,8 @@ Handle<DependentCode> DependentCode::New(Isolate* isolate,
result->set_next_link(*next); result->set_next_link(*next);
result->set_flags(GroupField::encode(group) | CountField::encode(1)); result->set_flags(GroupField::encode(group) | CountField::encode(1));
HeapObjectReference weak_code_entry = HeapObjectReference::Weak(*code); HeapObjectReference weak_code_entry =
HeapObjectReference::Weak(ToCodeT(*code));
result->set_object_at(0, weak_code_entry); result->set_object_at(0, weak_code_entry);
return result; return result;
} }
...@@ -863,7 +866,8 @@ bool DependentCode::MarkCodeForDeoptimization( ...@@ -863,7 +866,8 @@ bool DependentCode::MarkCodeForDeoptimization(
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
MaybeObject obj = object_at(i); MaybeObject obj = object_at(i);
if (obj->IsCleared()) continue; if (obj->IsCleared()) continue;
Code code = Code::cast(obj->GetHeapObjectAssumeWeak()); // TODO(v8:11880): avoid roundtrips between cdc and code.
Code code = FromCodeT(CodeT::cast(obj->GetHeapObjectAssumeWeak()));
if (!code.marked_for_deoptimization()) { if (!code.marked_for_deoptimization()) {
code.SetMarkedForDeoptimization(DependencyGroupName(group)); code.SetMarkedForDeoptimization(DependencyGroupName(group));
marked = true; marked = true;
......
...@@ -2,13 +2,13 @@ ...@@ -2,13 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "src/objects/osr-optimized-code-cache.h"
#include "src/execution/isolate-inl.h" #include "src/execution/isolate-inl.h"
#include "src/objects/code.h" #include "src/objects/code.h"
#include "src/objects/maybe-object.h" #include "src/objects/maybe-object.h"
#include "src/objects/shared-function-info.h" #include "src/objects/shared-function-info.h"
#include "src/objects/osr-optimized-code-cache.h"
namespace v8 { namespace v8 {
namespace internal { namespace internal {
...@@ -114,9 +114,10 @@ void OSROptimizedCodeCache::EvictMarkedCode(Isolate* isolate) { ...@@ -114,9 +114,10 @@ void OSROptimizedCodeCache::EvictMarkedCode(Isolate* isolate) {
HeapObject heap_object; HeapObject heap_object;
if (!code_entry->GetHeapObject(&heap_object)) continue; if (!code_entry->GetHeapObject(&heap_object)) continue;
DCHECK(heap_object.IsCode()); // TODO(v8:11880): avoid roundtrips between cdc and code.
DCHECK(Code::cast(heap_object).is_optimized_code()); Code code = FromCodeT(CodeT::cast(heap_object));
if (!Code::cast(heap_object).marked_for_deoptimization()) continue; DCHECK(code.is_optimized_code());
if (!code.marked_for_deoptimization()) continue;
ClearEntry(index, isolate); ClearEntry(index, isolate);
} }
...@@ -145,7 +146,8 @@ Code OSROptimizedCodeCache::GetCodeFromEntry(int index) { ...@@ -145,7 +146,8 @@ Code OSROptimizedCodeCache::GetCodeFromEntry(int index) {
HeapObject code_entry; HeapObject code_entry;
Get(index + OSRCodeCacheConstants::kCachedCodeOffset) Get(index + OSRCodeCacheConstants::kCachedCodeOffset)
->GetHeapObject(&code_entry); ->GetHeapObject(&code_entry);
return code_entry.is_null() ? Code() : Code::cast(code_entry); if (code_entry.is_null()) return Code();
return FromCodeT(CodeT::cast(code_entry));
} }
SharedFunctionInfo OSROptimizedCodeCache::GetSFIFromEntry(int index) { SharedFunctionInfo OSROptimizedCodeCache::GetSFIFromEntry(int index) {
...@@ -192,8 +194,9 @@ void OSROptimizedCodeCache::InitializeEntry(int entry, ...@@ -192,8 +194,9 @@ void OSROptimizedCodeCache::InitializeEntry(int entry,
BytecodeOffset osr_offset) { BytecodeOffset osr_offset) {
Set(entry + OSRCodeCacheConstants::kSharedOffset, Set(entry + OSRCodeCacheConstants::kSharedOffset,
HeapObjectReference::Weak(shared)); HeapObjectReference::Weak(shared));
Set(entry + OSRCodeCacheConstants::kCachedCodeOffset, HeapObjectReference weak_code_entry =
HeapObjectReference::Weak(code)); HeapObjectReference::Weak(ToCodeT(code));
Set(entry + OSRCodeCacheConstants::kCachedCodeOffset, weak_code_entry);
Set(entry + OSRCodeCacheConstants::kOsrIdOffset, Set(entry + OSRCodeCacheConstants::kOsrIdOffset,
MaybeObject::FromSmi(Smi::FromInt(osr_offset.ToInt()))); MaybeObject::FromSmi(Smi::FromInt(osr_offset.ToInt())));
} }
......
...@@ -32,6 +32,26 @@ BOOL_GETTER(StackFrameInfo, flags, IsStrict, IsStrictBit::kShift) ...@@ -32,6 +32,26 @@ BOOL_GETTER(StackFrameInfo, flags, IsStrict, IsStrictBit::kShift)
BOOL_GETTER(StackFrameInfo, flags, IsConstructor, IsConstructorBit::kShift) BOOL_GETTER(StackFrameInfo, flags, IsConstructor, IsConstructorBit::kShift)
BOOL_GETTER(StackFrameInfo, flags, IsAsync, IsAsyncBit::kShift) BOOL_GETTER(StackFrameInfo, flags, IsAsync, IsAsyncBit::kShift)
DEF_GETTER(StackFrameInfo, code_object, HeapObject) {
HeapObject value = TorqueGeneratedClass::code_object(cage_base);
// The |code_object| field can contain many types of objects, but only CodeT
// values have to be converted to Code.
if (V8_EXTERNAL_CODE_SPACE_BOOL && value.IsCodeT()) {
return FromCodeT(CodeT::cast(value));
}
return value;
}
void StackFrameInfo::set_code_object(HeapObject code, WriteBarrierMode mode) {
// The |code_object| field can contain many types of objects, but only Code
// values have to be converted to CodeT.
if (V8_EXTERNAL_CODE_SPACE_BOOL && code.IsCode()) {
TorqueGeneratedClass::set_code_object(ToCodeT(Code::cast(code)), mode);
} else {
TorqueGeneratedClass::set_code_object(code, mode);
}
}
} // namespace internal } // namespace internal
} // namespace v8 } // namespace v8
......
...@@ -41,6 +41,8 @@ class StackFrameInfo ...@@ -41,6 +41,8 @@ class StackFrameInfo
bool IsPromiseAny() const; bool IsPromiseAny() const;
bool IsNative() const; bool IsNative() const;
DECL_ACCESSORS(code_object, HeapObject)
// Dispatched behavior. // Dispatched behavior.
DECL_PRINTER(StackFrameInfo) DECL_PRINTER(StackFrameInfo)
DECL_VERIFIER(StackFrameInfo) DECL_VERIFIER(StackFrameInfo)
......
...@@ -3995,8 +3995,8 @@ TEST(EnsureAllocationSiteDependentCodesProcessed) { ...@@ -3995,8 +3995,8 @@ TEST(EnsureAllocationSiteDependentCodesProcessed) {
DependentCode::kAllocationSiteTenuringChangedGroup); DependentCode::kAllocationSiteTenuringChangedGroup);
CHECK_EQ(1, dependency.count()); CHECK_EQ(1, dependency.count());
CHECK(dependency.object_at(0)->IsWeak()); CHECK(dependency.object_at(0)->IsWeak());
Code function_bar = Code function_bar = FromCodeT(
Code::cast(dependency.object_at(0)->GetHeapObjectAssumeWeak()); CodeT::cast(dependency.object_at(0)->GetHeapObjectAssumeWeak()));
CHECK_EQ(bar_handle->code(), function_bar); CHECK_EQ(bar_handle->code(), function_bar);
dependency = dependency.next_link(); dependency = dependency.next_link();
dependency_group_count++; dependency_group_count++;
......
...@@ -56,15 +56,15 @@ TEST(WeakReferencesBasic) { ...@@ -56,15 +56,15 @@ TEST(WeakReferencesBasic) {
Factory::CodeBuilder(isolate, desc, CodeKind::FOR_TESTING).Build(); Factory::CodeBuilder(isolate, desc, CodeKind::FOR_TESTING).Build();
CHECK(code->IsCode()); CHECK(code->IsCode());
lh->set_data1(HeapObjectReference::Weak(*code)); lh->set_data1(HeapObjectReference::Weak(ToCodeT(*code)));
HeapObject code_heap_object; HeapObject code_heap_object;
CHECK(lh->data1()->GetHeapObjectIfWeak(&code_heap_object)); CHECK(lh->data1()->GetHeapObjectIfWeak(&code_heap_object));
CHECK_EQ(*code, code_heap_object); CHECK_EQ(ToCodeT(*code), code_heap_object);
CcTest::CollectAllGarbage(); CcTest::CollectAllGarbage();
CHECK(lh->data1()->GetHeapObjectIfWeak(&code_heap_object)); CHECK(lh->data1()->GetHeapObjectIfWeak(&code_heap_object));
CHECK_EQ(*code, code_heap_object); CHECK_EQ(ToCodeT(*code), code_heap_object);
} // code will go out of scope. } // code will go out of scope.
CcTest::CollectAllGarbage(); CcTest::CollectAllGarbage();
......
...@@ -66,7 +66,7 @@ TEST_F(TestWithNativeContext, AddCodeToEmptyCache) { ...@@ -66,7 +66,7 @@ TEST_F(TestWithNativeContext, AddCodeToEmptyCache) {
HeapObject code_entry; HeapObject code_entry;
osr_cache->Get(OSROptimizedCodeCache::kCachedCodeOffset) osr_cache->Get(OSROptimizedCodeCache::kCachedCodeOffset)
->GetHeapObject(&code_entry); ->GetHeapObject(&code_entry);
EXPECT_EQ(code_entry, *code); EXPECT_EQ(code_entry, ToCodeT(*code));
Smi osr_offset_entry; Smi osr_offset_entry;
osr_cache->Get(OSROptimizedCodeCache::kOsrIdOffset)->ToSmi(&osr_offset_entry); osr_cache->Get(OSROptimizedCodeCache::kOsrIdOffset)->ToSmi(&osr_offset_entry);
EXPECT_EQ(osr_offset_entry.value(), bailout_id.ToInt()); EXPECT_EQ(osr_offset_entry.value(), bailout_id.ToInt());
...@@ -108,7 +108,7 @@ TEST_F(TestWithNativeContext, GrowCodeCache) { ...@@ -108,7 +108,7 @@ TEST_F(TestWithNativeContext, GrowCodeCache) {
HeapObject code_entry; HeapObject code_entry;
osr_cache->Get(index + OSROptimizedCodeCache::kCachedCodeOffset) osr_cache->Get(index + OSROptimizedCodeCache::kCachedCodeOffset)
->GetHeapObject(&code_entry); ->GetHeapObject(&code_entry);
EXPECT_EQ(code_entry, *code); EXPECT_EQ(code_entry, ToCodeT(*code));
Smi osr_offset_entry; Smi osr_offset_entry;
osr_cache->Get(index + OSROptimizedCodeCache::kOsrIdOffset) osr_cache->Get(index + OSROptimizedCodeCache::kOsrIdOffset)
->ToSmi(&osr_offset_entry); ->ToSmi(&osr_offset_entry);
...@@ -204,7 +204,7 @@ TEST_F(TestWithNativeContext, MaxCapacityCache) { ...@@ -204,7 +204,7 @@ TEST_F(TestWithNativeContext, MaxCapacityCache) {
EXPECT_EQ(object, *shared1); EXPECT_EQ(object, *shared1);
osr_cache->Get(index + OSROptimizedCodeCache::kCachedCodeOffset) osr_cache->Get(index + OSROptimizedCodeCache::kCachedCodeOffset)
->GetHeapObject(&object); ->GetHeapObject(&object);
EXPECT_EQ(object, *code1); EXPECT_EQ(object, ToCodeT(*code1));
osr_cache->Get(index + OSROptimizedCodeCache::kOsrIdOffset)->ToSmi(&smi); osr_cache->Get(index + OSROptimizedCodeCache::kOsrIdOffset)->ToSmi(&smi);
EXPECT_EQ(smi.value(), bailout_id); EXPECT_EQ(smi.value(), bailout_id);
...@@ -227,7 +227,7 @@ TEST_F(TestWithNativeContext, MaxCapacityCache) { ...@@ -227,7 +227,7 @@ TEST_F(TestWithNativeContext, MaxCapacityCache) {
EXPECT_EQ(object, *shared2); EXPECT_EQ(object, *shared2);
osr_cache->Get(index + OSROptimizedCodeCache::kCachedCodeOffset) osr_cache->Get(index + OSROptimizedCodeCache::kCachedCodeOffset)
->GetHeapObject(&object); ->GetHeapObject(&object);
EXPECT_EQ(object, *code2); EXPECT_EQ(object, ToCodeT(*code2));
osr_cache->Get(index + OSROptimizedCodeCache::kOsrIdOffset)->ToSmi(&smi); osr_cache->Get(index + OSROptimizedCodeCache::kOsrIdOffset)->ToSmi(&smi);
EXPECT_EQ(smi.value(), bailout_id); EXPECT_EQ(smi.value(), bailout_id);
} }
...@@ -282,7 +282,7 @@ TEST_F(TestWithNativeContext, ReuseClearedEntry) { ...@@ -282,7 +282,7 @@ TEST_F(TestWithNativeContext, ReuseClearedEntry) {
EXPECT_EQ(object, *shared1); EXPECT_EQ(object, *shared1);
osr_cache->Get(index + OSROptimizedCodeCache::kCachedCodeOffset) osr_cache->Get(index + OSROptimizedCodeCache::kCachedCodeOffset)
->GetHeapObject(&object); ->GetHeapObject(&object);
EXPECT_EQ(object, *code1); EXPECT_EQ(object, ToCodeT(*code1));
osr_cache->Get(index + OSROptimizedCodeCache::kOsrIdOffset)->ToSmi(&smi); osr_cache->Get(index + OSROptimizedCodeCache::kOsrIdOffset)->ToSmi(&smi);
EXPECT_EQ(smi.value(), bailout_id); EXPECT_EQ(smi.value(), bailout_id);
...@@ -304,7 +304,7 @@ TEST_F(TestWithNativeContext, ReuseClearedEntry) { ...@@ -304,7 +304,7 @@ TEST_F(TestWithNativeContext, ReuseClearedEntry) {
EXPECT_EQ(object, *shared2); EXPECT_EQ(object, *shared2);
osr_cache->Get(index + OSROptimizedCodeCache::kCachedCodeOffset) osr_cache->Get(index + OSROptimizedCodeCache::kCachedCodeOffset)
->GetHeapObject(&object); ->GetHeapObject(&object);
EXPECT_EQ(object, *code2); EXPECT_EQ(object, ToCodeT(*code2));
osr_cache->Get(index + OSROptimizedCodeCache::kOsrIdOffset)->ToSmi(&smi); osr_cache->Get(index + OSROptimizedCodeCache::kOsrIdOffset)->ToSmi(&smi);
EXPECT_EQ(smi.value(), bailout_id); EXPECT_EQ(smi.value(), bailout_id);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment