30 #if defined(V8_TARGET_ARCH_IA32)
40 const int Deoptimizer::table_entry_size_ = 10;
49 Isolate* isolate = code->GetIsolate();
50 HandleScope scope(isolate);
54 int min_reloc_size = 0;
55 int prev_pc_offset = 0;
56 DeoptimizationInputData* deopt_data =
58 for (
int i = 0; i < deopt_data->DeoptCount(); i++) {
59 int pc_offset = deopt_data->Pc(i)->value();
60 if (pc_offset == -1)
continue;
62 int pc_delta = pc_offset - prev_pc_offset;
66 if (pc_delta <= RelocInfo::kMaxSmallPCDelta) {
71 prev_pc_offset = pc_offset;
77 int reloc_length = code->relocation_info()->length();
78 if (min_reloc_size > reloc_length) {
79 int comment_reloc_size = RelocInfo::kMinRelocCommentSize;
81 int min_padding = min_reloc_size - reloc_length;
83 int additional_comments =
84 (min_padding + comment_reloc_size - 1) / comment_reloc_size;
86 int padding = additional_comments * comment_reloc_size;
90 Factory* factory = isolate->factory();
91 Handle<ByteArray> new_reloc =
92 factory->NewByteArray(reloc_length + padding,
TENURED);
93 memcpy(new_reloc->GetDataStartAddress() + padding,
94 code->relocation_info()->GetDataStartAddress(),
98 RelocInfoWriter reloc_info_writer(
99 new_reloc->GetDataStartAddress() + padding, 0);
100 intptr_t comment_string
101 =
reinterpret_cast<intptr_t
>(RelocInfo::kFillerCommentString);
102 RelocInfo rinfo(0, RelocInfo::COMMENT, comment_string,
NULL);
103 for (
int i = 0; i < additional_comments; ++i) {
105 byte* pos_before = reloc_info_writer.pos();
107 reloc_info_writer.Write(&rinfo);
108 ASSERT(RelocInfo::kMinRelocCommentSize ==
109 pos_before - reloc_info_writer.pos());
112 code->set_relocation_info(*new_reloc);
118 if (!function->IsOptimized())
return;
120 Isolate* isolate =
function->GetIsolate();
121 HandleScope scope(isolate);
122 AssertNoAllocation no_allocation;
125 Code* code =
function->code();
126 Address code_start_address = code->instruction_start();
132 ByteArray* reloc_info = code->relocation_info();
133 Address reloc_end_address = reloc_info->address() + reloc_info->Size();
134 RelocInfoWriter reloc_info_writer(reloc_end_address, code_start_address);
144 DeoptimizationInputData* deopt_data =
149 for (
int i = 0; i < deopt_data->DeoptCount(); i++) {
150 if (deopt_data->Pc(i)->value() == -1)
continue;
152 Address call_address = code_start_address + deopt_data->Pc(i)->value();
153 CodePatcher patcher(call_address,
patch_size());
157 RelocInfo rinfo(call_address + 1,
159 reinterpret_cast<intptr_t>(deopt_entry),
161 reloc_info_writer.Write(&rinfo);
165 call_address >= prev_call_address +
patch_size());
168 prev_call_address = call_address;
173 int new_reloc_size = reloc_end_address - reloc_info_writer.pos();
174 memmove(code->relocation_start(), reloc_info_writer.pos(), new_reloc_size);
177 reloc_info->set_length(new_reloc_size);
181 Address junk_address = reloc_info->address() + reloc_info->Size();
182 ASSERT(junk_address <= reloc_end_address);
183 isolate->heap()->CreateFillerObjectAt(junk_address,
184 reloc_end_address - junk_address);
188 DeoptimizerData* data = isolate->deoptimizer_data();
189 node->set_next(data->deoptimizing_code_list_);
190 data->deoptimizing_code_list_ = node;
195 isolate->heap()->mark_compact_collector()->InvalidateCode(code);
198 function->ReplaceCode(function->shared()->code());
200 if (FLAG_trace_deopt) {
201 PrintF(
"[forced deoptimization: ");
202 function->PrintName();
203 PrintF(
" / %x]\n", reinterpret_cast<uint32_t>(
function));
208 static const byte kJnsInstruction = 0x79;
209 static const byte kJnsOffset = 0x13;
210 static const byte kJaeInstruction = 0x73;
211 static const byte kJaeOffset = 0x07;
212 static const byte kCallInstruction = 0xe8;
213 static const byte kNopByteOne = 0x66;
214 static const byte kNopByteTwo = 0x90;
220 Code* replacement_code) {
241 if (FLAG_count_based_interrupts) {
242 ASSERT_EQ(kJnsInstruction, *(call_target_address - 3));
243 ASSERT_EQ(kJnsOffset, *(call_target_address - 2));
245 ASSERT_EQ(kJaeInstruction, *(call_target_address - 3));
246 ASSERT_EQ(kJaeOffset, *(call_target_address - 2));
248 ASSERT_EQ(kCallInstruction, *(call_target_address - 1));
249 *(call_target_address - 3) = kNopByteOne;
250 *(call_target_address - 2) = kNopByteTwo;
252 replacement_code->entry());
254 unoptimized_code->GetHeap()->incremental_marking()->RecordCodeTargetPatch(
255 unoptimized_code, call_target_address, replacement_code);
262 Code* replacement_code) {
269 ASSERT_EQ(kNopByteOne, *(call_target_address - 3));
270 ASSERT_EQ(kNopByteTwo, *(call_target_address - 2));
271 ASSERT_EQ(kCallInstruction, *(call_target_address - 1));
272 if (FLAG_count_based_interrupts) {
273 *(call_target_address - 3) = kJnsInstruction;
274 *(call_target_address - 2) = kJnsOffset;
276 *(call_target_address - 3) = kJaeInstruction;
277 *(call_target_address - 2) = kJaeOffset;
280 check_code->entry());
282 check_code->GetHeap()->incremental_marking()->RecordCodeTargetPatch(
283 unoptimized_code, call_target_address, check_code);
287 static int LookupBailoutId(DeoptimizationInputData* data,
unsigned ast_id) {
288 ByteArray* translations = data->TranslationByteArray();
289 int length = data->DeoptCount();
290 for (
int i = 0; i < length; i++) {
291 if (static_cast<unsigned>(data->AstId(i)->value()) == ast_id) {
292 TranslationIterator it(translations, data->TranslationIndex(i)->value());
293 int value = it.Next();
294 ASSERT(Translation::BEGIN == static_cast<Translation::Opcode>(value));
297 if (value == 1)
return i;
305 void Deoptimizer::DoComputeOsrOutputFrame() {
307 optimized_code_->deoptimization_data());
308 unsigned ast_id = data->OsrAstId()->value();
311 ASSERT(bailout_id_ == ast_id);
313 int bailout_id = LookupBailoutId(data, ast_id);
314 unsigned translation_index = data->TranslationIndex(bailout_id)->value();
315 ByteArray* translations = data->TranslationByteArray();
317 TranslationIterator iterator(translations, translation_index);
320 ASSERT(Translation::BEGIN == opcode);
322 int count = iterator.Next();
329 ASSERT(Translation::JS_FRAME == opcode);
330 unsigned node_id = iterator.Next();
332 ASSERT(node_id == ast_id);
335 ASSERT(
function == function_);
336 unsigned height = iterator.Next();
338 USE(height_in_bytes);
340 unsigned fixed_size = ComputeFixedSize(function_);
342 ASSERT(fixed_size + height_in_bytes == input_frame_size);
345 unsigned outgoing_height = data->ArgumentsStackHeight(bailout_id)->value();
346 unsigned outgoing_size = outgoing_height *
kPointerSize;
347 unsigned output_frame_size = fixed_size + stack_slot_size + outgoing_size;
348 ASSERT(outgoing_size == 0);
350 if (FLAG_trace_osr) {
352 reinterpret_cast<intptr_t>(function_));
354 PrintF(
" => node=%u, frame=%d->%d, ebp:esp=0x%08x:0x%08x]\n",
366 output_frame_size, function_);
372 int parameter_count = function_->shared()->formal_parameter_count() + 1;
373 for (
int i = 0; i < parameter_count; ++i) {
382 int limit = input_offset - (parameter_count *
kPointerSize);
383 while (ok && input_offset > limit) {
384 ok = DoOsrTranslateCommand(&iterator, &input_offset);
392 uint32_t input_value = input_->
GetFrameSlot(input_offset);
393 if (FLAG_trace_osr) {
394 const char*
name =
"UNKNOWN";
397 name =
"caller's pc";
409 PrintF(
" [sp + %d] <- 0x%08x ; [sp + %d] (fixed part - %s)\n",
422 if ((frame_pointer & kPointerSize) != 0) {
424 has_alignment_padding_ = 1;
427 int32_t alignment_state = (has_alignment_padding_ == 1) ?
430 if (FLAG_trace_osr) {
431 PrintF(
" [sp + %d] <- 0x%08x ; (alignment state)\n",
435 output_[0]->
SetFrameSlot(output_offset, alignment_state);
439 while (ok && input_offset >= 0) {
440 ok = DoOsrTranslateCommand(&iterator, &input_offset);
447 output_[0]->
SetPc(reinterpret_cast<uint32_t>(from_));
453 unsigned pc_offset = data->OsrPcOffset()->value();
454 uint32_t
pc =
reinterpret_cast<uint32_t
>(
455 optimized_code_->
entry() + pc_offset);
456 output_[0]->
SetPc(pc);
459 function->GetIsolate()->builtins()->builtin(Builtins::kNotifyOSR);
461 reinterpret_cast<uint32_t>(continuation->entry()));
463 if (FLAG_trace_osr) {
465 ok ?
"finished" :
"aborted",
466 reinterpret_cast<intptr_t>(
function));
467 function->PrintName();
468 PrintF(
" => pc=0x%0x]\n", output_[0]->GetPc());
473 void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator,
476 unsigned height = iterator->Next();
478 if (FLAG_trace_deopt) {
479 PrintF(
" translating arguments adaptor => height=%d\n", height_in_bytes);
483 unsigned output_frame_size = height_in_bytes + fixed_frame_size;
491 ASSERT(frame_index > 0 && frame_index < output_count_ - 1);
493 output_[frame_index] = output_frame;
497 uint32_t top_address;
498 top_address = output_[frame_index - 1]->
GetTop() - output_frame_size;
499 output_frame->SetTop(top_address);
502 int parameter_count = height;
503 unsigned output_offset = output_frame_size;
504 for (
int i = 0; i < parameter_count; ++i) {
506 DoTranslateCommand(iterator, frame_index, output_offset);
511 intptr_t callers_pc = output_[frame_index - 1]->
GetPc();
512 output_frame->SetFrameSlot(output_offset, callers_pc);
513 if (FLAG_trace_deopt) {
514 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; caller's pc\n",
515 top_address + output_offset, output_offset, callers_pc);
520 intptr_t value = output_[frame_index - 1]->
GetFp();
521 output_frame->SetFrameSlot(output_offset, value);
523 output_frame->SetFp(fp_value);
524 if (FLAG_trace_deopt) {
525 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; caller's fp\n",
526 fp_value, output_offset, value);
531 intptr_t context =
reinterpret_cast<intptr_t
>(
533 output_frame->SetFrameSlot(output_offset, context);
534 if (FLAG_trace_deopt) {
535 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; context (adaptor sentinel)\n",
536 top_address + output_offset, output_offset, context);
541 value =
reinterpret_cast<intptr_t
>(
function);
542 output_frame->SetFrameSlot(output_offset, value);
543 if (FLAG_trace_deopt) {
544 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; function\n",
545 top_address + output_offset, output_offset, value);
550 value =
reinterpret_cast<uint32_t
>(
Smi::FromInt(height - 1));
551 output_frame->SetFrameSlot(output_offset, value);
552 if (FLAG_trace_deopt) {
553 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; argc (%d)\n",
554 top_address + output_offset, output_offset, value, height - 1);
557 ASSERT(0 == output_offset);
559 Builtins* builtins = isolate_->
builtins();
560 Code* adaptor_trampoline =
561 builtins->
builtin(Builtins::kArgumentsAdaptorTrampoline);
562 uint32_t pc =
reinterpret_cast<uint32_t
>(
563 adaptor_trampoline->instruction_start() +
564 isolate_->
heap()->arguments_adaptor_deopt_pc_offset()->value());
565 output_frame->SetPc(pc);
569 void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
571 Builtins* builtins = isolate_->
builtins();
572 Code* construct_stub = builtins->
builtin(Builtins::kJSConstructStubGeneric);
574 unsigned height = iterator->Next();
576 if (FLAG_trace_deopt) {
577 PrintF(
" translating construct stub => height=%d\n", height_in_bytes);
581 unsigned output_frame_size = height_in_bytes + fixed_frame_size;
586 output_frame->SetFrameType(StackFrame::CONSTRUCT);
589 ASSERT(frame_index > 0 && frame_index < output_count_ - 1);
591 output_[frame_index] = output_frame;
595 uint32_t top_address;
596 top_address = output_[frame_index - 1]->
GetTop() - output_frame_size;
597 output_frame->SetTop(top_address);
600 int parameter_count = height;
601 unsigned output_offset = output_frame_size;
602 for (
int i = 0; i < parameter_count; ++i) {
604 DoTranslateCommand(iterator, frame_index, output_offset);
609 intptr_t callers_pc = output_[frame_index - 1]->
GetPc();
610 output_frame->SetFrameSlot(output_offset, callers_pc);
611 if (FLAG_trace_deopt) {
612 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; caller's pc\n",
613 top_address + output_offset, output_offset, callers_pc);
618 intptr_t value = output_[frame_index - 1]->
GetFp();
619 output_frame->SetFrameSlot(output_offset, value);
621 output_frame->SetFp(fp_value);
622 if (FLAG_trace_deopt) {
623 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; caller's fp\n",
624 fp_value, output_offset, value);
629 value = output_[frame_index - 1]->
GetContext();
630 output_frame->SetFrameSlot(output_offset, value);
631 if (FLAG_trace_deopt) {
632 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; context\n",
633 top_address + output_offset, output_offset, value);
638 value =
reinterpret_cast<intptr_t
>(
Smi::FromInt(StackFrame::CONSTRUCT));
639 output_frame->SetFrameSlot(output_offset, value);
640 if (FLAG_trace_deopt) {
641 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; function (construct sentinel)\n",
642 top_address + output_offset, output_offset, value);
647 value =
reinterpret_cast<intptr_t
>(construct_stub);
648 output_frame->SetFrameSlot(output_offset, value);
649 if (FLAG_trace_deopt) {
650 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; code object\n",
651 top_address + output_offset, output_offset, value);
656 value =
reinterpret_cast<uint32_t
>(
Smi::FromInt(height - 1));
657 output_frame->SetFrameSlot(output_offset, value);
658 if (FLAG_trace_deopt) {
659 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; argc (%d)\n",
660 top_address + output_offset, output_offset, value, height - 1);
666 value = output_frame->GetFrameSlot(output_frame_size - kPointerSize);
667 output_frame->SetFrameSlot(output_offset, value);
668 if (FLAG_trace_deopt) {
669 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; allocated receiver\n",
670 top_address + output_offset, output_offset, value);
673 ASSERT(0 == output_offset);
675 uint32_t pc =
reinterpret_cast<uint32_t
>(
676 construct_stub->instruction_start() +
677 isolate_->
heap()->construct_stub_deopt_pc_offset()->value());
678 output_frame->SetPc(pc);
682 void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator,
684 int node_id = iterator->Next();
686 unsigned height = iterator->Next();
688 if (FLAG_trace_deopt) {
690 function->PrintName();
691 PrintF(
" => node=%d, height=%d\n", node_id, height_in_bytes);
696 unsigned fixed_frame_size = ComputeFixedSize(
function);
698 unsigned output_frame_size = height_in_bytes + fixed_frame_size;
703 output_frame->SetFrameType(StackFrame::JAVA_SCRIPT);
705 bool is_bottommost = (0 == frame_index);
706 bool is_topmost = (output_count_ - 1 == frame_index);
707 ASSERT(frame_index >= 0 && frame_index < output_count_);
709 output_[frame_index] = output_frame;
712 int parameter_count =
function->shared()->formal_parameter_count() + 1;
713 unsigned output_offset = output_frame_size;
714 unsigned input_offset = input_frame_size;
716 unsigned alignment_state_offset =
717 input_offset - parameter_count * kPointerSize -
727 uint32_t top_address;
730 has_alignment_padding_ =
737 height_in_bytes + has_alignment_padding_ *
kPointerSize;
739 top_address = output_[frame_index - 1]->
GetTop() - output_frame_size;
741 output_frame->SetTop(top_address);
743 for (
int i = 0; i < parameter_count; ++i) {
745 DoTranslateCommand(iterator, frame_index, output_offset);
763 value = output_[frame_index - 1]->
GetPc();
765 output_frame->SetFrameSlot(output_offset, value);
766 if (FLAG_trace_deopt) {
767 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; caller's pc\n",
768 top_address + output_offset, output_offset, value);
780 value = output_[frame_index - 1]->
GetFp();
782 output_frame->SetFrameSlot(output_offset, value);
787 output_frame->SetFp(fp_value);
788 if (is_topmost) output_frame->SetRegister(
ebp.
code(), fp_value);
789 if (FLAG_trace_deopt) {
790 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; caller's fp\n",
791 fp_value, output_offset, value);
793 ASSERT(!is_bottommost || !has_alignment_padding_ ||
794 (fp_value & kPointerSize) != 0);
804 value =
reinterpret_cast<uint32_t
>(
function->context());
806 output_frame->SetFrameSlot(output_offset, value);
807 output_frame->SetContext(value);
808 if (is_topmost) output_frame->SetRegister(
esi.
code(), value);
809 if (FLAG_trace_deopt) {
810 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; context\n",
811 top_address + output_offset, output_offset, value);
817 value =
reinterpret_cast<uint32_t
>(
function);
821 output_frame->SetFrameSlot(output_offset, value);
822 if (FLAG_trace_deopt) {
823 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; function\n",
824 top_address + output_offset, output_offset, value);
828 for (
unsigned i = 0; i < height; ++i) {
830 DoTranslateCommand(iterator, frame_index, output_offset);
832 ASSERT(0 == output_offset);
835 Code* non_optimized_code =
function->shared()->code();
836 FixedArray* raw_data = non_optimized_code->deoptimization_data();
838 Address start = non_optimized_code->instruction_start();
839 unsigned pc_and_state =
GetOutputInfo(data, node_id, function->shared());
841 uint32_t pc_value =
reinterpret_cast<uint32_t
>(start + pc_offset);
842 output_frame->SetPc(pc_value);
849 if (is_topmost && bailout_type_ !=
DEBUGGER) {
850 Builtins* builtins = isolate_->
builtins();
851 Code* continuation = (bailout_type_ ==
EAGER)
852 ? builtins->
builtin(Builtins::kNotifyDeoptimized)
853 : builtins->builtin(Builtins::kNotifyLazyDeoptimized);
854 output_frame->SetContinuation(
855 reinterpret_cast<uint32_t>(continuation->entry()));
860 void Deoptimizer::FillInputFrame(
Address tos, JavaScriptFrame* frame) {
883 void Deoptimizer::EntryGenerator::Generate() {
885 CpuFeatures::Scope scope(
SSE2);
887 Isolate* isolate = masm()->isolate();
894 __ sub(
esp, Immediate(kDoubleRegsSize));
898 __ movdbl(Operand(
esp, offset), xmm_reg);
903 const int kSavedRegistersAreaSize = kNumberOfRegisters * kPointerSize +
907 __ mov(
ebx, Operand(
esp, kSavedRegistersAreaSize));
911 if (
type() == EAGER) {
912 __ Set(
ecx, Immediate(0));
913 __ lea(
edx, Operand(
esp, kSavedRegistersAreaSize + 1 * kPointerSize));
915 __ mov(
ecx, Operand(
esp, kSavedRegistersAreaSize + 1 * kPointerSize));
916 __ lea(
edx, Operand(
esp, kSavedRegistersAreaSize + 2 * kPointerSize));
922 __ PrepareCallCFunction(6,
eax);
924 __ mov(Operand(
esp, 0 * kPointerSize),
eax);
925 __ mov(Operand(
esp, 1 * kPointerSize), Immediate(
type()));
926 __ mov(Operand(
esp, 2 * kPointerSize),
ebx);
927 __ mov(Operand(
esp, 3 * kPointerSize),
ecx);
928 __ mov(Operand(
esp, 4 * kPointerSize),
edx);
929 __ mov(Operand(
esp, 5 * kPointerSize),
930 Immediate(ExternalReference::isolate_address()));
932 AllowExternalCallThatCantCauseGC scope(masm());
933 __ CallCFunction(ExternalReference::new_deoptimizer_function(isolate), 6);
941 for (
int i = kNumberOfRegisters - 1; i >= 0; i--) {
943 __ pop(Operand(
ebx, offset));
949 int dst_offset = i * kDoubleSize + double_regs_offset;
951 __ movdbl(
xmm0, Operand(
esp, src_offset));
952 __ movdbl(Operand(
ebx, dst_offset),
xmm0);
956 if (
type() == EAGER) {
957 __ add(
esp, Immediate(kDoubleRegsSize + kPointerSize));
959 __ add(
esp, Immediate(kDoubleRegsSize + 2 * kPointerSize));
973 __ pop(Operand(
edx, 0));
974 __ add(
edx, Immediate(
sizeof(uint32_t)));
980 __ PrepareCallCFunction(1,
ebx);
981 __ mov(Operand(
esp, 0 * kPointerSize),
eax);
983 AllowExternalCallThatCantCauseGC scope(masm());
985 ExternalReference::compute_output_frames_function(isolate), 1);
996 if (FLAG_debug_code) {
998 __ Assert(
equal,
"alignment marker expected");
1000 __ bind(&no_padding);
1008 __ bind(&no_padding);
1012 Label outer_push_loop, inner_push_loop;
1018 __ bind(&outer_push_loop);
1022 __ bind(&inner_push_loop);
1023 __ sub(
ecx, Immediate(
sizeof(uint32_t)));
1027 __ add(
eax, Immediate(kPointerSize));
1029 __ j(
below, &outer_push_loop);
1032 if (
type() == OSR) {
1035 int src_offset = i * kDoubleSize + double_regs_offset;
1036 __ movdbl(xmm_reg, Operand(
ebx, src_offset));
1041 if (
type() != OSR) {
1049 for (
int i = 0; i < kNumberOfRegisters; i++) {
1051 __ push(Operand(
ebx, offset));
1065 for (
int i = 0; i < count(); i++) {
1066 int start = masm()->pc_offset();
1070 ASSERT(masm()->pc_offset() - start == table_entry_size_);
1080 #endif // V8_TARGET_ARCH_IA32
static int registers_offset()
static const int kCallerFPOffset
Code * builtin(Name name)
static DeoptimizationOutputData * cast(Object *obj)
void PrintF(const char *format,...)
static Smi * FromInt(int value)
void SetFrameSlot(unsigned offset, intptr_t value)
value format" "after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false, "print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false, "print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false, "report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true, "garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true, "flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true, "use incremental marking") DEFINE_bool(incremental_marking_steps, true, "do incremental marking steps") DEFINE_bool(trace_incremental_marking, false, "trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true, "Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false, "Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true, "use inline caching") DEFINE_bool(native_code_counters, false, "generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false, "Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true, "Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false, "Never perform compaction on full GC-testing only") DEFINE_bool(compact_code_space, true, "Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true, "Flush inline caches prior to mark compact collection and" "flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0, "Default seed for initializing random generator" "(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true, "allows verbose printing") DEFINE_bool(allow_natives_syntax, false, "allow natives syntax") DEFINE_bool(trace_sim, false, "Trace simulator execution") DEFINE_bool(check_icache, false, "Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0, "Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8, "Stack alingment in bytes in simulator(4 or 8, 8 is default)") DEFINE_bool(trace_exception, false, "print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false, "preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true, "randomize hashes to avoid predictable hash collisions" "(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0, "Fixed seed to use to hash property keys(0 means random)" "(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false, "activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true, "generate optimized regexp code") DEFINE_bool(testing_bool_flag, true, "testing_bool_flag") DEFINE_int(testing_int_flag, 13, "testing_int_flag") DEFINE_float(testing_float_flag, 2.5, "float-flag") DEFINE_string(testing_string_flag, "Hello, world!", "string-flag") DEFINE_int(testing_prng_seed, 42, "Seed used for threading test randomness") DEFINE_string(testing_serialization_file, "/tmp/serdes", "file in which to serialize heap") DEFINE_bool(help, false, "Print usage message, including flags, on console") DEFINE_bool(dump_counters, false, "Dump counters on exit") DEFINE_string(map_counters, "", "Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT, "Pass all remaining arguments to the script.Alias for\"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#43"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2#define FLAG_MODE_DEFINE_DEFAULTS#1"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flag-definitions.h"1#define FLAG_FULL(ftype, ctype, nam, def, cmt)#define FLAG_READONLY(ftype, ctype, nam, def, cmt)#define DEFINE_implication(whenflag, thenflag)#define DEFINE_bool(nam, def, cmt)#define DEFINE_int(nam, def, cmt)#define DEFINE_float(nam, def, cmt)#define DEFINE_string(nam, def, cmt)#define DEFINE_args(nam, def, cmt)#define FLAG DEFINE_bool(use_strict, false,"enforce strict mode") DEFINE_bool(es5_readonly, false,"activate correct semantics for inheriting readonliness") DEFINE_bool(es52_globals, false,"activate new semantics for global var declarations") DEFINE_bool(harmony_typeof, false,"enable harmony semantics for typeof") DEFINE_bool(harmony_scoping, false,"enable harmony block scoping") DEFINE_bool(harmony_modules, false,"enable harmony modules (implies block scoping)") DEFINE_bool(harmony_proxies, false,"enable harmony proxies") DEFINE_bool(harmony_collections, false,"enable harmony collections (sets, maps, and weak maps)") DEFINE_bool(harmony, false,"enable all harmony features (except typeof)") DEFINE_implication(harmony, harmony_scoping) DEFINE_implication(harmony, harmony_modules) DEFINE_implication(harmony, harmony_proxies) DEFINE_implication(harmony, harmony_collections) DEFINE_implication(harmony_modules, harmony_scoping) DEFINE_bool(packed_arrays, false,"optimizes arrays that have no holes") DEFINE_bool(smi_only_arrays, true,"tracks arrays with only smi values") DEFINE_bool(clever_optimizations, true,"Optimize object size, Array shift, DOM strings and string +") DEFINE_bool(unbox_double_arrays, true,"automatically unbox arrays of doubles") DEFINE_bool(string_slices, true,"use string slices") DEFINE_bool(crankshaft, true,"use crankshaft") DEFINE_string(hydrogen_filter,"","optimization filter") DEFINE_bool(use_range, true,"use hydrogen range analysis") DEFINE_bool(eliminate_dead_phis, true,"eliminate dead phis") DEFINE_bool(use_gvn, true,"use hydrogen global value numbering") DEFINE_bool(use_canonicalizing, true,"use hydrogen instruction canonicalizing") DEFINE_bool(use_inlining, true,"use function inlining") DEFINE_int(max_inlined_source_size, 600,"maximum source size in bytes considered for a single inlining") DEFINE_int(max_inlined_nodes, 196,"maximum number of AST nodes considered for a single inlining") DEFINE_int(max_inlined_nodes_cumulative, 196,"maximum cumulative number of AST nodes considered for inlining") DEFINE_bool(loop_invariant_code_motion, true,"loop invariant code motion") DEFINE_bool(collect_megamorphic_maps_from_stub_cache, true,"crankshaft harvests type feedback from stub cache") DEFINE_bool(hydrogen_stats, false,"print statistics for hydrogen") DEFINE_bool(trace_hydrogen, false,"trace generated hydrogen to file") DEFINE_string(trace_phase,"Z","trace generated IR for specified phases") DEFINE_bool(trace_inlining, false,"trace inlining decisions") DEFINE_bool(trace_alloc, false,"trace register allocator") DEFINE_bool(trace_all_uses, false,"trace all use positions") DEFINE_bool(trace_range, false,"trace range analysis") DEFINE_bool(trace_gvn, false,"trace global value numbering") DEFINE_bool(trace_representation, false,"trace representation types") DEFINE_bool(stress_pointer_maps, false,"pointer map for every instruction") DEFINE_bool(stress_environments, false,"environment for every instruction") DEFINE_int(deopt_every_n_times, 0,"deoptimize every n times a deopt point is passed") DEFINE_bool(trap_on_deopt, false,"put a break point before deoptimizing") DEFINE_bool(deoptimize_uncommon_cases, true,"deoptimize uncommon cases") DEFINE_bool(polymorphic_inlining, true,"polymorphic inlining") DEFINE_bool(use_osr, true,"use on-stack replacement") DEFINE_bool(array_bounds_checks_elimination, false,"perform array bounds checks elimination") DEFINE_bool(array_index_dehoisting, false,"perform array index dehoisting") DEFINE_bool(trace_osr, false,"trace on-stack replacement") DEFINE_int(stress_runs, 0,"number of stress runs") DEFINE_bool(optimize_closures, true,"optimize closures") DEFINE_bool(inline_construct, true,"inline constructor calls") DEFINE_bool(inline_arguments, true,"inline functions with arguments object") DEFINE_int(loop_weight, 1,"loop weight for representation inference") DEFINE_bool(optimize_for_in, true,"optimize functions containing for-in loops") DEFINE_bool(experimental_profiler, true,"enable all profiler experiments") DEFINE_bool(watch_ic_patching, false,"profiler considers IC stability") DEFINE_int(frame_count, 1,"number of stack frames inspected by the profiler") DEFINE_bool(self_optimization, false,"primitive functions trigger their own optimization") DEFINE_bool(direct_self_opt, false,"call recompile stub directly when self-optimizing") DEFINE_bool(retry_self_opt, false,"re-try self-optimization if it failed") DEFINE_bool(count_based_interrupts, false,"trigger profiler ticks based on counting instead of timing") DEFINE_bool(interrupt_at_exit, false,"insert an interrupt check at function exit") DEFINE_bool(weighted_back_edges, false,"weight back edges by jump distance for interrupt triggering") DEFINE_int(interrupt_budget, 5900,"execution budget before interrupt is triggered") DEFINE_int(type_info_threshold, 15,"percentage of ICs that must have type info to allow optimization") DEFINE_int(self_opt_count, 130,"call count before self-optimization") DEFINE_implication(experimental_profiler, watch_ic_patching) DEFINE_implication(experimental_profiler, self_optimization) DEFINE_implication(experimental_profiler, retry_self_opt) DEFINE_implication(experimental_profiler, count_based_interrupts) DEFINE_implication(experimental_profiler, interrupt_at_exit) DEFINE_implication(experimental_profiler, weighted_back_edges) DEFINE_bool(trace_opt_verbose, false,"extra verbose compilation tracing") DEFINE_implication(trace_opt_verbose, trace_opt) DEFINE_bool(debug_code, false,"generate extra code (assertions) for debugging") DEFINE_bool(code_comments, false,"emit comments in code disassembly") DEFINE_bool(enable_sse2, true,"enable use of SSE2 instructions if available") DEFINE_bool(enable_sse3, true,"enable use of SSE3 instructions if available") DEFINE_bool(enable_sse4_1, true,"enable use of SSE4.1 instructions if available") DEFINE_bool(enable_cmov, true,"enable use of CMOV instruction if available") DEFINE_bool(enable_rdtsc, true,"enable use of RDTSC instruction if available") DEFINE_bool(enable_sahf, true,"enable use of SAHF instruction if available (X64 only)") DEFINE_bool(enable_vfp3, true,"enable use of VFP3 instructions if available - this implies ""enabling ARMv7 instructions (ARM only)") DEFINE_bool(enable_armv7, true,"enable use of ARMv7 instructions if available (ARM only)") DEFINE_bool(enable_fpu, true,"enable use of MIPS FPU instructions if available (MIPS only)") DEFINE_string(expose_natives_as, NULL,"expose natives in global object") DEFINE_string(expose_debug_as, NULL,"expose debug in global object") DEFINE_bool(expose_gc, false,"expose gc extension") DEFINE_bool(expose_externalize_string, false,"expose externalize string extension") DEFINE_int(stack_trace_limit, 10,"number of stack frames to capture") DEFINE_bool(builtins_in_stack_traces, false,"show built-in functions in stack traces") DEFINE_bool(disable_native_files, false,"disable builtin natives files") DEFINE_bool(inline_new, true,"use fast inline allocation") DEFINE_bool(stack_trace_on_abort, true,"print a stack trace if an assertion failure occurs") DEFINE_bool(trace, false,"trace function calls") DEFINE_bool(mask_constants_with_cookie, true,"use random jit cookie to mask large constants") DEFINE_bool(lazy, true,"use lazy compilation") DEFINE_bool(trace_opt, false,"trace lazy optimization") DEFINE_bool(trace_opt_stats, false,"trace lazy optimization statistics") DEFINE_bool(opt, true,"use adaptive optimizations") DEFINE_bool(always_opt, false,"always try to optimize functions") DEFINE_bool(prepare_always_opt, false,"prepare for turning on always opt") DEFINE_bool(trace_deopt, false,"trace deoptimization") DEFINE_int(min_preparse_length, 1024,"minimum length for automatic enable preparsing") DEFINE_bool(always_full_compiler, false,"try to use the dedicated run-once backend for all code") DEFINE_bool(trace_bailout, false,"print reasons for falling back to using the classic V8 backend") DEFINE_bool(compilation_cache, true,"enable compilation cache") DEFINE_bool(cache_prototype_transitions, true,"cache prototype transitions") DEFINE_bool(trace_debug_json, false,"trace debugging JSON request/response") DEFINE_bool(debugger_auto_break, true,"automatically set the debug break flag when debugger commands are ""in the queue") DEFINE_bool(enable_liveedit, true,"enable liveedit experimental feature") DEFINE_bool(break_on_abort, true,"always cause a debug break before aborting") DEFINE_int(stack_size, kPointerSize *123,"default size of stack region v8 is allowed to use (in kBytes)") DEFINE_int(max_stack_trace_source_length, 300,"maximum length of function source code printed in a stack trace.") DEFINE_bool(always_inline_smi_code, false,"always inline smi code in non-opt code") DEFINE_int(max_new_space_size, 0,"max size of the new generation (in kBytes)") DEFINE_int(max_old_space_size, 0,"max size of the old generation (in Mbytes)") DEFINE_int(max_executable_size, 0,"max size of executable memory (in Mbytes)") DEFINE_bool(gc_global, false,"always perform global GCs") DEFINE_int(gc_interval,-1,"garbage collect after <n> allocations") DEFINE_bool(trace_gc, false,"print one trace line following each garbage collection") DEFINE_bool(trace_gc_nvp, false,"print one detailed trace line in name=value format ""after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false,"print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false,"print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false,"report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true,"garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true,"flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true,"use incremental marking") DEFINE_bool(incremental_marking_steps, true,"do incremental marking steps") DEFINE_bool(trace_incremental_marking, false,"trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true,"Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false,"Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true,"use inline caching") DEFINE_bool(native_code_counters, false,"generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false,"Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true,"Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false,"Never perform compaction on full GC - testing only") DEFINE_bool(compact_code_space, true,"Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true,"Flush inline caches prior to mark compact collection and ""flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0,"Default seed for initializing random generator ""(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true,"allows verbose printing") DEFINE_bool(allow_natives_syntax, false,"allow natives syntax") DEFINE_bool(trace_sim, false,"Trace simulator execution") DEFINE_bool(check_icache, false,"Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0,"Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8,"Stack alingment in bytes in simulator (4 or 8, 8 is default)") DEFINE_bool(trace_exception, false,"print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false,"preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true,"randomize hashes to avoid predictable hash collisions ""(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0,"Fixed seed to use to hash property keys (0 means random)""(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false,"activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true,"generate optimized regexp code") DEFINE_bool(testing_bool_flag, true,"testing_bool_flag") DEFINE_int(testing_int_flag, 13,"testing_int_flag") DEFINE_float(testing_float_flag, 2.5,"float-flag") DEFINE_string(testing_string_flag,"Hello, world!","string-flag") DEFINE_int(testing_prng_seed, 42,"Seed used for threading test randomness") DEFINE_string(testing_serialization_file,"/tmp/serdes","file in which to serialize heap") DEFINE_bool(help, false,"Print usage message, including flags, on console") DEFINE_bool(dump_counters, false,"Dump counters on exit") DEFINE_string(map_counters,"","Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT,"Pass all remaining arguments to the script. Alias for \"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#47"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2 namespace{struct Flag{enum FlagType{TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS} name
static XMMRegister FromAllocationIndex(int index)
static const int kNumAllocatableRegisters
const int kNoAlignmentPadding
static const int kCallInstructionLength
#define ASSERT(condition)
static void DeoptimizeFunction(JSFunction *function)
#define ASSERT_GE(v1, v2)
intptr_t GetContext() const
void SetFrameType(StackFrame::Type type)
const int kAlignmentPaddingPushed
static const int kNumRegisters
static int double_registers_offset()
static int frame_content_offset()
static int output_offset()
static void set_target_address_at(Address pc, Address target)
static int state_offset()
void SetRegister(unsigned n, intptr_t value)
static unsigned decode(uint32_t value)
static const int kDynamicAlignmentStateOffset
friend class DeoptimizingCodeListNode
const int kAlignmentZapValue
static int GetOutputInfo(DeoptimizationOutputData *data, unsigned node_id, SharedFunctionInfo *shared)
static const int kFixedFrameSize
static void EnsureRelocSpaceForLazyDeoptimization(Handle< Code > code)
uint32_t GetFrameSize() const
void SetContinuation(intptr_t pc)
static int frame_size_offset()
static int output_count_offset()
static const int kHeaderSize
static const int kNumAllocatableRegisters
static void RevertStackCheckCodeAt(Code *unoptimized_code, Address pc_after, Code *check_code, Code *replacement_code)
static Address target_address_at(Address pc)
intptr_t GetFrameSlot(unsigned offset)
static Address GetDeoptimizationEntry(int id, BailoutType type)
static const int kContextOffset
static const int kFunctionOffset
static const int kCallerPCOffset
#define ASSERT_EQ(v1, v2)
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
friend class FrameDescription
virtual void GeneratePrologue()
static uint32_t & uint32_at(Address addr)
#define RUNTIME_ENTRY(name, nargs, ressize)
static const int kFrameSize
intptr_t GetRegister(unsigned n) const
static const int kMarkerOffset
void SetDoubleRegister(unsigned n, double value)
static const int kLocal0Offset
static void PatchStackCheckCodeAt(Code *unoptimized_code, Address pc_after, Code *check_code, Code *replacement_code)
static int continuation_offset()
static int has_alignment_padding_offset()
static int input_offset()
static JSFunction * cast(Object *obj)