| Index: src/deoptimizer.cc
|
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
|
| index 84e80b9d9a0c86fa8c859f7bb068fbce68f4d121..ef4e39e8c2b1e143adeea7f8687cb0392ab5791b 100644
|
| --- a/src/deoptimizer.cc
|
| +++ b/src/deoptimizer.cc
|
| @@ -344,9 +344,11 @@ void Deoptimizer::DeoptimizeMarkedCodeForContext(Context* context) {
|
| shared->EvictFromOptimizedCodeMap(code, "deoptimized function");
|
|
|
| if (FLAG_trace_deopt) {
|
| - PrintF("[deoptimizer unlinked: ");
|
| - function->PrintName();
|
| - PrintF(" / %" V8PRIxPTR "]\n", reinterpret_cast<intptr_t>(function));
|
| + CodeTracer::Scope scope(code->GetHeap()->isolate()->GetCodeTracer());
|
| + PrintF(scope.file(), "[deoptimizer unlinked: ");
|
| + function->PrintName(scope.file());
|
| + PrintF(scope.file(),
|
| + " / %" V8PRIxPTR "]\n", reinterpret_cast<intptr_t>(function));
|
| }
|
| }
|
| };
|
| @@ -409,7 +411,8 @@ void Deoptimizer::DeoptimizeMarkedCodeForContext(Context* context) {
|
|
|
| void Deoptimizer::DeoptimizeAll(Isolate* isolate) {
|
| if (FLAG_trace_deopt) {
|
| - PrintF("[deoptimize all code in all contexts]\n");
|
| + CodeTracer::Scope scope(isolate->GetCodeTracer());
|
| + PrintF(scope.file(), "[deoptimize all code in all contexts]\n");
|
| }
|
| DisallowHeapAllocation no_allocation;
|
| // For all contexts, mark all code, then deoptimize.
|
| @@ -425,7 +428,8 @@ void Deoptimizer::DeoptimizeAll(Isolate* isolate) {
|
|
|
| void Deoptimizer::DeoptimizeMarkedCode(Isolate* isolate) {
|
| if (FLAG_trace_deopt) {
|
| - PrintF("[deoptimize marked code in all contexts]\n");
|
| + CodeTracer::Scope scope(isolate->GetCodeTracer());
|
| + PrintF(scope.file(), "[deoptimize marked code in all contexts]\n");
|
| }
|
| DisallowHeapAllocation no_allocation;
|
| // For all contexts, deoptimize code already marked.
|
| @@ -440,7 +444,8 @@ void Deoptimizer::DeoptimizeMarkedCode(Isolate* isolate) {
|
|
|
| void Deoptimizer::DeoptimizeGlobalObject(JSObject* object) {
|
| if (FLAG_trace_deopt) {
|
| - PrintF("[deoptimize global object @ 0x%08" V8PRIxPTR "]\n",
|
| + CodeTracer::Scope scope(object->GetHeap()->isolate()->GetCodeTracer());
|
| + PrintF(scope.file(), "[deoptimize global object @ 0x%08" V8PRIxPTR "]\n",
|
| reinterpret_cast<intptr_t>(object));
|
| }
|
| if (object->IsJSGlobalProxy()) {
|
| @@ -541,7 +546,7 @@ Deoptimizer::Deoptimizer(Isolate* isolate,
|
| materialized_objects_(NULL),
|
| materialization_value_index_(0),
|
| materialization_object_index_(0),
|
| - trace_(false) {
|
| + trace_scope_(NULL) {
|
| // For COMPILED_STUBs called from builtins, the function pointer is a SMI
|
| // indicating an internal frame.
|
| if (function->IsSmi()) {
|
| @@ -571,7 +576,8 @@ Deoptimizer::Deoptimizer(Isolate* isolate,
|
| StackFrame::Type frame_type = function == NULL
|
| ? StackFrame::STUB
|
| : StackFrame::JAVA_SCRIPT;
|
| - trace_ = TraceEnabledFor(type, frame_type);
|
| + trace_scope_ = TraceEnabledFor(type, frame_type) ?
|
| + new CodeTracer::Scope(isolate->GetCodeTracer()) : NULL;
|
| #ifdef DEBUG
|
| CHECK(AllowHeapAllocation::IsAllowed());
|
| disallow_heap_allocation_ = new DisallowHeapAllocation();
|
| @@ -604,9 +610,10 @@ Code* Deoptimizer::FindOptimizedCode(JSFunction* function,
|
|
|
| void Deoptimizer::PrintFunctionName() {
|
| if (function_->IsJSFunction()) {
|
| - function_->PrintName();
|
| + function_->PrintName(trace_scope_->file());
|
| } else {
|
| - PrintF("%s", Code::Kind2String(compiled_code_->kind()));
|
| + PrintF(trace_scope_->file(),
|
| + "%s", Code::Kind2String(compiled_code_->kind()));
|
| }
|
| }
|
|
|
| @@ -614,6 +621,7 @@ void Deoptimizer::PrintFunctionName() {
|
| Deoptimizer::~Deoptimizer() {
|
| ASSERT(input_ == NULL && output_ == NULL);
|
| ASSERT(disallow_heap_allocation_ == NULL);
|
| + delete trace_scope_;
|
| }
|
|
|
|
|
| @@ -681,13 +689,13 @@ int Deoptimizer::GetOutputInfo(DeoptimizationOutputData* data,
|
| return data->PcAndState(i)->value();
|
| }
|
| }
|
| - PrintF("[couldn't find pc offset for node=%d]\n", id.ToInt());
|
| - PrintF("[method: %s]\n", *shared->DebugName()->ToCString());
|
| + PrintF(stderr, "[couldn't find pc offset for node=%d]\n", id.ToInt());
|
| + PrintF(stderr, "[method: %s]\n", *shared->DebugName()->ToCString());
|
| // Print the source code if available.
|
| HeapStringAllocator string_allocator;
|
| StringStream stream(&string_allocator);
|
| shared->SourceCodePrint(&stream, -1);
|
| - PrintF("[source:\n%s\n]", *stream.ToCString());
|
| + PrintF(stderr, "[source:\n%s\n]", *stream.ToCString());
|
|
|
| FATAL("unable to find pc offset during deoptimization");
|
| return -1;
|
| @@ -722,15 +730,19 @@ void Deoptimizer::DoComputeOutputFrames() {
|
| LOG(isolate(), CodeDeoptEvent(compiled_code_));
|
| }
|
| ElapsedTimer timer;
|
| - if (trace_) {
|
| + if (trace_scope_ != NULL) {
|
| timer.Start();
|
| - PrintF("[deoptimizing (DEOPT %s): begin 0x%08" V8PRIxPTR " ",
|
| + PrintF(trace_scope_->file(),
|
| + "[deoptimizing (DEOPT %s): begin 0x%08" V8PRIxPTR " ",
|
| MessageFor(bailout_type_),
|
| reinterpret_cast<intptr_t>(function_));
|
| PrintFunctionName();
|
| - PrintF(" @%d, FP to SP delta: %d]\n", bailout_id_, fp_to_sp_delta_);
|
| + PrintF(trace_scope_->file(),
|
| + " @%d, FP to SP delta: %d]\n",
|
| + bailout_id_,
|
| + fp_to_sp_delta_);
|
| if (bailout_type_ == EAGER || bailout_type_ == SOFT) {
|
| - compiled_code_->PrintDeoptLocation(bailout_id_);
|
| + compiled_code_->PrintDeoptLocation(trace_scope_->file(), bailout_id_);
|
| }
|
| }
|
|
|
| @@ -803,15 +815,17 @@ void Deoptimizer::DoComputeOutputFrames() {
|
| }
|
|
|
| // Print some helpful diagnostic information.
|
| - if (trace_) {
|
| + if (trace_scope_ != NULL) {
|
| double ms = timer.Elapsed().InMillisecondsF();
|
| int index = output_count_ - 1; // Index of the topmost frame.
|
| JSFunction* function = output_[index]->GetFunction();
|
| - PrintF("[deoptimizing (%s): end 0x%08" V8PRIxPTR " ",
|
| + PrintF(trace_scope_->file(),
|
| + "[deoptimizing (%s): end 0x%08" V8PRIxPTR " ",
|
| MessageFor(bailout_type_),
|
| reinterpret_cast<intptr_t>(function));
|
| PrintFunctionName();
|
| - PrintF(" @%d => node=%d, pc=0x%08" V8PRIxPTR ", state=%s, alignment=%s,"
|
| + PrintF(trace_scope_->file(),
|
| + " @%d => node=%d, pc=0x%08" V8PRIxPTR ", state=%s, alignment=%s,"
|
| " took %0.3f ms]\n",
|
| bailout_id_,
|
| node_id.ToInt(),
|
| @@ -839,10 +853,11 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator,
|
| }
|
| unsigned height = iterator->Next();
|
| unsigned height_in_bytes = height * kPointerSize;
|
| - if (trace_) {
|
| - PrintF(" translating ");
|
| - function->PrintName();
|
| - PrintF(" => node=%d, height=%d\n", node_id.ToInt(), height_in_bytes);
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(), " translating ");
|
| + function->PrintName(trace_scope_->file());
|
| + PrintF(trace_scope_->file(),
|
| + " => node=%d, height=%d\n", node_id.ToInt(), height_in_bytes);
|
| }
|
|
|
| // The 'fixed' part of the frame consists of the incoming parameters and
|
| @@ -909,8 +924,9 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator,
|
| value = output_[frame_index - 1]->GetPc();
|
| }
|
| output_frame->SetCallerPc(output_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; caller's pc\n",
|
| top_address + output_offset, output_offset, value);
|
| }
|
| @@ -932,8 +948,9 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator,
|
| has_alignment_padding_ * kPointerSize) == fp_value);
|
| output_frame->SetFp(fp_value);
|
| if (is_topmost) output_frame->SetRegister(fp_reg.code(), fp_value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; caller's fp\n",
|
| fp_value, output_offset, value);
|
| }
|
| @@ -954,8 +971,9 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator,
|
| output_frame->SetFrameSlot(output_offset, value);
|
| output_frame->SetContext(value);
|
| if (is_topmost) output_frame->SetRegister(context_reg.code(), value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR "; context\n",
|
| top_address + output_offset, output_offset, value);
|
| }
|
| @@ -968,8 +986,9 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator,
|
| // input frame.
|
| ASSERT(!is_bottommost || input_->GetFrameSlot(input_offset) == value);
|
| output_frame->SetFrameSlot(output_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR "; function\n",
|
| top_address + output_offset, output_offset, value);
|
| }
|
| @@ -1017,8 +1036,9 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator,
|
| JSFunction* function = JSFunction::cast(ComputeLiteral(iterator->Next()));
|
| unsigned height = iterator->Next();
|
| unsigned height_in_bytes = height * kPointerSize;
|
| - if (trace_) {
|
| - PrintF(" translating arguments adaptor => height=%d\n", height_in_bytes);
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " translating arguments adaptor => height=%d\n", height_in_bytes);
|
| }
|
|
|
| unsigned fixed_frame_size = ArgumentsAdaptorFrameConstants::kFrameSize;
|
| @@ -1052,8 +1072,9 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator,
|
| output_offset -= kPCOnStackSize;
|
| intptr_t callers_pc = output_[frame_index - 1]->GetPc();
|
| output_frame->SetCallerPc(output_offset, callers_pc);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; caller's pc\n",
|
| top_address + output_offset, output_offset, callers_pc);
|
| }
|
| @@ -1064,8 +1085,9 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator,
|
| output_frame->SetCallerFp(output_offset, value);
|
| intptr_t fp_value = top_address + output_offset;
|
| output_frame->SetFp(fp_value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; caller's fp\n",
|
| fp_value, output_offset, value);
|
| }
|
| @@ -1075,8 +1097,9 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator,
|
| intptr_t context = reinterpret_cast<intptr_t>(
|
| Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
|
| output_frame->SetFrameSlot(output_offset, context);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; context (adaptor sentinel)\n",
|
| top_address + output_offset, output_offset, context);
|
| }
|
| @@ -1085,8 +1108,9 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator,
|
| output_offset -= kPointerSize;
|
| value = reinterpret_cast<intptr_t>(function);
|
| output_frame->SetFrameSlot(output_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; function\n",
|
| top_address + output_offset, output_offset, value);
|
| }
|
| @@ -1095,8 +1119,9 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator,
|
| output_offset -= kPointerSize;
|
| value = reinterpret_cast<intptr_t>(Smi::FromInt(height - 1));
|
| output_frame->SetFrameSlot(output_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; argc (%d)\n",
|
| top_address + output_offset, output_offset, value, height - 1);
|
| }
|
| @@ -1120,8 +1145,9 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
|
| JSFunction* function = JSFunction::cast(ComputeLiteral(iterator->Next()));
|
| unsigned height = iterator->Next();
|
| unsigned height_in_bytes = height * kPointerSize;
|
| - if (trace_) {
|
| - PrintF(" translating construct stub => height=%d\n", height_in_bytes);
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " translating construct stub => height=%d\n", height_in_bytes);
|
| }
|
|
|
| unsigned fixed_frame_size = ConstructFrameConstants::kFrameSize;
|
| @@ -1163,8 +1189,9 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
|
| output_offset -= kPCOnStackSize;
|
| intptr_t callers_pc = output_[frame_index - 1]->GetPc();
|
| output_frame->SetCallerPc(output_offset, callers_pc);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; caller's pc\n",
|
| top_address + output_offset, output_offset, callers_pc);
|
| }
|
| @@ -1175,8 +1202,9 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
|
| output_frame->SetCallerFp(output_offset, value);
|
| intptr_t fp_value = top_address + output_offset;
|
| output_frame->SetFp(fp_value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; caller's fp\n",
|
| fp_value, output_offset, value);
|
| }
|
| @@ -1185,8 +1213,9 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
|
| output_offset -= kPointerSize;
|
| value = output_[frame_index - 1]->GetContext();
|
| output_frame->SetFrameSlot(output_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; context\n",
|
| top_address + output_offset, output_offset, value);
|
| }
|
| @@ -1195,8 +1224,9 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
|
| output_offset -= kPointerSize;
|
| value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::CONSTRUCT));
|
| output_frame->SetFrameSlot(output_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; function (construct sentinel)\n",
|
| top_address + output_offset, output_offset, value);
|
| }
|
| @@ -1205,8 +1235,9 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
|
| output_offset -= kPointerSize;
|
| value = reinterpret_cast<intptr_t>(construct_stub);
|
| output_frame->SetFrameSlot(output_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; code object\n",
|
| top_address + output_offset, output_offset, value);
|
| }
|
| @@ -1215,8 +1246,9 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
|
| output_offset -= kPointerSize;
|
| value = reinterpret_cast<intptr_t>(Smi::FromInt(height - 1));
|
| output_frame->SetFrameSlot(output_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; argc (%d)\n",
|
| top_address + output_offset, output_offset, value, height - 1);
|
| }
|
| @@ -1227,8 +1259,9 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
|
| output_offset -= kPointerSize;
|
| value = reinterpret_cast<intptr_t>(function);
|
| output_frame->SetFrameSlot(output_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; constructor function\n",
|
| top_address + output_offset, output_offset, value);
|
| }
|
| @@ -1239,8 +1272,9 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
|
| output_offset -= kPointerSize;
|
| value = output_frame->GetFrameSlot(output_frame_size - kPointerSize);
|
| output_frame->SetFrameSlot(output_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; allocated receiver\n",
|
| top_address + output_offset, output_offset, value);
|
| }
|
| @@ -1264,8 +1298,9 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator,
|
| unsigned height = 0;
|
| unsigned height_in_bytes = height * kPointerSize;
|
| const char* kind = is_setter_stub_frame ? "setter" : "getter";
|
| - if (trace_) {
|
| - PrintF(" translating %s stub => height=%u\n", kind, height_in_bytes);
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " translating %s stub => height=%u\n", kind, height_in_bytes);
|
| }
|
|
|
| // We need 1 stack entry for the return address + 4 stack entries from
|
| @@ -1300,8 +1335,9 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator,
|
| output_offset -= kPCOnStackSize;
|
| intptr_t callers_pc = output_[frame_index - 1]->GetPc();
|
| output_frame->SetCallerPc(output_offset, callers_pc);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
|
| " ; caller's pc\n",
|
| top_address + output_offset, output_offset, callers_pc);
|
| }
|
| @@ -1312,8 +1348,9 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator,
|
| output_frame->SetCallerFp(output_offset, value);
|
| intptr_t fp_value = top_address + output_offset;
|
| output_frame->SetFp(fp_value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
|
| " ; caller's fp\n",
|
| fp_value, output_offset, value);
|
| }
|
| @@ -1322,8 +1359,9 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator,
|
| output_offset -= kPointerSize;
|
| value = output_[frame_index - 1]->GetContext();
|
| output_frame->SetFrameSlot(output_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
|
| " ; context\n",
|
| top_address + output_offset, output_offset, value);
|
| }
|
| @@ -1332,8 +1370,9 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator,
|
| output_offset -= kPointerSize;
|
| value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::INTERNAL));
|
| output_frame->SetFrameSlot(output_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
|
| " ; function (%s sentinel)\n",
|
| top_address + output_offset, output_offset, value, kind);
|
| }
|
| @@ -1346,8 +1385,9 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator,
|
| Code* accessor_stub = isolate_->builtins()->builtin(name);
|
| value = reinterpret_cast<intptr_t>(accessor_stub);
|
| output_frame->SetFrameSlot(output_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
|
| " ; code object\n",
|
| top_address + output_offset, output_offset, value);
|
| }
|
| @@ -1423,8 +1463,9 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
|
| int fixed_frame_size = StandardFrameConstants::kFixedFrameSize;
|
| int input_frame_size = input_->GetFrameSize();
|
| int output_frame_size = height_in_bytes + fixed_frame_size;
|
| - if (trace_) {
|
| - PrintF(" translating %s => StubFailureTrampolineStub, height=%d\n",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " translating %s => StubFailureTrampolineStub, height=%d\n",
|
| CodeStub::MajorName(static_cast<CodeStub::Major>(major_key), false),
|
| height_in_bytes);
|
| }
|
| @@ -1449,8 +1490,9 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
|
| unsigned output_frame_offset = output_frame_size - kFPOnStackSize;
|
| intptr_t value = input_->GetFrameSlot(input_frame_offset);
|
| output_frame->SetCallerPc(output_frame_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; caller's pc\n",
|
| top_address + output_frame_offset, output_frame_offset, value);
|
| }
|
| @@ -1463,8 +1505,9 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
|
| intptr_t frame_ptr = input_->GetRegister(fp_reg.code());
|
| output_frame->SetRegister(fp_reg.code(), frame_ptr);
|
| output_frame->SetFp(frame_ptr);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; caller's fp\n",
|
| top_address + output_frame_offset, output_frame_offset, value);
|
| }
|
| @@ -1476,8 +1519,9 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
|
| output_frame->SetRegister(context_reg.code(), value);
|
| output_frame_offset -= kPointerSize;
|
| output_frame->SetFrameSlot(output_frame_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; context\n",
|
| top_address + output_frame_offset, output_frame_offset, value);
|
| }
|
| @@ -1487,8 +1531,9 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
|
| value = reinterpret_cast<intptr_t>(
|
| Smi::FromInt(StackFrame::STUB_FAILURE_TRAMPOLINE));
|
| output_frame->SetFrameSlot(output_frame_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; function (stub failure sentinel)\n",
|
| top_address + output_frame_offset, output_frame_offset, value);
|
| }
|
| @@ -1509,8 +1554,9 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
|
| }
|
|
|
| output_frame->SetFrameSlot(args_arguments_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; args.arguments %s\n",
|
| top_address + args_arguments_offset, args_arguments_offset, value,
|
| arg_count_known ? "" : "(the hole)");
|
| @@ -1520,8 +1566,9 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
|
| int length_frame_offset = output_frame_offset;
|
| value = arg_count_known ? caller_arg_count : the_hole;
|
| output_frame->SetFrameSlot(length_frame_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; args.length %s\n",
|
| top_address + length_frame_offset, length_frame_offset, value,
|
| arg_count_known ? "" : "(the hole)");
|
| @@ -1531,34 +1578,54 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
|
| value = frame_ptr + StandardFrameConstants::kCallerSPOffset -
|
| (output_frame_size - output_frame_offset) + kPointerSize;
|
| output_frame->SetFrameSlot(output_frame_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; args*\n",
|
| top_address + output_frame_offset, output_frame_offset, value);
|
| }
|
|
|
| // Copy the register parameters to the failure frame.
|
| + int arguments_length_offset = -1;
|
| for (int i = 0; i < descriptor->register_param_count_; ++i) {
|
| output_frame_offset -= kPointerSize;
|
| DoTranslateCommand(iterator, 0, output_frame_offset);
|
| +
|
| + if (!arg_count_known && descriptor->IsParameterCountRegister(i)) {
|
| + arguments_length_offset = output_frame_offset;
|
| + }
|
| }
|
|
|
| + ASSERT(0 == output_frame_offset);
|
| +
|
| if (!arg_count_known) {
|
| - DoTranslateCommand(iterator, 0, length_frame_offset,
|
| - TRANSLATED_VALUE_IS_NATIVE);
|
| - caller_arg_count = output_frame->GetFrameSlot(length_frame_offset);
|
| + ASSERT(arguments_length_offset >= 0);
|
| + // We know it's a smi because 1) the code stub guarantees the stack
|
| + // parameter count is in smi range, and 2) the DoTranslateCommand in the
|
| + // parameter loop above translated that to a tagged value.
|
| + Smi* smi_caller_arg_count = reinterpret_cast<Smi*>(
|
| + output_frame->GetFrameSlot(arguments_length_offset));
|
| + caller_arg_count = smi_caller_arg_count->value();
|
| + output_frame->SetFrameSlot(length_frame_offset, caller_arg_count);
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + V8PRIxPTR " ; args.length\n",
|
| + top_address + length_frame_offset, length_frame_offset,
|
| + caller_arg_count);
|
| + }
|
| value = frame_ptr + StandardFrameConstants::kCallerSPOffset +
|
| (caller_arg_count - 1) * kPointerSize;
|
| output_frame->SetFrameSlot(args_arguments_offset, value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; args.arguments\n",
|
| - top_address + args_arguments_offset, args_arguments_offset, value);
|
| + top_address + args_arguments_offset, args_arguments_offset,
|
| + value);
|
| }
|
| }
|
|
|
| - ASSERT(0 == output_frame_offset);
|
| -
|
| // Copy the double registers from the input into the output frame.
|
| CopyDoubleRegisters(output_frame);
|
|
|
| @@ -1620,10 +1687,10 @@ Handle<Object> Deoptimizer::MaterializeNextHeapObject() {
|
| Handle<Map>::cast(MaterializeNextValue()), Representation::Tagged());
|
| switch (map->instance_type()) {
|
| case HEAP_NUMBER_TYPE: {
|
| - Handle<HeapNumber> object = isolate_->factory()->NewHeapNumber(0.0);
|
| + // Reuse the HeapNumber value directly as it is already properly
|
| + // tagged and skip materializing the HeapNumber explicitly.
|
| + Handle<Object> object = MaterializeNextValue();
|
| materialized_objects_->Add(object);
|
| - Handle<Object> number = MaterializeNextValue();
|
| - object->set_value(number->Number());
|
| materialization_value_index_ += kDoubleSize / kPointerSize - 1;
|
| break;
|
| }
|
| @@ -1654,7 +1721,8 @@ Handle<Object> Deoptimizer::MaterializeNextHeapObject() {
|
| break;
|
| }
|
| default:
|
| - PrintF("[couldn't handle instance type %d]\n", map->instance_type());
|
| + PrintF(stderr,
|
| + "[couldn't handle instance type %d]\n", map->instance_type());
|
| UNREACHABLE();
|
| }
|
| }
|
| @@ -1699,8 +1767,9 @@ void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) {
|
| for (int i = 0; i < deferred_heap_numbers_.length(); i++) {
|
| HeapNumberMaterializationDescriptor<Address> d = deferred_heap_numbers_[i];
|
| Handle<Object> num = isolate_->factory()->NewNumber(d.value());
|
| - if (trace_) {
|
| - PrintF("Materialized a new heap number %p [%e] in slot %p\n",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + "Materialized a new heap number %p [%e] in slot %p\n",
|
| reinterpret_cast<void*>(*num),
|
| d.value(),
|
| d.destination());
|
| @@ -1713,8 +1782,9 @@ void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) {
|
| HeapNumberMaterializationDescriptor<int> d =
|
| deferred_objects_double_values_[i];
|
| Handle<Object> num = isolate_->factory()->NewNumber(d.value());
|
| - if (trace_) {
|
| - PrintF("Materialized a new heap number %p [%e] for object at %d\n",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + "Materialized a new heap number %p [%e] for object at %d\n",
|
| reinterpret_cast<void*>(*num),
|
| d.value(),
|
| d.destination());
|
| @@ -1742,19 +1812,21 @@ void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) {
|
| // the materialized object into the frame slot.
|
| Handle<Object> object = MaterializeNextHeapObject();
|
| Memory::Object_at(descriptor.slot_address()) = *object;
|
| - if (trace_) {
|
| + if (trace_scope_ != NULL) {
|
| if (descriptor.is_arguments()) {
|
| - PrintF("Materialized %sarguments object of length %d for %p: ",
|
| + PrintF(trace_scope_->file(),
|
| + "Materialized %sarguments object of length %d for %p: ",
|
| ArgumentsObjectIsAdapted(object_index) ? "(adapted) " : "",
|
| Handle<JSObject>::cast(object)->elements()->length(),
|
| reinterpret_cast<void*>(descriptor.slot_address()));
|
| } else {
|
| - PrintF("Materialized captured object of size %d for %p: ",
|
| + PrintF(trace_scope_->file(),
|
| + "Materialized captured object of size %d for %p: ",
|
| Handle<HeapObject>::cast(object)->Size(),
|
| reinterpret_cast<void*>(descriptor.slot_address()));
|
| }
|
| - object->ShortPrint();
|
| - PrintF("\n");
|
| + object->ShortPrint(trace_scope_->file());
|
| + PrintF(trace_scope_->file(), "\n");
|
| }
|
| }
|
|
|
| @@ -1786,8 +1858,9 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame(
|
| int index = (info->parameters_count() - 1) -
|
| static_cast<int>(slot - parameters_top) / kPointerSize;
|
|
|
| - if (trace_) {
|
| - PrintF("Materializing a new heap number %p [%e] in slot %p"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + "Materializing a new heap number %p [%e] in slot %p"
|
| "for parameter slot #%d\n",
|
| reinterpret_cast<void*>(*num),
|
| d.value(),
|
| @@ -1802,8 +1875,9 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame(
|
| int index = info->expression_count() - 1 -
|
| static_cast<int>(slot - expressions_top) / kPointerSize;
|
|
|
| - if (trace_) {
|
| - PrintF("Materializing a new heap number %p [%e] in slot %p"
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + "Materializing a new heap number %p [%e] in slot %p"
|
| "for expression slot #%d\n",
|
| reinterpret_cast<void*>(*num),
|
| d.value(),
|
| @@ -1818,10 +1892,8 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame(
|
| #endif
|
|
|
|
|
| -static const char* TraceValueType(bool is_smi, bool is_native = false) {
|
| - if (is_native) {
|
| - return "native";
|
| - } else if (is_smi) {
|
| +static const char* TraceValueType(bool is_smi) {
|
| + if (is_smi) {
|
| return "smi";
|
| }
|
|
|
| @@ -1852,14 +1924,18 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
| case Translation::REGISTER: {
|
| int input_reg = iterator->Next();
|
| intptr_t input_value = input_->GetRegister(input_reg);
|
| - if (trace_) {
|
| - PrintF(" object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| reinterpret_cast<intptr_t>(object_slot),
|
| field_index);
|
| - PrintF("0x%08" V8PRIxPTR " ; %s ", input_value,
|
| + PrintF(trace_scope_->file(),
|
| + "0x%08" V8PRIxPTR " ; %s ", input_value,
|
| converter.NameOfCPURegister(input_reg));
|
| - reinterpret_cast<Object*>(input_value)->ShortPrint();
|
| - PrintF("\n");
|
| + reinterpret_cast<Object*>(input_value)->ShortPrint(
|
| + trace_scope_->file());
|
| + PrintF(trace_scope_->file(),
|
| + "\n");
|
| }
|
| AddObjectTaggedValue(input_value);
|
| return;
|
| @@ -1869,11 +1945,13 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
| int input_reg = iterator->Next();
|
| intptr_t value = input_->GetRegister(input_reg);
|
| bool is_smi = Smi::IsValid(value);
|
| - if (trace_) {
|
| - PrintF(" object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| reinterpret_cast<intptr_t>(object_slot),
|
| field_index);
|
| - PrintF("%" V8PRIdPTR " ; %s (%s)\n", value,
|
| + PrintF(trace_scope_->file(),
|
| + "%" V8PRIdPTR " ; %s (%s)\n", value,
|
| converter.NameOfCPURegister(input_reg),
|
| TraceValueType(is_smi));
|
| }
|
| @@ -1892,11 +1970,13 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
| int input_reg = iterator->Next();
|
| uintptr_t value = static_cast<uintptr_t>(input_->GetRegister(input_reg));
|
| bool is_smi = (value <= static_cast<uintptr_t>(Smi::kMaxValue));
|
| - if (trace_) {
|
| - PrintF(" object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| reinterpret_cast<intptr_t>(object_slot),
|
| field_index);
|
| - PrintF("%" V8PRIdPTR " ; uint %s (%s)\n", value,
|
| + PrintF(trace_scope_->file(),
|
| + "%" V8PRIdPTR " ; uint %s (%s)\n", value,
|
| converter.NameOfCPURegister(input_reg),
|
| TraceValueType(is_smi));
|
| }
|
| @@ -1914,11 +1994,13 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
| case Translation::DOUBLE_REGISTER: {
|
| int input_reg = iterator->Next();
|
| double value = input_->GetDoubleRegister(input_reg);
|
| - if (trace_) {
|
| - PrintF(" object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| reinterpret_cast<intptr_t>(object_slot),
|
| field_index);
|
| - PrintF("%e ; %s\n", value,
|
| + PrintF(trace_scope_->file(),
|
| + "%e ; %s\n", value,
|
| DoubleRegister::AllocationIndexToString(input_reg));
|
| }
|
| AddObjectDoubleValue(value);
|
| @@ -1929,13 +2011,17 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
| int input_slot_index = iterator->Next();
|
| unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index);
|
| intptr_t input_value = input_->GetFrameSlot(input_offset);
|
| - if (trace_) {
|
| - PrintF(" object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| reinterpret_cast<intptr_t>(object_slot),
|
| field_index);
|
| - PrintF("0x%08" V8PRIxPTR " ; [sp + %d] ", input_value, input_offset);
|
| - reinterpret_cast<Object*>(input_value)->ShortPrint();
|
| - PrintF("\n");
|
| + PrintF(trace_scope_->file(),
|
| + "0x%08" V8PRIxPTR " ; [sp + %d] ", input_value, input_offset);
|
| + reinterpret_cast<Object*>(input_value)->ShortPrint(
|
| + trace_scope_->file());
|
| + PrintF(trace_scope_->file(),
|
| + "\n");
|
| }
|
| AddObjectTaggedValue(input_value);
|
| return;
|
| @@ -1946,11 +2032,13 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
| unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index);
|
| intptr_t value = input_->GetFrameSlot(input_offset);
|
| bool is_smi = Smi::IsValid(value);
|
| - if (trace_) {
|
| - PrintF(" object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| reinterpret_cast<intptr_t>(object_slot),
|
| field_index);
|
| - PrintF("%" V8PRIdPTR " ; [sp + %d] (%s)\n",
|
| + PrintF(trace_scope_->file(),
|
| + "%" V8PRIdPTR " ; [sp + %d] (%s)\n",
|
| value, input_offset, TraceValueType(is_smi));
|
| }
|
| if (is_smi) {
|
| @@ -1970,11 +2058,13 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
| uintptr_t value =
|
| static_cast<uintptr_t>(input_->GetFrameSlot(input_offset));
|
| bool is_smi = (value <= static_cast<uintptr_t>(Smi::kMaxValue));
|
| - if (trace_) {
|
| - PrintF(" object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| reinterpret_cast<intptr_t>(object_slot),
|
| field_index);
|
| - PrintF("%" V8PRIdPTR " ; [sp + %d] (uint %s)\n",
|
| + PrintF(trace_scope_->file(),
|
| + "%" V8PRIdPTR " ; [sp + %d] (uint %s)\n",
|
| value, input_offset, TraceValueType(is_smi));
|
| }
|
| if (is_smi) {
|
| @@ -1992,11 +2082,13 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
| int input_slot_index = iterator->Next();
|
| unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index);
|
| double value = input_->GetDoubleFrameSlot(input_offset);
|
| - if (trace_) {
|
| - PrintF(" object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| reinterpret_cast<intptr_t>(object_slot),
|
| field_index);
|
| - PrintF("%e ; [sp + %d]\n", value, input_offset);
|
| + PrintF(trace_scope_->file(),
|
| + "%e ; [sp + %d]\n", value, input_offset);
|
| }
|
| AddObjectDoubleValue(value);
|
| return;
|
| @@ -2004,12 +2096,14 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
|
|
| case Translation::LITERAL: {
|
| Object* literal = ComputeLiteral(iterator->Next());
|
| - if (trace_) {
|
| - PrintF(" object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| reinterpret_cast<intptr_t>(object_slot),
|
| field_index);
|
| - literal->ShortPrint();
|
| - PrintF(" ; literal\n");
|
| + literal->ShortPrint(trace_scope_->file());
|
| + PrintF(trace_scope_->file(),
|
| + " ; literal\n");
|
| }
|
| intptr_t value = reinterpret_cast<intptr_t>(literal);
|
| AddObjectTaggedValue(value);
|
| @@ -2018,12 +2112,14 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
|
|
| case Translation::DUPLICATED_OBJECT: {
|
| int object_index = iterator->Next();
|
| - if (trace_) {
|
| - PrintF(" nested @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " nested @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| reinterpret_cast<intptr_t>(object_slot),
|
| field_index);
|
| - isolate_->heap()->arguments_marker()->ShortPrint();
|
| - PrintF(" ; duplicate of object #%d\n", object_index);
|
| + isolate_->heap()->arguments_marker()->ShortPrint(trace_scope_->file());
|
| + PrintF(trace_scope_->file(),
|
| + " ; duplicate of object #%d\n", object_index);
|
| }
|
| // Use the materialization marker value as a sentinel and fill in
|
| // the object after the deoptimized frame is built.
|
| @@ -2038,12 +2134,14 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
| case Translation::CAPTURED_OBJECT: {
|
| int length = iterator->Next();
|
| bool is_args = opcode == Translation::ARGUMENTS_OBJECT;
|
| - if (trace_) {
|
| - PrintF(" nested @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " nested @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| reinterpret_cast<intptr_t>(object_slot),
|
| field_index);
|
| - isolate_->heap()->arguments_marker()->ShortPrint();
|
| - PrintF(" ; object (length = %d, is_args = %d)\n", length, is_args);
|
| + isolate_->heap()->arguments_marker()->ShortPrint(trace_scope_->file());
|
| + PrintF(trace_scope_->file(),
|
| + " ; object (length = %d, is_args = %d)\n", length, is_args);
|
| }
|
| // Use the materialization marker value as a sentinel and fill in
|
| // the object after the deoptimized frame is built.
|
| @@ -2064,13 +2162,11 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
|
|
|
|
| void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| - int frame_index,
|
| - unsigned output_offset,
|
| - DeoptimizerTranslatedValueType value_type) {
|
| + int frame_index,
|
| + unsigned output_offset) {
|
| disasm::NameConverter converter;
|
| // A GC-safe temporary placeholder that we can put in the output frame.
|
| const intptr_t kPlaceholder = reinterpret_cast<intptr_t>(Smi::FromInt(0));
|
| - bool is_native = value_type == TRANSLATED_VALUE_IS_NATIVE;
|
|
|
| Translation::Opcode opcode =
|
| static_cast<Translation::Opcode>(iterator->Next());
|
| @@ -2089,15 +2185,17 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| case Translation::REGISTER: {
|
| int input_reg = iterator->Next();
|
| intptr_t input_value = input_->GetRegister(input_reg);
|
| - if (trace_) {
|
| + if (trace_scope_ != NULL) {
|
| PrintF(
|
| + trace_scope_->file(),
|
| " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; %s ",
|
| output_[frame_index]->GetTop() + output_offset,
|
| output_offset,
|
| input_value,
|
| converter.NameOfCPURegister(input_reg));
|
| - reinterpret_cast<Object*>(input_value)->ShortPrint();
|
| - PrintF("\n");
|
| + reinterpret_cast<Object*>(input_value)->ShortPrint(
|
| + trace_scope_->file());
|
| + PrintF(trace_scope_->file(), "\n");
|
| }
|
| output_[frame_index]->SetFrameSlot(output_offset, input_value);
|
| return;
|
| @@ -2106,27 +2204,24 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| case Translation::INT32_REGISTER: {
|
| int input_reg = iterator->Next();
|
| intptr_t value = input_->GetRegister(input_reg);
|
| - bool is_smi = (value_type == TRANSLATED_VALUE_IS_TAGGED) &&
|
| - Smi::IsValid(value);
|
| - if (trace_) {
|
| + bool is_smi = Smi::IsValid(value);
|
| + if (trace_scope_ != NULL) {
|
| PrintF(
|
| + trace_scope_->file(),
|
| " 0x%08" V8PRIxPTR ": [top + %d] <- %" V8PRIdPTR " ; %s (%s)\n",
|
| output_[frame_index]->GetTop() + output_offset,
|
| output_offset,
|
| value,
|
| converter.NameOfCPURegister(input_reg),
|
| - TraceValueType(is_smi, is_native));
|
| + TraceValueType(is_smi));
|
| }
|
| if (is_smi) {
|
| intptr_t tagged_value =
|
| reinterpret_cast<intptr_t>(Smi::FromInt(static_cast<int>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, tagged_value);
|
| - } else if (value_type == TRANSLATED_VALUE_IS_NATIVE) {
|
| - output_[frame_index]->SetFrameSlot(output_offset, value);
|
| } else {
|
| // We save the untagged value on the side and store a GC-safe
|
| // temporary placeholder in the frame.
|
| - ASSERT(value_type == TRANSLATED_VALUE_IS_TAGGED);
|
| AddDoubleValue(output_[frame_index]->GetTop() + output_offset,
|
| static_cast<double>(static_cast<int32_t>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| @@ -2137,28 +2232,25 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| case Translation::UINT32_REGISTER: {
|
| int input_reg = iterator->Next();
|
| uintptr_t value = static_cast<uintptr_t>(input_->GetRegister(input_reg));
|
| - bool is_smi = (value_type == TRANSLATED_VALUE_IS_TAGGED) &&
|
| - (value <= static_cast<uintptr_t>(Smi::kMaxValue));
|
| - if (trace_) {
|
| + bool is_smi = value <= static_cast<uintptr_t>(Smi::kMaxValue);
|
| + if (trace_scope_ != NULL) {
|
| PrintF(
|
| + trace_scope_->file(),
|
| " 0x%08" V8PRIxPTR ": [top + %d] <- %" V8PRIuPTR
|
| " ; uint %s (%s)\n",
|
| output_[frame_index]->GetTop() + output_offset,
|
| output_offset,
|
| value,
|
| converter.NameOfCPURegister(input_reg),
|
| - TraceValueType(is_smi, is_native));
|
| + TraceValueType(is_smi));
|
| }
|
| if (is_smi) {
|
| intptr_t tagged_value =
|
| reinterpret_cast<intptr_t>(Smi::FromInt(static_cast<int>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, tagged_value);
|
| - } else if (value_type == TRANSLATED_VALUE_IS_NATIVE) {
|
| - output_[frame_index]->SetFrameSlot(output_offset, value);
|
| } else {
|
| // We save the untagged value on the side and store a GC-safe
|
| // temporary placeholder in the frame.
|
| - ASSERT(value_type == TRANSLATED_VALUE_IS_TAGGED);
|
| AddDoubleValue(output_[frame_index]->GetTop() + output_offset,
|
| static_cast<double>(static_cast<uint32_t>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| @@ -2169,8 +2261,9 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| case Translation::DOUBLE_REGISTER: {
|
| int input_reg = iterator->Next();
|
| double value = input_->GetDoubleRegister(input_reg);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- %e ; %s\n",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- %e ; %s\n",
|
| output_[frame_index]->GetTop() + output_offset,
|
| output_offset,
|
| value,
|
| @@ -2187,15 +2280,18 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| int input_slot_index = iterator->Next();
|
| unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index);
|
| intptr_t input_value = input_->GetFrameSlot(input_offset);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": ",
|
| output_[frame_index]->GetTop() + output_offset);
|
| - PrintF("[top + %d] <- 0x%08" V8PRIxPTR " ; [sp + %d] ",
|
| + PrintF(trace_scope_->file(),
|
| + "[top + %d] <- 0x%08" V8PRIxPTR " ; [sp + %d] ",
|
| output_offset,
|
| input_value,
|
| input_offset);
|
| - reinterpret_cast<Object*>(input_value)->ShortPrint();
|
| - PrintF("\n");
|
| + reinterpret_cast<Object*>(input_value)->ShortPrint(
|
| + trace_scope_->file());
|
| + PrintF(trace_scope_->file(), "\n");
|
| }
|
| output_[frame_index]->SetFrameSlot(output_offset, input_value);
|
| return;
|
| @@ -2205,27 +2301,25 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| int input_slot_index = iterator->Next();
|
| unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index);
|
| intptr_t value = input_->GetFrameSlot(input_offset);
|
| - bool is_smi = (value_type == TRANSLATED_VALUE_IS_TAGGED) &&
|
| - Smi::IsValid(value);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": ",
|
| + bool is_smi = Smi::IsValid(value);
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": ",
|
| output_[frame_index]->GetTop() + output_offset);
|
| - PrintF("[top + %d] <- %" V8PRIdPTR " ; [sp + %d] (%s)\n",
|
| + PrintF(trace_scope_->file(),
|
| + "[top + %d] <- %" V8PRIdPTR " ; [sp + %d] (%s)\n",
|
| output_offset,
|
| value,
|
| input_offset,
|
| - TraceValueType(is_smi, is_native));
|
| + TraceValueType(is_smi));
|
| }
|
| if (is_smi) {
|
| intptr_t tagged_value =
|
| reinterpret_cast<intptr_t>(Smi::FromInt(static_cast<int>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, tagged_value);
|
| - } else if (value_type == TRANSLATED_VALUE_IS_NATIVE) {
|
| - output_[frame_index]->SetFrameSlot(output_offset, value);
|
| } else {
|
| // We save the untagged value on the side and store a GC-safe
|
| // temporary placeholder in the frame.
|
| - ASSERT(value_type == TRANSLATED_VALUE_IS_TAGGED);
|
| AddDoubleValue(output_[frame_index]->GetTop() + output_offset,
|
| static_cast<double>(static_cast<int32_t>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| @@ -2238,27 +2332,25 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index);
|
| uintptr_t value =
|
| static_cast<uintptr_t>(input_->GetFrameSlot(input_offset));
|
| - bool is_smi = (value_type == TRANSLATED_VALUE_IS_TAGGED) &&
|
| - (value <= static_cast<uintptr_t>(Smi::kMaxValue));
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": ",
|
| + bool is_smi = value <= static_cast<uintptr_t>(Smi::kMaxValue);
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": ",
|
| output_[frame_index]->GetTop() + output_offset);
|
| - PrintF("[top + %d] <- %" V8PRIuPTR " ; [sp + %d] (uint32 %s)\n",
|
| + PrintF(trace_scope_->file(),
|
| + "[top + %d] <- %" V8PRIuPTR " ; [sp + %d] (uint32 %s)\n",
|
| output_offset,
|
| value,
|
| input_offset,
|
| - TraceValueType(is_smi, is_native));
|
| + TraceValueType(is_smi));
|
| }
|
| if (is_smi) {
|
| intptr_t tagged_value =
|
| reinterpret_cast<intptr_t>(Smi::FromInt(static_cast<int>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, tagged_value);
|
| - } else if (value_type == TRANSLATED_VALUE_IS_NATIVE) {
|
| - output_[frame_index]->SetFrameSlot(output_offset, value);
|
| } else {
|
| // We save the untagged value on the side and store a GC-safe
|
| // temporary placeholder in the frame.
|
| - ASSERT(value_type == TRANSLATED_VALUE_IS_TAGGED);
|
| AddDoubleValue(output_[frame_index]->GetTop() + output_offset,
|
| static_cast<double>(static_cast<uint32_t>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| @@ -2270,8 +2362,9 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| int input_slot_index = iterator->Next();
|
| unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index);
|
| double value = input_->GetDoubleFrameSlot(input_offset);
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- %e ; [sp + %d]\n",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- %e ; [sp + %d]\n",
|
| output_[frame_index]->GetTop() + output_offset,
|
| output_offset,
|
| value,
|
| @@ -2286,12 +2379,13 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
|
|
| case Translation::LITERAL: {
|
| Object* literal = ComputeLiteral(iterator->Next());
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- ",
|
| output_[frame_index]->GetTop() + output_offset,
|
| output_offset);
|
| - literal->ShortPrint();
|
| - PrintF(" ; literal\n");
|
| + literal->ShortPrint(trace_scope_->file());
|
| + PrintF(trace_scope_->file(), " ; literal\n");
|
| }
|
| intptr_t value = reinterpret_cast<intptr_t>(literal);
|
| output_[frame_index]->SetFrameSlot(output_offset, value);
|
| @@ -2300,12 +2394,14 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
|
|
| case Translation::DUPLICATED_OBJECT: {
|
| int object_index = iterator->Next();
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- ",
|
| output_[frame_index]->GetTop() + output_offset,
|
| output_offset);
|
| - isolate_->heap()->arguments_marker()->ShortPrint();
|
| - PrintF(" ; duplicate of object #%d\n", object_index);
|
| + isolate_->heap()->arguments_marker()->ShortPrint(trace_scope_->file());
|
| + PrintF(trace_scope_->file(),
|
| + " ; duplicate of object #%d\n", object_index);
|
| }
|
| // Use the materialization marker value as a sentinel and fill in
|
| // the object after the deoptimized frame is built.
|
| @@ -2321,12 +2417,14 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| case Translation::CAPTURED_OBJECT: {
|
| int length = iterator->Next();
|
| bool is_args = opcode == Translation::ARGUMENTS_OBJECT;
|
| - if (trace_) {
|
| - PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- ",
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- ",
|
| output_[frame_index]->GetTop() + output_offset,
|
| output_offset);
|
| - isolate_->heap()->arguments_marker()->ShortPrint();
|
| - PrintF(" ; object (length = %d, is_args = %d)\n", length, is_args);
|
| + isolate_->heap()->arguments_marker()->ShortPrint(trace_scope_->file());
|
| + PrintF(trace_scope_->file(),
|
| + " ; object (length = %d, is_args = %d)\n", length, is_args);
|
| }
|
| // Use the materialization marker value as a sentinel and fill in
|
| // the object after the deoptimized frame is built.
|
|
|