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

Side by Side Diff: src/objects.cc

Issue 450103004: Reland "More lazy deoptimization in Turbofan (binops, loads/stores)" (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add missing deopts (still with invalid bailout id) Created 6 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « src/deoptimizer.cc ('k') | test/cctest/cctest.status » ('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 "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/allocation-site-scopes.h" 8 #include "src/allocation-site-scopes.h"
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/arguments.h" 10 #include "src/arguments.h"
(...skipping 10708 matching lines...) Expand 10 before | Expand all | Expand 10 after
10719 } 10719 }
10720 } 10720 }
10721 it.next(); 10721 it.next();
10722 } 10722 }
10723 return statement_position; 10723 return statement_position;
10724 } 10724 }
10725 10725
10726 10726
10727 SafepointEntry Code::GetSafepointEntry(Address pc) { 10727 SafepointEntry Code::GetSafepointEntry(Address pc) {
10728 SafepointTable table(this); 10728 SafepointTable table(this);
10729 return table.FindEntry(pc); 10729 SafepointEntry entry = table.FindEntry(pc);
10730 if (entry.is_valid() || !is_turbofanned()) {
10731 return entry;
10732 }
10733
10734 // If the code is turbofanned, we might be looking for
10735 // an address that was patched by lazy deoptimization.
10736 // In that case look through the patch table, try to
10737 // lookup the original address there, and then use this
10738 // to find the safepoint entry.
10739 DeoptimizationInputData* deopt_data =
10740 DeoptimizationInputData::cast(deoptimization_data());
10741 intptr_t offset = pc - instruction_start();
10742 for (int i = 0; i < deopt_data->ReturnAddressPatchCount(); i++) {
10743 if (deopt_data->PatchedAddressPc(i)->value() == offset) {
10744 int original_offset = deopt_data->ReturnAddressPc(i)->value();
10745 return table.FindEntry(instruction_start() + original_offset);
10746 }
10747 }
10748 return SafepointEntry();
10730 } 10749 }
10731 10750
10732 10751
10733 Object* Code::FindNthObject(int n, Map* match_map) { 10752 Object* Code::FindNthObject(int n, Map* match_map) {
10734 DCHECK(is_inline_cache_stub()); 10753 DCHECK(is_inline_cache_stub());
10735 DisallowHeapAllocation no_allocation; 10754 DisallowHeapAllocation no_allocation;
10736 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); 10755 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
10737 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10756 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10738 RelocInfo* info = it.rinfo(); 10757 RelocInfo* info = it.rinfo();
10739 Object* object = info->target_object(); 10758 Object* object = info->target_object();
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
11121 11140
11122 #ifdef ENABLE_DISASSEMBLER 11141 #ifdef ENABLE_DISASSEMBLER
11123 11142
11124 void DeoptimizationInputData::DeoptimizationInputDataPrint( 11143 void DeoptimizationInputData::DeoptimizationInputDataPrint(
11125 OStream& os) { // NOLINT 11144 OStream& os) { // NOLINT
11126 disasm::NameConverter converter; 11145 disasm::NameConverter converter;
11127 int deopt_count = DeoptCount(); 11146 int deopt_count = DeoptCount();
11128 os << "Deoptimization Input Data (deopt points = " << deopt_count << ")\n"; 11147 os << "Deoptimization Input Data (deopt points = " << deopt_count << ")\n";
11129 if (0 != deopt_count) { 11148 if (0 != deopt_count) {
11130 os << " index ast id argc pc"; 11149 os << " index ast id argc pc";
11131 if (FLAG_print_code_verbose) os << "commands"; 11150 if (FLAG_print_code_verbose) os << " commands";
11132 os << "\n"; 11151 os << "\n";
11133 } 11152 }
11134 for (int i = 0; i < deopt_count; i++) { 11153 for (int i = 0; i < deopt_count; i++) {
11135 // TODO(svenpanne) Add some basic formatting to our streams. 11154 // TODO(svenpanne) Add some basic formatting to our streams.
11136 Vector<char> buf1 = Vector<char>::New(128); 11155 Vector<char> buf1 = Vector<char>::New(128);
11137 SNPrintF(buf1, "%6d %6d %6d %6d", i, AstId(i).ToInt(), 11156 SNPrintF(buf1, "%6d %6d %6d %6d", i, AstId(i).ToInt(),
11138 ArgumentsStackHeight(i)->value(), Pc(i)->value()); 11157 ArgumentsStackHeight(i)->value(), Pc(i)->value());
11139 os << buf1.start(); 11158 os << buf1.start();
11140 11159
11141 if (!FLAG_print_code_verbose) { 11160 if (!FLAG_print_code_verbose) {
11142 os << "\n"; 11161 os << "\n";
11143 continue; 11162 continue;
11144 } 11163 }
11145 // Print details of the frame translation. 11164 // Print details of the frame translation.
11146 int translation_index = TranslationIndex(i)->value(); 11165 int translation_index = TranslationIndex(i)->value();
11147 TranslationIterator iterator(TranslationByteArray(), translation_index); 11166 TranslationIterator iterator(TranslationByteArray(), translation_index);
11148 Translation::Opcode opcode = 11167 Translation::Opcode opcode =
11149 static_cast<Translation::Opcode>(iterator.Next()); 11168 static_cast<Translation::Opcode>(iterator.Next());
11150 DCHECK(Translation::BEGIN == opcode); 11169 DCHECK(Translation::BEGIN == opcode);
11151 int frame_count = iterator.Next(); 11170 int frame_count = iterator.Next();
11152 int jsframe_count = iterator.Next(); 11171 int jsframe_count = iterator.Next();
11153 os << " " << Translation::StringFor(opcode) 11172 os << " " << Translation::StringFor(opcode)
11154 << " {frame count=" << frame_count 11173 << " {frame count=" << frame_count
11155 << ", js frame count=" << jsframe_count << "}\n"; 11174 << ", js frame count=" << jsframe_count << "}\n";
11156 11175
11157 while (iterator.HasNext() && 11176 while (iterator.HasNext() &&
11158 Translation::BEGIN != 11177 Translation::BEGIN !=
11159 (opcode = static_cast<Translation::Opcode>(iterator.Next()))) { 11178 (opcode = static_cast<Translation::Opcode>(iterator.Next()))) {
11160 Vector<char> buf2 = Vector<char>::New(128); 11179 Vector<char> buf2 = Vector<char>::New(128);
11161 SNPrintF(buf2, "%24s %s ", "", Translation::StringFor(opcode)); 11180 SNPrintF(buf2, "%27s %s ", "", Translation::StringFor(opcode));
11162 os << buf2.start(); 11181 os << buf2.start();
11163 11182
11164 switch (opcode) { 11183 switch (opcode) {
11165 case Translation::BEGIN: 11184 case Translation::BEGIN:
11166 UNREACHABLE(); 11185 UNREACHABLE();
11167 break; 11186 break;
11168 11187
11169 case Translation::JS_FRAME: { 11188 case Translation::JS_FRAME: {
11170 int ast_id = iterator.Next(); 11189 int ast_id = iterator.Next();
11171 int function_id = iterator.Next(); 11190 int function_id = iterator.Next();
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
11277 } 11296 }
11278 } 11297 }
11279 os << "\n"; 11298 os << "\n";
11280 } 11299 }
11281 } 11300 }
11282 11301
11283 int return_address_patch_count = ReturnAddressPatchCount(); 11302 int return_address_patch_count = ReturnAddressPatchCount();
11284 if (return_address_patch_count != 0) { 11303 if (return_address_patch_count != 0) {
11285 os << "Return address patch data (count = " << return_address_patch_count 11304 os << "Return address patch data (count = " << return_address_patch_count
11286 << ")\n"; 11305 << ")\n";
11287 os << "index pc patched_pc\n"; 11306 os << " index pc patched_pc\n";
11288 } 11307 }
11289 for (int i = 0; i < return_address_patch_count; i++) { 11308 for (int i = 0; i < return_address_patch_count; i++) {
11290 Vector<char> buf = Vector<char>::New(128); 11309 Vector<char> buf = Vector<char>::New(128);
11291 SNPrintF(buf, "%6d %6d %10d", i, ReturnAddressPc(i)->value(), 11310 SNPrintF(buf, "%6d %6d %12d\n", i, ReturnAddressPc(i)->value(),
11292 PatchedAddressPc(i)->value()); 11311 PatchedAddressPc(i)->value());
11293 os << buf.start(); 11312 os << buf.start();
11294 } 11313 }
11295 } 11314 }
11296 11315
11297 11316
11298 void DeoptimizationOutputData::DeoptimizationOutputDataPrint( 11317 void DeoptimizationOutputData::DeoptimizationOutputDataPrint(
11299 OStream& os) { // NOLINT 11318 OStream& os) { // NOLINT
11300 os << "Deoptimization Output Data (deopt points = " << this->DeoptPoints() 11319 os << "Deoptimization Output Data (deopt points = " << this->DeoptPoints()
11301 << ")\n"; 11320 << ")\n";
(...skipping 5596 matching lines...) Expand 10 before | Expand all | Expand 10 after
16898 #define ERROR_MESSAGES_TEXTS(C, T) T, 16917 #define ERROR_MESSAGES_TEXTS(C, T) T,
16899 static const char* error_messages_[] = { 16918 static const char* error_messages_[] = {
16900 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16919 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16901 }; 16920 };
16902 #undef ERROR_MESSAGES_TEXTS 16921 #undef ERROR_MESSAGES_TEXTS
16903 return error_messages_[reason]; 16922 return error_messages_[reason];
16904 } 16923 }
16905 16924
16906 16925
16907 } } // namespace v8::internal 16926 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/deoptimizer.cc ('k') | test/cctest/cctest.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698