Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 <setjmp.h> // NOLINT | 5 #include <setjmp.h> // NOLINT |
| 6 #include <stdlib.h> | 6 #include <stdlib.h> |
| 7 | 7 |
| 8 #include "vm/globals.h" | 8 #include "vm/globals.h" |
| 9 #if defined(TARGET_ARCH_DBC) | 9 #if defined(TARGET_ARCH_DBC) |
| 10 | 10 |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 31 #include "vm/symbols.h" | 31 #include "vm/symbols.h" |
| 32 | 32 |
| 33 namespace dart { | 33 namespace dart { |
| 34 | 34 |
| 35 DEFINE_FLAG(uint64_t, trace_sim_after, ULLONG_MAX, | 35 DEFINE_FLAG(uint64_t, trace_sim_after, ULLONG_MAX, |
| 36 "Trace simulator execution after instruction count reached."); | 36 "Trace simulator execution after instruction count reached."); |
| 37 DEFINE_FLAG(uint64_t, stop_sim_at, ULLONG_MAX, | 37 DEFINE_FLAG(uint64_t, stop_sim_at, ULLONG_MAX, |
| 38 "Instruction address or instruction count to stop simulator at."); | 38 "Instruction address or instruction count to stop simulator at."); |
| 39 | 39 |
| 40 #define LIKELY(cond) __builtin_expect((cond), 1) | 40 #define LIKELY(cond) __builtin_expect((cond), 1) |
| 41 #define UNLIKELY(cond) __builtin_expect((cond), 0) | |
| 41 | 42 |
| 42 // SimulatorSetjmpBuffer are linked together, and the last created one | 43 // SimulatorSetjmpBuffer are linked together, and the last created one |
| 43 // is referenced by the Simulator. When an exception is thrown, the exception | 44 // is referenced by the Simulator. When an exception is thrown, the exception |
| 44 // runtime looks at where to jump and finds the corresponding | 45 // runtime looks at where to jump and finds the corresponding |
| 45 // SimulatorSetjmpBuffer based on the stack pointer of the exception handler. | 46 // SimulatorSetjmpBuffer based on the stack pointer of the exception handler. |
| 46 // The runtime then does a Longjmp on that buffer to return to the simulator. | 47 // The runtime then does a Longjmp on that buffer to return to the simulator. |
| 47 class SimulatorSetjmpBuffer { | 48 class SimulatorSetjmpBuffer { |
| 48 public: | 49 public: |
| 49 void Longjmp() { | 50 void Longjmp() { |
| 50 // "This" is now the last setjmp buffer. | 51 // "This" is now the last setjmp buffer. |
| (...skipping 1377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1428 const uint8_t increment = rA; | 1429 const uint8_t increment = rA; |
| 1429 const uint16_t threshold = rD; | 1430 const uint16_t threshold = rD; |
| 1430 RawFunction* f = FrameFunction(FP); | 1431 RawFunction* f = FrameFunction(FP); |
| 1431 int32_t counter = f->ptr()->usage_counter_; | 1432 int32_t counter = f->ptr()->usage_counter_; |
| 1432 // Note: we don't increment usage counter in the prologue of optimized | 1433 // Note: we don't increment usage counter in the prologue of optimized |
| 1433 // functions. | 1434 // functions. |
| 1434 if (increment) { | 1435 if (increment) { |
| 1435 counter += increment; | 1436 counter += increment; |
| 1436 f->ptr()->usage_counter_ = counter; | 1437 f->ptr()->usage_counter_ = counter; |
| 1437 } | 1438 } |
| 1438 if (counter >= threshold) { | 1439 if (UNLIKELY(counter >= threshold)) { |
| 1439 FP[0] = f; | 1440 FP[0] = f; |
| 1440 FP[1] = 0; | 1441 FP[1] = 0; |
| 1442 | |
| 1443 // Make the DRT_OptimizeInvokedFunction see a stub as its caller for | |
| 1444 // consistency with the other architectures, and to avoid needing to | |
| 1445 // generate a stackmap for the HotCheck pc. | |
| 1446 const StubEntry* stub = StubCode::OptimizeFunction_entry(); | |
|
zra
2016/11/04 16:01:05
Is it okay for this to be *any* stub, or does it h
rmacnak
2016/11/04 16:50:27
Right, any stub because we'll switch to the new op
| |
| 1447 FP[kPcMarkerSlotFromFp] = stub->code(); | |
| 1448 pc = reinterpret_cast<uint32_t*>(stub->EntryPoint()); | |
| 1449 | |
| 1441 Exit(thread, FP, FP + 2, pc); | 1450 Exit(thread, FP, FP + 2, pc); |
| 1442 NativeArguments args(thread, 1, FP, FP + 1); | 1451 NativeArguments args(thread, 1, FP, FP + 1); |
| 1443 INVOKE_RUNTIME(DRT_OptimizeInvokedFunction, args); | 1452 INVOKE_RUNTIME(DRT_OptimizeInvokedFunction, args); |
| 1444 { | 1453 { |
| 1445 // DRT_OptimizeInvokedFunction returns the code object to execute. | 1454 // DRT_OptimizeInvokedFunction returns the code object to execute. |
| 1446 ASSERT(FP[1]->GetClassId() == kFunctionCid); | 1455 ASSERT(FP[1]->GetClassId() == kFunctionCid); |
| 1447 RawFunction* function = static_cast<RawFunction*>(FP[1]); | 1456 RawFunction* function = static_cast<RawFunction*>(FP[1]); |
| 1448 RawCode* code = function->ptr()->code_; | 1457 RawCode* code = function->ptr()->code_; |
| 1449 SimulatorHelpers::SetFrameCode(FP, code); | 1458 SimulatorHelpers::SetFrameCode(FP, code); |
| 1450 pp = code->ptr()->object_pool_->ptr(); | 1459 pp = code->ptr()->object_pool_->ptr(); |
| (...skipping 2303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3754 pc_ = pc; | 3763 pc_ = pc; |
| 3755 special_[kExceptionSpecialIndex] = raw_exception; | 3764 special_[kExceptionSpecialIndex] = raw_exception; |
| 3756 special_[kStacktraceSpecialIndex] = raw_stacktrace; | 3765 special_[kStacktraceSpecialIndex] = raw_stacktrace; |
| 3757 buf->Longjmp(); | 3766 buf->Longjmp(); |
| 3758 UNREACHABLE(); | 3767 UNREACHABLE(); |
| 3759 } | 3768 } |
| 3760 | 3769 |
| 3761 } // namespace dart | 3770 } // namespace dart |
| 3762 | 3771 |
| 3763 #endif // defined TARGET_ARCH_DBC | 3772 #endif // defined TARGET_ARCH_DBC |
| OLD | NEW |