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 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
286 const int kLastChunkTag = 1; | 286 const int kLastChunkTag = 1; |
287 | 287 |
288 | 288 |
289 const int kDataJumpExtraTag = kPCJumpExtraTag - 1; | 289 const int kDataJumpExtraTag = kPCJumpExtraTag - 1; |
290 | 290 |
291 const int kCodeWithIdTag = 0; | 291 const int kCodeWithIdTag = 0; |
292 const int kNonstatementPositionTag = 1; | 292 const int kNonstatementPositionTag = 1; |
293 const int kStatementPositionTag = 2; | 293 const int kStatementPositionTag = 2; |
294 const int kCommentTag = 3; | 294 const int kCommentTag = 3; |
295 | 295 |
296 #if !defined(V8_TARGET_ARCH_X64) | |
Sven Panne
2012/12/14 08:20:11
Again for this and the rest of the file: No archit
| |
296 const int kConstPoolExtraTag = kPCJumpExtraTag - 2; | 297 const int kConstPoolExtraTag = kPCJumpExtraTag - 2; |
297 const int kConstPoolTag = 3; | 298 const int kConstPoolTag = 3; |
298 | 299 #else |
300 const int kDeoptEntryExtraTag = kPCJumpExtraTag - 2; | |
301 const int kDeoptEntryTag = 3; | |
302 #endif | |
299 | 303 |
300 uint32_t RelocInfoWriter::WriteVariableLengthPCJump(uint32_t pc_delta) { | 304 uint32_t RelocInfoWriter::WriteVariableLengthPCJump(uint32_t pc_delta) { |
301 // Return if the pc_delta can fit in kSmallPCDeltaBits bits. | 305 // Return if the pc_delta can fit in kSmallPCDeltaBits bits. |
302 // Otherwise write a variable length PC jump for the bits that do | 306 // Otherwise write a variable length PC jump for the bits that do |
303 // not fit in the kSmallPCDeltaBits bits. | 307 // not fit in the kSmallPCDeltaBits bits. |
304 if (is_uintn(pc_delta, kSmallPCDeltaBits)) return pc_delta; | 308 if (is_uintn(pc_delta, kSmallPCDeltaBits)) return pc_delta; |
305 WriteExtraTag(kPCJumpExtraTag, kVariableLengthPCJumpTopTag); | 309 WriteExtraTag(kPCJumpExtraTag, kVariableLengthPCJumpTopTag); |
306 uint32_t pc_jump = pc_delta >> kSmallPCDeltaBits; | 310 uint32_t pc_jump = pc_delta >> kSmallPCDeltaBits; |
307 ASSERT(pc_jump > 0); | 311 ASSERT(pc_jump > 0); |
308 // Write kChunkBits size chunks of the pc_jump. | 312 // Write kChunkBits size chunks of the pc_jump. |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
346 | 350 |
347 void RelocInfoWriter::WriteExtraTaggedIntData(int data_delta, int top_tag) { | 351 void RelocInfoWriter::WriteExtraTaggedIntData(int data_delta, int top_tag) { |
348 WriteExtraTag(kDataJumpExtraTag, top_tag); | 352 WriteExtraTag(kDataJumpExtraTag, top_tag); |
349 for (int i = 0; i < kIntSize; i++) { | 353 for (int i = 0; i < kIntSize; i++) { |
350 *--pos_ = static_cast<byte>(data_delta); | 354 *--pos_ = static_cast<byte>(data_delta); |
351 // Signed right shift is arithmetic shift. Tested in test-utils.cc. | 355 // Signed right shift is arithmetic shift. Tested in test-utils.cc. |
352 data_delta = data_delta >> kBitsPerByte; | 356 data_delta = data_delta >> kBitsPerByte; |
353 } | 357 } |
354 } | 358 } |
355 | 359 |
360 | |
361 #if !defined(V8_TARGET_ARCH_X64) | |
356 void RelocInfoWriter::WriteExtraTaggedConstPoolData(int data) { | 362 void RelocInfoWriter::WriteExtraTaggedConstPoolData(int data) { |
357 WriteExtraTag(kConstPoolExtraTag, kConstPoolTag); | 363 WriteExtraTag(kConstPoolExtraTag, kConstPoolTag); |
358 for (int i = 0; i < kIntSize; i++) { | 364 for (int i = 0; i < kIntSize; i++) { |
359 *--pos_ = static_cast<byte>(data); | 365 *--pos_ = static_cast<byte>(data); |
360 // Signed right shift is arithmetic shift. Tested in test-utils.cc. | 366 // Signed right shift is arithmetic shift. Tested in test-utils.cc. |
361 data = data >> kBitsPerByte; | 367 data = data >> kBitsPerByte; |
362 } | 368 } |
363 } | 369 } |
370 #else | |
371 void RelocInfoWriter::WriteExtraTaggedDeoptEntryData(int data) { | |
372 WriteExtraTag(kDeoptEntryExtraTag, kDeoptEntryTag); | |
373 for (int i = 0; i < kIntSize; i++) { | |
374 *--pos_ = static_cast<byte>(data); | |
375 // Signed right shift is arithmetic shift. Tested in test-utils.cc. | |
376 data = data >> kBitsPerByte; | |
377 } | |
378 } | |
379 #endif | |
380 | |
364 | 381 |
365 void RelocInfoWriter::WriteExtraTaggedData(intptr_t data_delta, int top_tag) { | 382 void RelocInfoWriter::WriteExtraTaggedData(intptr_t data_delta, int top_tag) { |
366 WriteExtraTag(kDataJumpExtraTag, top_tag); | 383 WriteExtraTag(kDataJumpExtraTag, top_tag); |
367 for (int i = 0; i < kIntptrSize; i++) { | 384 for (int i = 0; i < kIntptrSize; i++) { |
368 *--pos_ = static_cast<byte>(data_delta); | 385 *--pos_ = static_cast<byte>(data_delta); |
369 // Signed right shift is arithmetic shift. Tested in test-utils.cc. | 386 // Signed right shift is arithmetic shift. Tested in test-utils.cc. |
370 data_delta = data_delta >> kBitsPerByte; | 387 data_delta = data_delta >> kBitsPerByte; |
371 } | 388 } |
372 } | 389 } |
373 | 390 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
418 // Otherwise, use costly encoding. | 435 // Otherwise, use costly encoding. |
419 WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag); | 436 WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag); |
420 WriteExtraTaggedIntData(pos_delta, pos_type_tag); | 437 WriteExtraTaggedIntData(pos_delta, pos_type_tag); |
421 } | 438 } |
422 last_position_ = static_cast<int>(rinfo->data()); | 439 last_position_ = static_cast<int>(rinfo->data()); |
423 } else if (RelocInfo::IsComment(rmode)) { | 440 } else if (RelocInfo::IsComment(rmode)) { |
424 // Comments are normally not generated, so we use the costly encoding. | 441 // Comments are normally not generated, so we use the costly encoding. |
425 WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag); | 442 WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag); |
426 WriteExtraTaggedData(rinfo->data(), kCommentTag); | 443 WriteExtraTaggedData(rinfo->data(), kCommentTag); |
427 ASSERT(begin_pos - pos_ >= RelocInfo::kMinRelocCommentSize); | 444 ASSERT(begin_pos - pos_ >= RelocInfo::kMinRelocCommentSize); |
445 #if !defined(V8_TARGET_ARCH_X64) | |
428 } else if (RelocInfo::IsConstPool(rmode)) { | 446 } else if (RelocInfo::IsConstPool(rmode)) { |
429 WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag); | 447 WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag); |
430 WriteExtraTaggedConstPoolData(static_cast<int>(rinfo->data())); | 448 WriteExtraTaggedConstPoolData(static_cast<int>(rinfo->data())); |
449 #else | |
450 } else if (RelocInfo::IsDeoptEntry(rmode)) { | |
451 WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag); | |
452 WriteExtraTaggedDeoptEntryData(static_cast<int>(rinfo->data())); | |
453 #endif | |
431 } else { | 454 } else { |
432 ASSERT(rmode > RelocInfo::LAST_COMPACT_ENUM); | 455 ASSERT(rmode > RelocInfo::LAST_COMPACT_ENUM); |
433 int saved_mode = rmode - RelocInfo::LAST_COMPACT_ENUM; | 456 int saved_mode = rmode - RelocInfo::LAST_COMPACT_ENUM; |
434 // For all other modes we simply use the mode as the extra tag. | 457 // For all other modes we simply use the mode as the extra tag. |
435 // None of these modes need a data component. | 458 // None of these modes need a data component. |
436 ASSERT(saved_mode < kPCJumpExtraTag && saved_mode < kDataJumpExtraTag); | 459 ASSERT(saved_mode < kPCJumpExtraTag && saved_mode < kDataJumpExtraTag); |
437 WriteExtraTaggedPC(pc_delta, saved_mode); | 460 WriteExtraTaggedPC(pc_delta, saved_mode); |
438 } | 461 } |
439 last_pc_ = rinfo->pc(); | 462 last_pc_ = rinfo->pc(); |
440 #ifdef DEBUG | 463 #ifdef DEBUG |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
613 Advance(kIntSize); | 636 Advance(kIntSize); |
614 } | 637 } |
615 } else { | 638 } else { |
616 ASSERT(locatable_tag == kCommentTag); | 639 ASSERT(locatable_tag == kCommentTag); |
617 if (SetMode(RelocInfo::COMMENT)) { | 640 if (SetMode(RelocInfo::COMMENT)) { |
618 AdvanceReadData(); | 641 AdvanceReadData(); |
619 return; | 642 return; |
620 } | 643 } |
621 Advance(kIntptrSize); | 644 Advance(kIntptrSize); |
622 } | 645 } |
646 #if !defined(V8_TARGET_ARCH_X64) | |
623 } else if ((extra_tag == kConstPoolExtraTag) && | 647 } else if ((extra_tag == kConstPoolExtraTag) && |
624 (GetTopTag() == kConstPoolTag)) { | 648 (GetTopTag() == kConstPoolTag)) { |
625 if (SetMode(RelocInfo::CONST_POOL)) { | 649 if (SetMode(RelocInfo::CONST_POOL)) { |
626 AdvanceReadConstPoolData(); | 650 AdvanceReadConstPoolData(); |
627 return; | 651 return; |
628 } | 652 } |
629 Advance(kIntSize); | 653 Advance(kIntSize); |
654 #else | |
655 } else if ((extra_tag == kDeoptEntryExtraTag) && | |
656 (GetTopTag() == kDeoptEntryTag)) { | |
657 if (SetMode(RelocInfo::DEOPT_ENTRY)) { | |
658 AdvanceReadConstPoolData(); | |
659 return; | |
660 } | |
661 Advance(kIntSize); | |
662 #endif | |
630 } else { | 663 } else { |
631 AdvanceReadPC(); | 664 AdvanceReadPC(); |
632 int rmode = extra_tag + RelocInfo::LAST_COMPACT_ENUM; | 665 int rmode = extra_tag + RelocInfo::LAST_COMPACT_ENUM; |
633 if (SetMode(static_cast<RelocInfo::Mode>(rmode))) return; | 666 if (SetMode(static_cast<RelocInfo::Mode>(rmode))) return; |
634 } | 667 } |
635 } | 668 } |
636 } | 669 } |
637 if (code_age_sequence_ != NULL) { | 670 if (code_age_sequence_ != NULL) { |
638 byte* old_code_age_sequence = code_age_sequence_; | 671 byte* old_code_age_sequence = code_age_sequence_; |
639 code_age_sequence_ = NULL; | 672 code_age_sequence_ = NULL; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
718 case RelocInfo::COMMENT: | 751 case RelocInfo::COMMENT: |
719 return "comment"; | 752 return "comment"; |
720 case RelocInfo::POSITION: | 753 case RelocInfo::POSITION: |
721 return "position"; | 754 return "position"; |
722 case RelocInfo::STATEMENT_POSITION: | 755 case RelocInfo::STATEMENT_POSITION: |
723 return "statement position"; | 756 return "statement position"; |
724 case RelocInfo::EXTERNAL_REFERENCE: | 757 case RelocInfo::EXTERNAL_REFERENCE: |
725 return "external reference"; | 758 return "external reference"; |
726 case RelocInfo::INTERNAL_REFERENCE: | 759 case RelocInfo::INTERNAL_REFERENCE: |
727 return "internal reference"; | 760 return "internal reference"; |
761 #if !defined(V8_TARGET_ARCH_X64) | |
728 case RelocInfo::CONST_POOL: | 762 case RelocInfo::CONST_POOL: |
729 return "constant pool"; | 763 return "constant pool"; |
764 #else | |
765 case RelocInfo::DEOPT_ENTRY: | |
766 return "deopt entry"; | |
767 #endif | |
730 case RelocInfo::DEBUG_BREAK_SLOT: | 768 case RelocInfo::DEBUG_BREAK_SLOT: |
731 #ifndef ENABLE_DEBUGGER_SUPPORT | 769 #ifndef ENABLE_DEBUGGER_SUPPORT |
732 UNREACHABLE(); | 770 UNREACHABLE(); |
733 #endif | 771 #endif |
734 return "debug break slot"; | 772 return "debug break slot"; |
735 case RelocInfo::CODE_AGE_SEQUENCE: | 773 case RelocInfo::CODE_AGE_SEQUENCE: |
736 return "code_age_sequence"; | 774 return "code_age_sequence"; |
737 case RelocInfo::NUMBER_OF_MODES: | 775 case RelocInfo::NUMBER_OF_MODES: |
738 UNREACHABLE(); | 776 UNREACHABLE(); |
739 return "number_of_modes"; | 777 return "number_of_modes"; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
807 CHECK(code->address() == HeapObject::cast(found)->address()); | 845 CHECK(code->address() == HeapObject::cast(found)->address()); |
808 break; | 846 break; |
809 } | 847 } |
810 case RUNTIME_ENTRY: | 848 case RUNTIME_ENTRY: |
811 case JS_RETURN: | 849 case JS_RETURN: |
812 case COMMENT: | 850 case COMMENT: |
813 case POSITION: | 851 case POSITION: |
814 case STATEMENT_POSITION: | 852 case STATEMENT_POSITION: |
815 case EXTERNAL_REFERENCE: | 853 case EXTERNAL_REFERENCE: |
816 case INTERNAL_REFERENCE: | 854 case INTERNAL_REFERENCE: |
855 #if !defined(V8_TARGET_ARCH_X64) | |
817 case CONST_POOL: | 856 case CONST_POOL: |
857 #else | |
858 case DEOPT_ENTRY: | |
859 #endif | |
818 case DEBUG_BREAK_SLOT: | 860 case DEBUG_BREAK_SLOT: |
819 case NONE: | 861 case NONE: |
820 break; | 862 break; |
821 case NUMBER_OF_MODES: | 863 case NUMBER_OF_MODES: |
822 UNREACHABLE(); | 864 UNREACHABLE(); |
823 break; | 865 break; |
824 case CODE_AGE_SEQUENCE: | 866 case CODE_AGE_SEQUENCE: |
825 ASSERT(Code::IsYoungSequence(pc_) || code_age_stub()->IsCode()); | 867 ASSERT(Code::IsYoungSequence(pc_) || code_age_stub()->IsCode()); |
826 break; | 868 break; |
827 } | 869 } |
(...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1549 assembler_->RecordRelocInfo(RelocInfo::POSITION, state_.current_position); | 1591 assembler_->RecordRelocInfo(RelocInfo::POSITION, state_.current_position); |
1550 state_.written_position = state_.current_position; | 1592 state_.written_position = state_.current_position; |
1551 written = true; | 1593 written = true; |
1552 } | 1594 } |
1553 | 1595 |
1554 // Return whether something was written. | 1596 // Return whether something was written. |
1555 return written; | 1597 return written; |
1556 } | 1598 } |
1557 | 1599 |
1558 } } // namespace v8::internal | 1600 } } // namespace v8::internal |
OLD | NEW |