| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 if (function->scope()->num_parameters() > 0 || | 83 if (function->scope()->num_parameters() > 0 || |
| 84 function->scope()->num_stack_slots()) { | 84 function->scope()->num_stack_slots()) { |
| 85 AssignedVariablesAnalyzer ava(function); | 85 AssignedVariablesAnalyzer ava(function); |
| 86 ava.Analyze(); | 86 ava.Analyze(); |
| 87 if (ava.HasStackOverflow()) { | 87 if (ava.HasStackOverflow()) { |
| 88 return Handle<Code>::null(); | 88 return Handle<Code>::null(); |
| 89 } | 89 } |
| 90 } | 90 } |
| 91 | 91 |
| 92 if (FLAG_use_flow_graph) { | 92 if (FLAG_use_flow_graph) { |
| 93 int variable_count = | 93 FlowGraphBuilder builder; |
| 94 function->num_parameters() + function->scope()->num_stack_slots(); | 94 FlowGraph* graph = builder.Build(function); |
| 95 FlowGraphBuilder builder(variable_count); | 95 USE(graph); |
| 96 builder.Build(function); | |
| 97 | |
| 98 if (!builder.HasStackOverflow()) { | |
| 99 if (variable_count > 0) { | |
| 100 ReachingDefinitions rd(builder.postorder(), | |
| 101 builder.body_definitions(), | |
| 102 variable_count); | |
| 103 rd.Compute(); | |
| 104 | |
| 105 TypeAnalyzer ta(builder.postorder(), | |
| 106 builder.body_definitions(), | |
| 107 variable_count, | |
| 108 function->num_parameters()); | |
| 109 ta.Compute(); | |
| 110 | |
| 111 MarkLiveCode(builder.preorder(), | |
| 112 builder.body_definitions(), | |
| 113 variable_count); | |
| 114 } | |
| 115 } | |
| 116 | 96 |
| 117 #ifdef DEBUG | 97 #ifdef DEBUG |
| 118 if (FLAG_print_graph_text && !builder.HasStackOverflow()) { | 98 if (FLAG_print_graph_text && !builder.HasStackOverflow()) { |
| 119 builder.graph()->PrintText(function, builder.postorder()); | 99 graph->PrintAsText(function->name()); |
| 120 } | 100 } |
| 121 #endif | 101 #endif |
| 122 } | 102 } |
| 123 | 103 |
| 124 // Generate code and return it. Code generator selection is governed by | 104 // Generate code and return it. Code generator selection is governed by |
| 125 // which backends are enabled and whether the function is considered | 105 // which backends are enabled and whether the function is considered |
| 126 // run-once code or not: | 106 // run-once code or not: |
| 127 // | 107 // |
| 128 // --full-compiler enables the dedicated backend for code we expect to be | 108 // --full-compiler enables the dedicated backend for code we expect to be |
| 129 // run once | 109 // run once |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 if (literal->scope()->num_parameters() > 0 || | 472 if (literal->scope()->num_parameters() > 0 || |
| 493 literal->scope()->num_stack_slots()) { | 473 literal->scope()->num_stack_slots()) { |
| 494 AssignedVariablesAnalyzer ava(literal); | 474 AssignedVariablesAnalyzer ava(literal); |
| 495 ava.Analyze(); | 475 ava.Analyze(); |
| 496 if (ava.HasStackOverflow()) { | 476 if (ava.HasStackOverflow()) { |
| 497 return Handle<SharedFunctionInfo>::null(); | 477 return Handle<SharedFunctionInfo>::null(); |
| 498 } | 478 } |
| 499 } | 479 } |
| 500 | 480 |
| 501 if (FLAG_use_flow_graph) { | 481 if (FLAG_use_flow_graph) { |
| 502 int variable_count = | 482 FlowGraphBuilder builder; |
| 503 literal->num_parameters() + literal->scope()->num_stack_slots(); | 483 FlowGraph* graph = builder.Build(literal); |
| 504 FlowGraphBuilder builder(variable_count); | 484 USE(graph); |
| 505 builder.Build(literal); | |
| 506 | |
| 507 if (!builder.HasStackOverflow()) { | |
| 508 if (variable_count > 0) { | |
| 509 ReachingDefinitions rd(builder.postorder(), | |
| 510 builder.body_definitions(), | |
| 511 variable_count); | |
| 512 rd.Compute(); | |
| 513 | |
| 514 TypeAnalyzer ta(builder.postorder(), | |
| 515 builder.body_definitions(), | |
| 516 variable_count, | |
| 517 literal->num_parameters()); | |
| 518 ta.Compute(); | |
| 519 | |
| 520 MarkLiveCode(builder.preorder(), | |
| 521 builder.body_definitions(), | |
| 522 variable_count); | |
| 523 } | |
| 524 } | |
| 525 | 485 |
| 526 #ifdef DEBUG | 486 #ifdef DEBUG |
| 527 if (FLAG_print_graph_text && !builder.HasStackOverflow()) { | 487 if (FLAG_print_graph_text && !builder.HasStackOverflow()) { |
| 528 builder.graph()->PrintText(literal, builder.postorder()); | 488 graph->PrintAsText(literal->name()); |
| 529 } | 489 } |
| 530 #endif | 490 #endif |
| 531 } | 491 } |
| 532 | 492 |
| 533 // Generate code and return it. The way that the compilation mode | 493 // Generate code and return it. The way that the compilation mode |
| 534 // is controlled by the command-line flags is described in | 494 // is controlled by the command-line flags is described in |
| 535 // the static helper function MakeCode. | 495 // the static helper function MakeCode. |
| 536 CompilationInfo info(literal, script, false); | 496 CompilationInfo info(literal, script, false); |
| 537 | 497 |
| 538 CHECK(!FLAG_always_full_compiler || !FLAG_always_fast_compiler); | 498 CHECK(!FLAG_always_full_compiler || !FLAG_always_fast_compiler); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 } else { | 600 } else { |
| 641 LOG(CodeCreateEvent(tag, *code, *func_name)); | 601 LOG(CodeCreateEvent(tag, *code, *func_name)); |
| 642 OPROFILE(CreateNativeCodeRegion(*func_name, | 602 OPROFILE(CreateNativeCodeRegion(*func_name, |
| 643 code->instruction_start(), | 603 code->instruction_start(), |
| 644 code->instruction_size())); | 604 code->instruction_size())); |
| 645 } | 605 } |
| 646 } | 606 } |
| 647 } | 607 } |
| 648 | 608 |
| 649 } } // namespace v8::internal | 609 } } // namespace v8::internal |
| OLD | NEW |