Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(173)

Side by Side Diff: src/objects.cc

Issue 1208013002: [turbofan] Implement sharing of context-independent code. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@local_opt-code-map-3
Patch Set: Disable test for GC stress. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.h ('k') | test/cctest/test-compiler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <iomanip> 5 #include <iomanip>
6 #include <sstream> 6 #include <sstream>
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 9550 matching lines...) Expand 10 before | Expand all | Expand 10 after
9561 // In rare cases when that is not true, we mutate the clone's __proto__. 9561 // In rare cases when that is not true, we mutate the clone's __proto__.
9562 Handle<Object> original_prototype(map->prototype(), isolate); 9562 Handle<Object> original_prototype(map->prototype(), isolate);
9563 if (*original_prototype != clone->map()->prototype()) { 9563 if (*original_prototype != clone->map()->prototype()) {
9564 JSObject::SetPrototype(clone, original_prototype, false).Assert(); 9564 JSObject::SetPrototype(clone, original_prototype, false).Assert();
9565 } 9565 }
9566 9566
9567 return clone; 9567 return clone;
9568 } 9568 }
9569 9569
9570 9570
9571 void SharedFunctionInfo::AddSharedCodeToOptimizedCodeMap(
9572 Handle<SharedFunctionInfo> shared, Handle<Code> code) {
9573 Isolate* isolate = shared->GetIsolate();
9574 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION);
9575 Handle<Object> value(shared->optimized_code_map(), isolate);
9576 if (value->IsSmi()) return; // Empty code maps are unsupported.
9577 Handle<FixedArray> code_map = Handle<FixedArray>::cast(value);
9578 code_map->set(kSharedCodeIndex, *code);
9579 }
9580
9581
9571 void SharedFunctionInfo::AddToOptimizedCodeMap( 9582 void SharedFunctionInfo::AddToOptimizedCodeMap(
9572 Handle<SharedFunctionInfo> shared, 9583 Handle<SharedFunctionInfo> shared,
9573 Handle<Context> native_context, 9584 Handle<Context> native_context,
9574 Handle<Code> code, 9585 Handle<Code> code,
9575 Handle<FixedArray> literals, 9586 Handle<FixedArray> literals,
9576 BailoutId osr_ast_id) { 9587 BailoutId osr_ast_id) {
9577 Isolate* isolate = shared->GetIsolate(); 9588 Isolate* isolate = shared->GetIsolate();
9578 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION); 9589 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION);
9579 DCHECK(native_context->IsNativeContext()); 9590 DCHECK(native_context->IsNativeContext());
9580 STATIC_ASSERT(kEntryLength == 4); 9591 STATIC_ASSERT(kEntryLength == 4);
9581 Handle<FixedArray> new_code_map; 9592 Handle<FixedArray> new_code_map;
9582 Handle<Object> value(shared->optimized_code_map(), isolate); 9593 Handle<Object> value(shared->optimized_code_map(), isolate);
9583 int old_length; 9594 int old_length;
9584 if (value->IsSmi()) { 9595 if (value->IsSmi()) {
9585 // No optimized code map. 9596 // No optimized code map.
9586 DCHECK_EQ(0, Smi::cast(*value)->value()); 9597 DCHECK_EQ(0, Smi::cast(*value)->value());
9587 // Create 3 entries per context {context, code, literals}.
9588 new_code_map = isolate->factory()->NewFixedArray(kInitialLength); 9598 new_code_map = isolate->factory()->NewFixedArray(kInitialLength);
9589 old_length = kEntriesStart; 9599 old_length = kEntriesStart;
9590 } else { 9600 } else {
9591 // Copy old map and append one new entry. 9601 // Copy old map and append one new entry.
9592 Handle<FixedArray> old_code_map = Handle<FixedArray>::cast(value); 9602 Handle<FixedArray> old_code_map = Handle<FixedArray>::cast(value);
9593 DCHECK(!shared->SearchOptimizedCodeMap(*native_context, osr_ast_id).code); 9603 DCHECK(!shared->SearchOptimizedCodeMap(*native_context, osr_ast_id).code);
9594 old_length = old_code_map->length(); 9604 old_length = old_code_map->length();
9595 new_code_map = FixedArray::CopySize( 9605 new_code_map = FixedArray::CopySize(
9596 old_code_map, old_length + kEntryLength); 9606 old_code_map, old_length + kEntryLength);
9597 // Zap the old map for the sake of the heap verifier. 9607 // Zap the old map for the sake of the heap verifier.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
9665 code_map->set(dst + kCachedCodeOffset, 9675 code_map->set(dst + kCachedCodeOffset,
9666 code_map->get(src + kCachedCodeOffset)); 9676 code_map->get(src + kCachedCodeOffset));
9667 code_map->set(dst + kLiteralsOffset, 9677 code_map->set(dst + kLiteralsOffset,
9668 code_map->get(src + kLiteralsOffset)); 9678 code_map->get(src + kLiteralsOffset));
9669 code_map->set(dst + kOsrAstIdOffset, 9679 code_map->set(dst + kOsrAstIdOffset,
9670 code_map->get(src + kOsrAstIdOffset)); 9680 code_map->get(src + kOsrAstIdOffset));
9671 } 9681 }
9672 dst += kEntryLength; 9682 dst += kEntryLength;
9673 } 9683 }
9674 } 9684 }
9685 if (code_map->get(kSharedCodeIndex) == optimized_code) {
9686 // Evict context-independent code as well.
9687 code_map->set_undefined(kSharedCodeIndex);
9688 if (FLAG_trace_opt) {
9689 PrintF("[evicting entry from optimizing code map (%s) for ", reason);
9690 ShortPrint();
9691 PrintF(" (context-independent code)]\n");
9692 }
9693 }
9675 if (dst != length) { 9694 if (dst != length) {
9676 // Always trim even when array is cleared because of heap verifier. 9695 // Always trim even when array is cleared because of heap verifier.
9677 GetHeap()->RightTrimFixedArray<Heap::CONCURRENT_TO_SWEEPER>(code_map, 9696 GetHeap()->RightTrimFixedArray<Heap::CONCURRENT_TO_SWEEPER>(code_map,
9678 length - dst); 9697 length - dst);
9679 if (code_map->length() == kEntriesStart) ClearOptimizedCodeMap(); 9698 if (code_map->length() == kEntriesStart) ClearOptimizedCodeMap();
9680 } 9699 }
9681 } 9700 }
9682 9701
9683 9702
9684 void SharedFunctionInfo::TrimOptimizedCodeMap(int shrink_by) { 9703 void SharedFunctionInfo::TrimOptimizedCodeMap(int shrink_by) {
(...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after
10652 FixedArray* optimized_code_map = FixedArray::cast(value); 10671 FixedArray* optimized_code_map = FixedArray::cast(value);
10653 int length = optimized_code_map->length(); 10672 int length = optimized_code_map->length();
10654 Smi* osr_ast_id_smi = Smi::FromInt(osr_ast_id.ToInt()); 10673 Smi* osr_ast_id_smi = Smi::FromInt(osr_ast_id.ToInt());
10655 for (int i = kEntriesStart; i < length; i += kEntryLength) { 10674 for (int i = kEntriesStart; i < length; i += kEntryLength) {
10656 if (optimized_code_map->get(i + kContextOffset) == native_context && 10675 if (optimized_code_map->get(i + kContextOffset) == native_context &&
10657 optimized_code_map->get(i + kOsrAstIdOffset) == osr_ast_id_smi) { 10676 optimized_code_map->get(i + kOsrAstIdOffset) == osr_ast_id_smi) {
10658 return {Code::cast(optimized_code_map->get(i + kCachedCodeOffset)), 10677 return {Code::cast(optimized_code_map->get(i + kCachedCodeOffset)),
10659 FixedArray::cast(optimized_code_map->get(i + kLiteralsOffset))}; 10678 FixedArray::cast(optimized_code_map->get(i + kLiteralsOffset))};
10660 } 10679 }
10661 } 10680 }
10681 Object* shared_code = optimized_code_map->get(kSharedCodeIndex);
10682 if (shared_code->IsCode() && osr_ast_id.IsNone()) {
10683 return {Code::cast(shared_code), nullptr};
10684 }
10662 if (FLAG_trace_opt) { 10685 if (FLAG_trace_opt) {
10663 PrintF("[didn't find optimized code in optimized code map for "); 10686 PrintF("[didn't find optimized code in optimized code map for ");
10664 ShortPrint(); 10687 ShortPrint();
10665 PrintF("]\n"); 10688 PrintF("]\n");
10666 } 10689 }
10667 } 10690 }
10668 return {nullptr, nullptr}; 10691 return {nullptr, nullptr};
10669 } 10692 }
10670 10693
10671 10694
(...skipping 5483 matching lines...) Expand 10 before | Expand all | Expand 10 after
16155 Handle<Object> new_value) { 16178 Handle<Object> new_value) {
16156 if (cell->value() != *new_value) { 16179 if (cell->value() != *new_value) {
16157 cell->set_value(*new_value); 16180 cell->set_value(*new_value);
16158 Isolate* isolate = cell->GetIsolate(); 16181 Isolate* isolate = cell->GetIsolate();
16159 cell->dependent_code()->DeoptimizeDependentCodeGroup( 16182 cell->dependent_code()->DeoptimizeDependentCodeGroup(
16160 isolate, DependentCode::kPropertyCellChangedGroup); 16183 isolate, DependentCode::kPropertyCellChangedGroup);
16161 } 16184 }
16162 } 16185 }
16163 } // namespace internal 16186 } // namespace internal
16164 } // namespace v8 16187 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | test/cctest/test-compiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698