Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Side by Side Diff: src/assembler.h

Issue 1234833003: Debugger: use debug break slots to break at function exit. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase, clean ups, x64 port. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/assembler.cc » ('j') | src/ia32/assembler-ia32-inl.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 // Please note the order is important (see IsCodeTarget, IsGCRelocMode). 363 // Please note the order is important (see IsCodeTarget, IsGCRelocMode).
364 CODE_TARGET, // Code target which is not any of the above. 364 CODE_TARGET, // Code target which is not any of the above.
365 CODE_TARGET_WITH_ID, 365 CODE_TARGET_WITH_ID,
366 CONSTRUCT_CALL, // code target that is a call to a JavaScript constructor. 366 CONSTRUCT_CALL, // code target that is a call to a JavaScript constructor.
367 DEBUGGER_STATEMENT, // Code target for the debugger statement. 367 DEBUGGER_STATEMENT, // Code target for the debugger statement.
368 EMBEDDED_OBJECT, 368 EMBEDDED_OBJECT,
369 CELL, 369 CELL,
370 370
371 // Everything after runtime_entry (inclusive) is not GC'ed. 371 // Everything after runtime_entry (inclusive) is not GC'ed.
372 RUNTIME_ENTRY, 372 RUNTIME_ENTRY,
373 JS_RETURN, // Marks start of the ExitJSFrame code.
374 COMMENT, 373 COMMENT,
375 POSITION, // See comment for kNoPosition above. 374 POSITION, // See comment for kNoPosition above.
376 STATEMENT_POSITION, // See comment for kNoPosition above. 375 STATEMENT_POSITION, // See comment for kNoPosition above.
377 376
378 // Additional code inserted for debug break slot. 377 // Additional code inserted for debug break slot.
379 DEBUG_BREAK_SLOT_AT_POSITION, 378 DEBUG_BREAK_SLOT_AT_POSITION,
379 DEBUG_BREAK_SLOT_AT_RETURN,
380 DEBUG_BREAK_SLOT_AT_CALL, 380 DEBUG_BREAK_SLOT_AT_CALL,
381 DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL, 381 DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL,
382 382
383 EXTERNAL_REFERENCE, // The address of an external C++ function. 383 EXTERNAL_REFERENCE, // The address of an external C++ function.
384 INTERNAL_REFERENCE, // An address inside the same function. 384 INTERNAL_REFERENCE, // An address inside the same function.
385 385
386 // Encoded internal reference, used only on MIPS, MIPS64 and PPC. 386 // Encoded internal reference, used only on MIPS, MIPS64 and PPC.
387 INTERNAL_REFERENCE_ENCODED, 387 INTERNAL_REFERENCE_ENCODED,
388 388
389 // Continuation points for a generator yield. 389 // Continuation points for a generator yield.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 return mode == EMBEDDED_OBJECT; 435 return mode == EMBEDDED_OBJECT;
436 } 436 }
437 static inline bool IsCell(Mode mode) { return mode == CELL; } 437 static inline bool IsCell(Mode mode) { return mode == CELL; }
438 static inline bool IsRuntimeEntry(Mode mode) { 438 static inline bool IsRuntimeEntry(Mode mode) {
439 return mode == RUNTIME_ENTRY; 439 return mode == RUNTIME_ENTRY;
440 } 440 }
441 // Is the relocation mode affected by GC? 441 // Is the relocation mode affected by GC?
442 static inline bool IsGCRelocMode(Mode mode) { 442 static inline bool IsGCRelocMode(Mode mode) {
443 return mode <= LAST_GCED_ENUM; 443 return mode <= LAST_GCED_ENUM;
444 } 444 }
445 static inline bool IsJSReturn(Mode mode) {
446 return mode == JS_RETURN;
447 }
448 static inline bool IsComment(Mode mode) { 445 static inline bool IsComment(Mode mode) {
449 return mode == COMMENT; 446 return mode == COMMENT;
450 } 447 }
451 static inline bool IsConstPool(Mode mode) { 448 static inline bool IsConstPool(Mode mode) {
452 return mode == CONST_POOL; 449 return mode == CONST_POOL;
453 } 450 }
454 static inline bool IsVeneerPool(Mode mode) { 451 static inline bool IsVeneerPool(Mode mode) {
455 return mode == VENEER_POOL; 452 return mode == VENEER_POOL;
456 } 453 }
457 static inline bool IsDeoptReason(Mode mode) { 454 static inline bool IsDeoptReason(Mode mode) {
458 return mode == DEOPT_REASON; 455 return mode == DEOPT_REASON;
459 } 456 }
460 static inline bool IsPosition(Mode mode) { 457 static inline bool IsPosition(Mode mode) {
461 return mode == POSITION || mode == STATEMENT_POSITION; 458 return mode == POSITION || mode == STATEMENT_POSITION;
462 } 459 }
463 static inline bool IsStatementPosition(Mode mode) { 460 static inline bool IsStatementPosition(Mode mode) {
464 return mode == STATEMENT_POSITION; 461 return mode == STATEMENT_POSITION;
465 } 462 }
466 static inline bool IsExternalReference(Mode mode) { 463 static inline bool IsExternalReference(Mode mode) {
467 return mode == EXTERNAL_REFERENCE; 464 return mode == EXTERNAL_REFERENCE;
468 } 465 }
469 static inline bool IsInternalReference(Mode mode) { 466 static inline bool IsInternalReference(Mode mode) {
470 return mode == INTERNAL_REFERENCE; 467 return mode == INTERNAL_REFERENCE;
471 } 468 }
472 static inline bool IsInternalReferenceEncoded(Mode mode) { 469 static inline bool IsInternalReferenceEncoded(Mode mode) {
473 return mode == INTERNAL_REFERENCE_ENCODED; 470 return mode == INTERNAL_REFERENCE_ENCODED;
474 } 471 }
475 static inline bool IsDebugBreakSlot(Mode mode) { 472 static inline bool IsDebugBreakSlot(Mode mode) {
476 return IsDebugBreakSlotAtPosition(mode) || IsDebugBreakSlotAtCall(mode) || 473 return IsDebugBreakSlotAtPosition(mode) || IsDebugBreakSlotAtReturn(mode) ||
474 IsDebugBreakSlotAtCall(mode) ||
477 IsDebugBreakSlotAtConstructCall(mode); 475 IsDebugBreakSlotAtConstructCall(mode);
478 } 476 }
479 static inline bool IsDebugBreakSlotAtPosition(Mode mode) { 477 static inline bool IsDebugBreakSlotAtPosition(Mode mode) {
480 return mode == DEBUG_BREAK_SLOT_AT_POSITION; 478 return mode == DEBUG_BREAK_SLOT_AT_POSITION;
481 } 479 }
480 static inline bool IsDebugBreakSlotAtReturn(Mode mode) {
481 return mode == DEBUG_BREAK_SLOT_AT_RETURN;
482 }
482 static inline bool IsDebugBreakSlotAtCall(Mode mode) { 483 static inline bool IsDebugBreakSlotAtCall(Mode mode) {
483 return mode == DEBUG_BREAK_SLOT_AT_CALL; 484 return mode == DEBUG_BREAK_SLOT_AT_CALL;
484 } 485 }
485 static inline bool IsDebugBreakSlotAtConstructCall(Mode mode) { 486 static inline bool IsDebugBreakSlotAtConstructCall(Mode mode) {
486 return mode == DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL; 487 return mode == DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL;
487 } 488 }
488 static inline bool IsDebuggerStatement(Mode mode) { 489 static inline bool IsDebuggerStatement(Mode mode) {
489 return mode == DEBUGGER_STATEMENT; 490 return mode == DEBUGGER_STATEMENT;
490 } 491 }
491 static inline bool IsNone(Mode mode) { 492 static inline bool IsNone(Mode mode) {
492 return mode == NONE32 || mode == NONE64; 493 return mode == NONE32 || mode == NONE64;
493 } 494 }
494 static inline bool IsCodeAgeSequence(Mode mode) { 495 static inline bool IsCodeAgeSequence(Mode mode) {
495 return mode == CODE_AGE_SEQUENCE; 496 return mode == CODE_AGE_SEQUENCE;
496 } 497 }
497 static inline bool IsGeneratorContinuation(Mode mode) { 498 static inline bool IsGeneratorContinuation(Mode mode) {
498 return mode == GENERATOR_CONTINUATION; 499 return mode == GENERATOR_CONTINUATION;
499 } 500 }
500 static inline int ModeMask(Mode mode) { return 1 << mode; } 501 static inline int ModeMask(Mode mode) { return 1 << mode; }
501 502
502 // Accessors 503 // Accessors
503 byte* pc() const { return pc_; } 504 byte* pc() const { return pc_; }
504 void set_pc(byte* pc) { pc_ = pc; } 505 void set_pc(byte* pc) { pc_ = pc; }
505 Mode rmode() const { return rmode_; } 506 Mode rmode() const { return rmode_; }
506 intptr_t data() const { return data_; } 507 intptr_t data() const { return data_; }
507 Code* host() const { return host_; } 508 Code* host() const { return host_; }
508 void set_host(Code* host) { host_ = host; } 509 void set_host(Code* host) { host_ = host; }
509 510
510 // Apply a relocation by delta bytes 511 // Apply a relocation by delta bytes. When the code object is moved, PC
512 // relative addresses have to be updated as well as absolute addresses
513 // inside the code (internal references).
511 INLINE(void apply(intptr_t delta, 514 INLINE(void apply(intptr_t delta,
512 ICacheFlushMode icache_flush_mode = 515 ICacheFlushMode icache_flush_mode =
513 FLUSH_ICACHE_IF_NEEDED)); 516 FLUSH_ICACHE_IF_NEEDED));
514 517
515 // Is the pointer this relocation info refers to coded like a plain pointer 518 // Is the pointer this relocation info refers to coded like a plain pointer
516 // or is it strange in some way (e.g. relative or patched into a series of 519 // or is it strange in some way (e.g. relative or patched into a series of
517 // instructions). 520 // instructions).
518 bool IsCodedSpecially(); 521 bool IsCodedSpecially();
519 522
520 // If true, the pointer this relocation info refers to is an entry in the 523 // If true, the pointer this relocation info refers to is an entry in the
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 // applies to; can only be called if rmode_ is INTERNAL_REFERENCE. 592 // applies to; can only be called if rmode_ is INTERNAL_REFERENCE.
590 INLINE(Address target_internal_reference()); 593 INLINE(Address target_internal_reference());
591 594
592 // Return the reference address this relocation applies to; 595 // Return the reference address this relocation applies to;
593 // can only be called if rmode_ is INTERNAL_REFERENCE. 596 // can only be called if rmode_ is INTERNAL_REFERENCE.
594 INLINE(Address target_internal_reference_address()); 597 INLINE(Address target_internal_reference_address());
595 598
596 // Read/modify the address of a call instruction. This is used to relocate 599 // Read/modify the address of a call instruction. This is used to relocate
597 // the break points where straight-line code is patched with a call 600 // the break points where straight-line code is patched with a call
598 // instruction. 601 // instruction.
599 INLINE(Address call_address()); 602 INLINE(Address debug_call_address());
600 INLINE(void set_call_address(Address target)); 603 INLINE(void set_debug_call_address(Address target));
601 INLINE(Object* call_object());
602 INLINE(void set_call_object(Object* target));
603 INLINE(Object** call_object_address());
604 604
605 // Wipe out a relocation to a fixed value, used for making snapshots 605 // Wipe out a relocation to a fixed value, used for making snapshots
606 // reproducible. 606 // reproducible.
607 INLINE(void WipeOut()); 607 INLINE(void WipeOut());
608 608
609 template<typename StaticVisitor> inline void Visit(Heap* heap); 609 template<typename StaticVisitor> inline void Visit(Heap* heap);
610 inline void Visit(Isolate* isolate, ObjectVisitor* v); 610 inline void Visit(Isolate* isolate, ObjectVisitor* v);
611 611
612 // Patch the code with a call. 612 // Patch the code with a call.
613 void PatchCodeWithCall(Address target, int guard_bytes); 613 void PatchCodeWithCall(Address target, int guard_bytes);
(...skipping 19 matching lines...) Expand all
633 #endif // ENABLE_DISASSEMBLER 633 #endif // ENABLE_DISASSEMBLER
634 #ifdef VERIFY_HEAP 634 #ifdef VERIFY_HEAP
635 void Verify(Isolate* isolate); 635 void Verify(Isolate* isolate);
636 #endif 636 #endif
637 637
638 static const int kCodeTargetMask = (1 << (LAST_CODE_ENUM + 1)) - 1; 638 static const int kCodeTargetMask = (1 << (LAST_CODE_ENUM + 1)) - 1;
639 static const int kPositionMask = 1 << POSITION | 1 << STATEMENT_POSITION; 639 static const int kPositionMask = 1 << POSITION | 1 << STATEMENT_POSITION;
640 static const int kDataMask = 640 static const int kDataMask =
641 (1 << CODE_TARGET_WITH_ID) | kPositionMask | (1 << COMMENT); 641 (1 << CODE_TARGET_WITH_ID) | kPositionMask | (1 << COMMENT);
642 static const int kDebugBreakSlotMask = 642 static const int kDebugBreakSlotMask =
643 1 << DEBUG_BREAK_SLOT_AT_POSITION | 1 << DEBUG_BREAK_SLOT_AT_CALL | 643 1 << DEBUG_BREAK_SLOT_AT_POSITION | 1 << DEBUG_BREAK_SLOT_AT_RETURN |
644 1 << DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL; 644 1 << DEBUG_BREAK_SLOT_AT_CALL | 1 << DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL;
645 static const int kApplyMask; // Modes affected by apply. Depends on arch. 645 static const int kApplyMask; // Modes affected by apply. Depends on arch.
646 646
647 private: 647 private:
648 // On ARM, note that pc_ is the address of the constant pool entry 648 // On ARM, note that pc_ is the address of the constant pool entry
649 // to be relocated and not the address of the instruction 649 // to be relocated and not the address of the instruction
650 // referencing the constant pool entry (except when rmode_ == 650 // referencing the constant pool entry (except when rmode_ ==
651 // comment). 651 // comment).
652 byte* pc_; 652 byte* pc_;
653 Mode rmode_; 653 Mode rmode_;
654 intptr_t data_; 654 intptr_t data_;
655 Code* host_; 655 Code* host_;
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after
1270 }; 1270 };
1271 1271
1272 Label emitted_label_; // Records pc_offset of emitted pool 1272 Label emitted_label_; // Records pc_offset of emitted pool
1273 PerTypeEntryInfo info_[ConstantPoolEntry::NUMBER_OF_TYPES]; 1273 PerTypeEntryInfo info_[ConstantPoolEntry::NUMBER_OF_TYPES];
1274 }; 1274 };
1275 1275
1276 1276
1277 } } // namespace v8::internal 1277 } } // namespace v8::internal
1278 1278
1279 #endif // V8_ASSEMBLER_H_ 1279 #endif // V8_ASSEMBLER_H_
OLDNEW
« no previous file with comments | « no previous file | src/assembler.cc » ('j') | src/ia32/assembler-ia32-inl.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698