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

Side by Side Diff: src/objects.cc

Issue 504493002: Fix deoptimization address patching in Turbofan to use safepoints. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Compilation fix. 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/objects.h ('k') | src/objects-inl.h » ('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 7915 matching lines...) Expand 10 before | Expand all | Expand 10 after
7926 } 7926 }
7927 7927
7928 7928
7929 Object* AccessorPair::GetComponent(AccessorComponent component) { 7929 Object* AccessorPair::GetComponent(AccessorComponent component) {
7930 Object* accessor = get(component); 7930 Object* accessor = get(component);
7931 return accessor->IsTheHole() ? GetHeap()->undefined_value() : accessor; 7931 return accessor->IsTheHole() ? GetHeap()->undefined_value() : accessor;
7932 } 7932 }
7933 7933
7934 7934
7935 Handle<DeoptimizationInputData> DeoptimizationInputData::New( 7935 Handle<DeoptimizationInputData> DeoptimizationInputData::New(
7936 Isolate* isolate, int deopt_entry_count, int return_patch_address_count, 7936 Isolate* isolate, int deopt_entry_count, PretenureFlag pretenure) {
7937 PretenureFlag pretenure) { 7937 DCHECK(deopt_entry_count > 0);
7938 DCHECK(deopt_entry_count + return_patch_address_count > 0); 7938 return Handle<DeoptimizationInputData>::cast(
7939 Handle<FixedArray> deoptimization_data = 7939 isolate->factory()->NewFixedArray(LengthFor(deopt_entry_count),
7940 Handle<FixedArray>::cast(isolate->factory()->NewFixedArray( 7940 pretenure));
7941 LengthFor(deopt_entry_count, return_patch_address_count), pretenure));
7942 deoptimization_data->set(kDeoptEntryCountIndex,
7943 Smi::FromInt(deopt_entry_count));
7944 deoptimization_data->set(kReturnAddressPatchEntryCountIndex,
7945 Smi::FromInt(return_patch_address_count));
7946 return Handle<DeoptimizationInputData>::cast(deoptimization_data);
7947 } 7941 }
7948 7942
7949 7943
7950 Handle<DeoptimizationOutputData> DeoptimizationOutputData::New( 7944 Handle<DeoptimizationOutputData> DeoptimizationOutputData::New(
7951 Isolate* isolate, 7945 Isolate* isolate,
7952 int number_of_deopt_points, 7946 int number_of_deopt_points,
7953 PretenureFlag pretenure) { 7947 PretenureFlag pretenure) {
7954 Handle<FixedArray> result; 7948 Handle<FixedArray> result;
7955 if (number_of_deopt_points == 0) { 7949 if (number_of_deopt_points == 0) {
7956 result = isolate->factory()->empty_fixed_array(); 7950 result = isolate->factory()->empty_fixed_array();
(...skipping 2327 matching lines...) Expand 10 before | Expand all | Expand 10 after
10284 } 10278 }
10285 } 10279 }
10286 it.next(); 10280 it.next();
10287 } 10281 }
10288 return statement_position; 10282 return statement_position;
10289 } 10283 }
10290 10284
10291 10285
10292 SafepointEntry Code::GetSafepointEntry(Address pc) { 10286 SafepointEntry Code::GetSafepointEntry(Address pc) {
10293 SafepointTable table(this); 10287 SafepointTable table(this);
10294 SafepointEntry entry = table.FindEntry(pc); 10288 return table.FindEntry(pc);
10295 if (entry.is_valid() || !is_turbofanned()) {
10296 return entry;
10297 }
10298
10299 // If the code is turbofanned, we might be looking for
10300 // an address that was patched by lazy deoptimization.
10301 // In that case look through the patch table, try to
10302 // lookup the original address there, and then use this
10303 // to find the safepoint entry.
10304 DeoptimizationInputData* deopt_data =
10305 DeoptimizationInputData::cast(deoptimization_data());
10306 intptr_t offset = pc - instruction_start();
10307 for (int i = 0; i < deopt_data->ReturnAddressPatchCount(); i++) {
10308 if (deopt_data->PatchedAddressPc(i)->value() == offset) {
10309 int original_offset = deopt_data->ReturnAddressPc(i)->value();
10310 return table.FindEntry(instruction_start() + original_offset);
10311 }
10312 }
10313 return SafepointEntry();
10314 } 10289 }
10315 10290
10316 10291
10317 Object* Code::FindNthObject(int n, Map* match_map) { 10292 Object* Code::FindNthObject(int n, Map* match_map) {
10318 DCHECK(is_inline_cache_stub()); 10293 DCHECK(is_inline_cache_stub());
10319 DisallowHeapAllocation no_allocation; 10294 DisallowHeapAllocation no_allocation;
10320 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); 10295 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
10321 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10296 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10322 RelocInfo* info = it.rinfo(); 10297 RelocInfo* info = it.rinfo();
10323 Object* object = info->target_object(); 10298 Object* object = info->target_object();
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after
10856 case Translation::ARGUMENTS_OBJECT: 10831 case Translation::ARGUMENTS_OBJECT:
10857 case Translation::CAPTURED_OBJECT: { 10832 case Translation::CAPTURED_OBJECT: {
10858 int args_length = iterator.Next(); 10833 int args_length = iterator.Next();
10859 os << "{length=" << args_length << "}"; 10834 os << "{length=" << args_length << "}";
10860 break; 10835 break;
10861 } 10836 }
10862 } 10837 }
10863 os << "\n"; 10838 os << "\n";
10864 } 10839 }
10865 } 10840 }
10866
10867 int return_address_patch_count = ReturnAddressPatchCount();
10868 if (return_address_patch_count != 0) {
10869 os << "Return address patch data (count = " << return_address_patch_count
10870 << ")\n";
10871 os << " index pc patched_pc\n";
10872 }
10873 for (int i = 0; i < return_address_patch_count; i++) {
10874 Vector<char> buf = Vector<char>::New(128);
10875 SNPrintF(buf, "%6d %6d %12d\n", i, ReturnAddressPc(i)->value(),
10876 PatchedAddressPc(i)->value());
10877 os << buf.start();
10878 }
10879 } 10841 }
10880 10842
10881 10843
10882 void DeoptimizationOutputData::DeoptimizationOutputDataPrint( 10844 void DeoptimizationOutputData::DeoptimizationOutputDataPrint(
10883 OStream& os) { // NOLINT 10845 OStream& os) { // NOLINT
10884 os << "Deoptimization Output Data (deopt points = " << this->DeoptPoints() 10846 os << "Deoptimization Output Data (deopt points = " << this->DeoptPoints()
10885 << ")\n"; 10847 << ")\n";
10886 if (this->DeoptPoints() == 0) return; 10848 if (this->DeoptPoints() == 0) return;
10887 10849
10888 os << "ast id pc state\n"; 10850 os << "ast id pc state\n";
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
10999 table.PrintEntry(i, os); 10961 table.PrintEntry(i, os);
11000 os << " (sp -> fp) "; 10962 os << " (sp -> fp) ";
11001 SafepointEntry entry = table.GetEntry(i); 10963 SafepointEntry entry = table.GetEntry(i);
11002 if (entry.deoptimization_index() != Safepoint::kNoDeoptimizationIndex) { 10964 if (entry.deoptimization_index() != Safepoint::kNoDeoptimizationIndex) {
11003 Vector<char> buf2 = Vector<char>::New(30); 10965 Vector<char> buf2 = Vector<char>::New(30);
11004 SNPrintF(buf2, "%6d", entry.deoptimization_index()); 10966 SNPrintF(buf2, "%6d", entry.deoptimization_index());
11005 os << buf2.start(); 10967 os << buf2.start();
11006 } else { 10968 } else {
11007 os << "<none>"; 10969 os << "<none>";
11008 } 10970 }
10971 if (entry.deoptimization_pc() != Safepoint::kNoDeoptimizationPc) {
10972 Vector<char> buf2 = Vector<char>::New(30);
10973 SNPrintF(buf2, "%6d", entry.deoptimization_pc());
10974 os << buf2.start();
10975 } else {
10976 os << "<none>";
10977 }
11009 if (entry.argument_count() > 0) { 10978 if (entry.argument_count() > 0) {
11010 os << " argc: " << entry.argument_count(); 10979 os << " argc: " << entry.argument_count();
11011 } 10980 }
11012 os << "\n"; 10981 os << "\n";
11013 } 10982 }
11014 os << "\n"; 10983 os << "\n";
11015 } else if (kind() == FUNCTION) { 10984 } else if (kind() == FUNCTION) {
11016 unsigned offset = back_edge_table_offset(); 10985 unsigned offset = back_edge_table_offset();
11017 // If there is no back edge table, the "table start" will be at or after 10986 // If there is no back edge table, the "table start" will be at or after
11018 // (due to alignment) the end of the instruction stream. 10987 // (due to alignment) the end of the instruction stream.
(...skipping 5453 matching lines...) Expand 10 before | Expand all | Expand 10 after
16472 #define ERROR_MESSAGES_TEXTS(C, T) T, 16441 #define ERROR_MESSAGES_TEXTS(C, T) T,
16473 static const char* error_messages_[] = { 16442 static const char* error_messages_[] = {
16474 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16443 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16475 }; 16444 };
16476 #undef ERROR_MESSAGES_TEXTS 16445 #undef ERROR_MESSAGES_TEXTS
16477 return error_messages_[reason]; 16446 return error_messages_[reason];
16478 } 16447 }
16479 16448
16480 16449
16481 } } // namespace v8::internal 16450 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698