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

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: fix for arm 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 | « src/arm64/full-codegen-arm64.cc ('k') | src/assembler.cc » ('j') | no next file with comments »
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
511 INLINE(void apply(intptr_t delta, 512 // relative addresses have to be updated as well as absolute addresses
512 ICacheFlushMode icache_flush_mode = 513 // inside the code (internal references).
513 FLUSH_ICACHE_IF_NEEDED)); 514 // Do not forget to flush the icache afterwards!
515 INLINE(void apply(intptr_t delta));
514 516
515 // Is the pointer this relocation info refers to coded like a plain pointer 517 // 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 518 // or is it strange in some way (e.g. relative or patched into a series of
517 // instructions). 519 // instructions).
518 bool IsCodedSpecially(); 520 bool IsCodedSpecially();
519 521
520 // If true, the pointer this relocation info refers to is an entry in the 522 // If true, the pointer this relocation info refers to is an entry in the
521 // constant pool, otherwise the pointer is embedded in the instruction stream. 523 // constant pool, otherwise the pointer is embedded in the instruction stream.
522 bool IsInConstantPool(); 524 bool IsInConstantPool();
523 525
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 // applies to; can only be called if rmode_ is INTERNAL_REFERENCE. 591 // applies to; can only be called if rmode_ is INTERNAL_REFERENCE.
590 INLINE(Address target_internal_reference()); 592 INLINE(Address target_internal_reference());
591 593
592 // Return the reference address this relocation applies to; 594 // Return the reference address this relocation applies to;
593 // can only be called if rmode_ is INTERNAL_REFERENCE. 595 // can only be called if rmode_ is INTERNAL_REFERENCE.
594 INLINE(Address target_internal_reference_address()); 596 INLINE(Address target_internal_reference_address());
595 597
596 // Read/modify the address of a call instruction. This is used to relocate 598 // 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 599 // the break points where straight-line code is patched with a call
598 // instruction. 600 // instruction.
599 INLINE(Address call_address()); 601 INLINE(Address debug_call_address());
600 INLINE(void set_call_address(Address target)); 602 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 603
605 // Wipe out a relocation to a fixed value, used for making snapshots 604 // Wipe out a relocation to a fixed value, used for making snapshots
606 // reproducible. 605 // reproducible.
607 INLINE(void WipeOut()); 606 INLINE(void WipeOut());
608 607
609 template<typename StaticVisitor> inline void Visit(Heap* heap); 608 template<typename StaticVisitor> inline void Visit(Heap* heap);
610 inline void Visit(Isolate* isolate, ObjectVisitor* v); 609 inline void Visit(Isolate* isolate, ObjectVisitor* v);
611 610
612 // Patch the code with a call. 611 // Patch the code with a call.
613 void PatchCodeWithCall(Address target, int guard_bytes); 612 void PatchCodeWithCall(Address target, int guard_bytes);
(...skipping 19 matching lines...) Expand all
633 #endif // ENABLE_DISASSEMBLER 632 #endif // ENABLE_DISASSEMBLER
634 #ifdef VERIFY_HEAP 633 #ifdef VERIFY_HEAP
635 void Verify(Isolate* isolate); 634 void Verify(Isolate* isolate);
636 #endif 635 #endif
637 636
638 static const int kCodeTargetMask = (1 << (LAST_CODE_ENUM + 1)) - 1; 637 static const int kCodeTargetMask = (1 << (LAST_CODE_ENUM + 1)) - 1;
639 static const int kPositionMask = 1 << POSITION | 1 << STATEMENT_POSITION; 638 static const int kPositionMask = 1 << POSITION | 1 << STATEMENT_POSITION;
640 static const int kDataMask = 639 static const int kDataMask =
641 (1 << CODE_TARGET_WITH_ID) | kPositionMask | (1 << COMMENT); 640 (1 << CODE_TARGET_WITH_ID) | kPositionMask | (1 << COMMENT);
642 static const int kDebugBreakSlotMask = 641 static const int kDebugBreakSlotMask =
643 1 << DEBUG_BREAK_SLOT_AT_POSITION | 1 << DEBUG_BREAK_SLOT_AT_CALL | 642 1 << DEBUG_BREAK_SLOT_AT_POSITION | 1 << DEBUG_BREAK_SLOT_AT_RETURN |
644 1 << DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL; 643 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. 644 static const int kApplyMask; // Modes affected by apply. Depends on arch.
646 645
647 private: 646 private:
648 // On ARM, note that pc_ is the address of the constant pool entry 647 // On ARM, note that pc_ is the address of the constant pool entry
649 // to be relocated and not the address of the instruction 648 // to be relocated and not the address of the instruction
650 // referencing the constant pool entry (except when rmode_ == 649 // referencing the constant pool entry (except when rmode_ ==
651 // comment). 650 // comment).
652 byte* pc_; 651 byte* pc_;
653 Mode rmode_; 652 Mode rmode_;
654 intptr_t data_; 653 intptr_t data_;
655 Code* host_; 654 Code* host_;
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after
1270 }; 1269 };
1271 1270
1272 Label emitted_label_; // Records pc_offset of emitted pool 1271 Label emitted_label_; // Records pc_offset of emitted pool
1273 PerTypeEntryInfo info_[ConstantPoolEntry::NUMBER_OF_TYPES]; 1272 PerTypeEntryInfo info_[ConstantPoolEntry::NUMBER_OF_TYPES];
1274 }; 1273 };
1275 1274
1276 1275
1277 } } // namespace v8::internal 1276 } } // namespace v8::internal
1278 1277
1279 #endif // V8_ASSEMBLER_H_ 1278 #endif // V8_ASSEMBLER_H_
OLDNEW
« no previous file with comments | « src/arm64/full-codegen-arm64.cc ('k') | src/assembler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698