| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/precompiler.h" | 5 #include "vm/precompiler.h" |
| 6 | 6 |
| 7 #include "vm/aot_optimizer.h" | 7 #include "vm/aot_optimizer.h" |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/ast_printer.h" | 9 #include "vm/ast_printer.h" |
| 10 #include "vm/branch_optimizer.h" | 10 #include "vm/branch_optimizer.h" |
| (...skipping 1857 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1868 ASSERT(!target_code_.IsFunctionCode()); | 1868 ASSERT(!target_code_.IsFunctionCode()); |
| 1869 // Allocation stub or AllocateContext or AllocateArray or ... | 1869 // Allocation stub or AllocateContext or AllocateArray or ... |
| 1870 } else { | 1870 } else { |
| 1871 // Static calls initially call the CallStaticFunction stub because | 1871 // Static calls initially call the CallStaticFunction stub because |
| 1872 // their target might not be compiled yet. After tree shaking, all | 1872 // their target might not be compiled yet. After tree shaking, all |
| 1873 // static call targets are compiled. | 1873 // static call targets are compiled. |
| 1874 // Cf. runtime entry PatchStaticCall called from CallStaticFunction | 1874 // Cf. runtime entry PatchStaticCall called from CallStaticFunction |
| 1875 // stub. | 1875 // stub. |
| 1876 ASSERT(target_.HasCode()); | 1876 ASSERT(target_.HasCode()); |
| 1877 target_code_ ^= target_.CurrentCode(); | 1877 target_code_ ^= target_.CurrentCode(); |
| 1878 uword pc = pc_offset_.Value() + code_.EntryPoint(); | 1878 uword pc = pc_offset_.Value() + code_.PayloadStart(); |
| 1879 CodePatcher::PatchStaticCallAt(pc, code_, target_code_); | 1879 CodePatcher::PatchStaticCallAt(pc, code_, target_code_); |
| 1880 } | 1880 } |
| 1881 } | 1881 } |
| 1882 | 1882 |
| 1883 // We won't patch static calls anymore, so drop the static call table to | 1883 // We won't patch static calls anymore, so drop the static call table to |
| 1884 // save space. | 1884 // save space. |
| 1885 code_.set_static_calls_target_table(Object::empty_array()); | 1885 code_.set_static_calls_target_table(Object::empty_array()); |
| 1886 } | 1886 } |
| 1887 | 1887 |
| 1888 private: | 1888 private: |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1937 // arguments in addition to the receiver and use special stubs | 1937 // arguments in addition to the receiver and use special stubs |
| 1938 // with fast paths for Smi operations. | 1938 // with fast paths for Smi operations. |
| 1939 if (ic_.NumArgsTested() != 1) continue; | 1939 if (ic_.NumArgsTested() != 1) continue; |
| 1940 | 1940 |
| 1941 for (intptr_t j = 0; j < ic_.NumberOfChecks(); j++) { | 1941 for (intptr_t j = 0; j < ic_.NumberOfChecks(); j++) { |
| 1942 entry_ = ic_.GetTargetOrCodeAt(j); | 1942 entry_ = ic_.GetTargetOrCodeAt(j); |
| 1943 if (entry_.IsFunction()) { | 1943 if (entry_.IsFunction()) { |
| 1944 target_ ^= entry_.raw(); | 1944 target_ ^= entry_.raw(); |
| 1945 ASSERT(target_.HasCode()); | 1945 ASSERT(target_.HasCode()); |
| 1946 target_code_ = target_.CurrentCode(); | 1946 target_code_ = target_.CurrentCode(); |
| 1947 entry_point_ = Smi::FromAlignedAddress(target_code_.EntryPoint()); | 1947 entry_point_ = |
| 1948 Smi::FromAlignedAddress(target_code_.UncheckedEntryPoint()); |
| 1948 ic_.SetCodeAt(j, target_code_); | 1949 ic_.SetCodeAt(j, target_code_); |
| 1949 ic_.SetEntryPointAt(j, entry_point_); | 1950 ic_.SetEntryPointAt(j, entry_point_); |
| 1950 } else { | 1951 } else { |
| 1951 // We've already seen and switched this ICData. | 1952 // We've already seen and switched this ICData. |
| 1952 ASSERT(entry_.IsCode()); | 1953 ASSERT(entry_.IsCode()); |
| 1953 } | 1954 } |
| 1954 } | 1955 } |
| 1955 } else if (entry_.raw() == | 1956 } else if (entry_.raw() == |
| 1956 StubCode::ICLookupThroughFunction_entry()->code()) { | 1957 StubCode::ICLookupThroughFunction_entry()->code()) { |
| 1957 target_code_ = StubCode::ICLookupThroughCode_entry()->code(); | 1958 target_code_ = StubCode::ICLookupThroughCode_entry()->code(); |
| (...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2904 ASSERT(error.IsLanguageError() && | 2905 ASSERT(error.IsLanguageError() && |
| 2905 LanguageError::Cast(error).kind() != Report::kBailout); | 2906 LanguageError::Cast(error).kind() != Report::kBailout); |
| 2906 return error.raw(); | 2907 return error.raw(); |
| 2907 } | 2908 } |
| 2908 | 2909 |
| 2909 per_compile_timer.Stop(); | 2910 per_compile_timer.Stop(); |
| 2910 | 2911 |
| 2911 if (trace_compiler) { | 2912 if (trace_compiler) { |
| 2912 THR_Print("--> '%s' entry: %#" Px " size: %" Pd " time: %" Pd64 " us\n", | 2913 THR_Print("--> '%s' entry: %#" Px " size: %" Pd " time: %" Pd64 " us\n", |
| 2913 function.ToFullyQualifiedCString(), | 2914 function.ToFullyQualifiedCString(), |
| 2914 Code::Handle(function.CurrentCode()).EntryPoint(), | 2915 Code::Handle(function.CurrentCode()).PayloadStart(), |
| 2915 Code::Handle(function.CurrentCode()).Size(), | 2916 Code::Handle(function.CurrentCode()).Size(), |
| 2916 per_compile_timer.TotalElapsedTime()); | 2917 per_compile_timer.TotalElapsedTime()); |
| 2917 } | 2918 } |
| 2918 | 2919 |
| 2919 if (FLAG_disassemble && FlowGraphPrinter::ShouldPrint(function)) { | 2920 if (FLAG_disassemble && FlowGraphPrinter::ShouldPrint(function)) { |
| 2920 Disassembler::DisassembleCode(function, optimized); | 2921 Disassembler::DisassembleCode(function, optimized); |
| 2921 } else if (FLAG_disassemble_optimized && | 2922 } else if (FLAG_disassemble_optimized && |
| 2922 optimized && | 2923 optimized && |
| 2923 FlowGraphPrinter::ShouldPrint(function)) { | 2924 FlowGraphPrinter::ShouldPrint(function)) { |
| 2924 Disassembler::DisassembleCode(function, true); | 2925 Disassembler::DisassembleCode(function, true); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2950 CompilationPipeline::New(thread->zone(), function); | 2951 CompilationPipeline::New(thread->zone(), function); |
| 2951 | 2952 |
| 2952 ASSERT(FLAG_precompiled_mode); | 2953 ASSERT(FLAG_precompiled_mode); |
| 2953 const bool optimized = function.IsOptimizable(); // False for natives. | 2954 const bool optimized = function.IsOptimizable(); // False for natives. |
| 2954 return PrecompileFunctionHelper(pipeline, function, optimized); | 2955 return PrecompileFunctionHelper(pipeline, function, optimized); |
| 2955 } | 2956 } |
| 2956 | 2957 |
| 2957 #endif // DART_PRECOMPILER | 2958 #endif // DART_PRECOMPILER |
| 2958 | 2959 |
| 2959 } // namespace dart | 2960 } // namespace dart |
| OLD | NEW |