| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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_ |
| OLD | NEW |