Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/stack_frame.h" | 5 #include "vm/stack_frame.h" |
| 6 | 6 |
| 7 #include "platform/memory_sanitizer.h" | |
| 7 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 8 #include "vm/deopt_instructions.h" | 9 #include "vm/deopt_instructions.h" |
| 9 #include "vm/isolate.h" | 10 #include "vm/isolate.h" |
| 10 #include "vm/object.h" | 11 #include "vm/object.h" |
| 11 #include "vm/object_store.h" | 12 #include "vm/object_store.h" |
| 12 #include "vm/os.h" | 13 #include "vm/os.h" |
| 13 #include "vm/parser.h" | 14 #include "vm/parser.h" |
| 14 #include "vm/raw_object.h" | 15 #include "vm/raw_object.h" |
| 15 #include "vm/reusable_handles.h" | 16 #include "vm/reusable_handles.h" |
| 16 #include "vm/stub_code.h" | 17 #include "vm/stub_code.h" |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 271 | 272 |
| 272 void StackFrameIterator::SetupNextExitFrameData() { | 273 void StackFrameIterator::SetupNextExitFrameData() { |
| 273 uword exit_address = entry_.fp() + (kExitLinkSlotFromEntryFp * kWordSize); | 274 uword exit_address = entry_.fp() + (kExitLinkSlotFromEntryFp * kWordSize); |
| 274 uword exit_marker = *reinterpret_cast<uword*>(exit_address); | 275 uword exit_marker = *reinterpret_cast<uword*>(exit_address); |
| 275 frames_.fp_ = exit_marker; | 276 frames_.fp_ = exit_marker; |
| 276 frames_.sp_ = 0; | 277 frames_.sp_ = 0; |
| 277 frames_.pc_ = 0; | 278 frames_.pc_ = 0; |
| 278 } | 279 } |
| 279 | 280 |
| 280 | 281 |
| 282 // Tell MemorySanitizer that generated code initializes part of the stack. | |
| 283 // TODO(koda): Limit to frames that are actually written by generated code. | |
| 284 static void UnpoisonStack(Isolate* isolate) { | |
|
siva
2014/12/22 17:01:53
ASSERT(isolate->stack_limit() != ~static_cast<uwor
koda
2014/12/22 23:05:52
Changed to instead take an explicit 'fp' argument,
| |
| 285 __msan_unpoison(reinterpret_cast<void*>(isolate->stack_limit()), | |
| 286 isolate->GetSpecifiedStackSize()); | |
| 287 } | |
| 288 | |
| 289 | |
| 281 StackFrameIterator::StackFrameIterator(bool validate, Isolate* isolate) | 290 StackFrameIterator::StackFrameIterator(bool validate, Isolate* isolate) |
| 282 : validate_(validate), | 291 : validate_(validate), |
| 283 entry_(isolate), | 292 entry_(isolate), |
| 284 exit_(isolate), | 293 exit_(isolate), |
| 285 frames_(isolate), | 294 frames_(isolate), |
| 286 current_frame_(NULL), | 295 current_frame_(NULL), |
| 287 isolate_(isolate) { | 296 isolate_(isolate) { |
| 288 ASSERT((isolate_ == Isolate::Current()) || | 297 ASSERT((isolate_ == Isolate::Current()) || |
| 289 OS::AllowStackFrameIteratorFromAnotherThread()); | 298 OS::AllowStackFrameIteratorFromAnotherThread()); |
| 299 UnpoisonStack(isolate); | |
| 290 SetupLastExitFrameData(); // Setup data for last exit frame. | 300 SetupLastExitFrameData(); // Setup data for last exit frame. |
| 291 } | 301 } |
| 292 | 302 |
| 293 | 303 |
| 294 StackFrameIterator::StackFrameIterator(uword last_fp, bool validate, | 304 StackFrameIterator::StackFrameIterator(uword last_fp, bool validate, |
| 295 Isolate* isolate) | 305 Isolate* isolate) |
| 296 : validate_(validate), | 306 : validate_(validate), |
| 297 entry_(isolate), | 307 entry_(isolate), |
| 298 exit_(isolate), | 308 exit_(isolate), |
| 299 frames_(isolate), | 309 frames_(isolate), |
| 300 current_frame_(NULL), | 310 current_frame_(NULL), |
| 301 isolate_(isolate) { | 311 isolate_(isolate) { |
| 302 ASSERT((isolate_ == Isolate::Current()) || | 312 ASSERT((isolate_ == Isolate::Current()) || |
| 303 OS::AllowStackFrameIteratorFromAnotherThread()); | 313 OS::AllowStackFrameIteratorFromAnotherThread()); |
| 314 UnpoisonStack(isolate); | |
| 304 frames_.fp_ = last_fp; | 315 frames_.fp_ = last_fp; |
| 305 frames_.sp_ = 0; | 316 frames_.sp_ = 0; |
| 306 frames_.pc_ = 0; | 317 frames_.pc_ = 0; |
| 307 } | 318 } |
| 308 | 319 |
| 309 | 320 |
| 310 StackFrameIterator::StackFrameIterator(uword fp, uword sp, uword pc, | 321 StackFrameIterator::StackFrameIterator(uword fp, uword sp, uword pc, |
| 311 bool validate, Isolate* isolate) | 322 bool validate, Isolate* isolate) |
| 312 : validate_(validate), | 323 : validate_(validate), |
| 313 entry_(isolate), | 324 entry_(isolate), |
| 314 exit_(isolate), | 325 exit_(isolate), |
| 315 frames_(isolate), | 326 frames_(isolate), |
| 316 current_frame_(NULL), | 327 current_frame_(NULL), |
| 317 isolate_(isolate) { | 328 isolate_(isolate) { |
| 318 ASSERT((isolate_ == Isolate::Current()) || | 329 ASSERT((isolate_ == Isolate::Current()) || |
| 319 OS::AllowStackFrameIteratorFromAnotherThread()); | 330 OS::AllowStackFrameIteratorFromAnotherThread()); |
| 331 UnpoisonStack(isolate); | |
| 320 frames_.fp_ = fp; | 332 frames_.fp_ = fp; |
| 321 frames_.sp_ = sp; | 333 frames_.sp_ = sp; |
| 322 frames_.pc_ = pc; | 334 frames_.pc_ = pc; |
| 323 } | 335 } |
| 324 | 336 |
| 325 | 337 |
| 326 StackFrame* StackFrameIterator::NextFrame() { | 338 StackFrame* StackFrameIterator::NextFrame() { |
| 327 // When we are at the start of iteration after having created an | 339 // When we are at the start of iteration after having created an |
| 328 // iterator object, current_frame_ will be NULL as we haven't seen | 340 // iterator object, current_frame_ will be NULL as we haven't seen |
| 329 // any frames yet (unless we start iterating in the simulator from a given | 341 // any frames yet (unless we start iterating in the simulator from a given |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 479 if (deopt_instr->kind() == DeoptInstr::kCallerFp) { | 491 if (deopt_instr->kind() == DeoptInstr::kCallerFp) { |
| 480 return (index - num_materializations_); | 492 return (index - num_materializations_); |
| 481 } | 493 } |
| 482 } | 494 } |
| 483 UNREACHABLE(); | 495 UNREACHABLE(); |
| 484 return 0; | 496 return 0; |
| 485 } | 497 } |
| 486 | 498 |
| 487 | 499 |
| 488 } // namespace dart | 500 } // namespace dart |
| OLD | NEW |