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

Side by Side Diff: src/mips64/assembler-mips64.cc

Issue 942123002: MIPS: Fix label position types in binding code. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 10 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/mips64/assembler-mips64.h ('k') | no next file » | 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 14 matching lines...) Expand all
25 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 25 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 26 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 27 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 30
31 // The original source code covered by the above license above has been 31 // The original source code covered by the above license above has been
32 // modified significantly by Google Inc. 32 // modified significantly by Google Inc.
33 // Copyright 2012 the V8 project authors. All rights reserved. 33 // Copyright 2012 the V8 project authors. All rights reserved.
34 34
35
36 #include "src/v8.h" 35 #include "src/v8.h"
37 36
38 #if V8_TARGET_ARCH_MIPS64 37 #if V8_TARGET_ARCH_MIPS64
39 38
40 #include "src/base/cpu.h" 39 #include "src/base/cpu.h"
41 #include "src/mips64/assembler-mips64-inl.h" 40 #include "src/mips64/assembler-mips64-inl.h"
42 #include "src/serialize.h" 41 #include "src/serialize.h"
43 42
44 namespace v8 { 43 namespace v8 {
45 namespace internal { 44 namespace internal {
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after
628 DCHECK(IsAddImmediate(instr)); 627 DCHECK(IsAddImmediate(instr));
629 return ((instr & ~kImm16Mask) | (offset & kImm16Mask)); 628 return ((instr & ~kImm16Mask) | (offset & kImm16Mask));
630 } 629 }
631 630
632 631
633 bool Assembler::IsAndImmediate(Instr instr) { 632 bool Assembler::IsAndImmediate(Instr instr) {
634 return GetOpcodeField(instr) == ANDI; 633 return GetOpcodeField(instr) == ANDI;
635 } 634 }
636 635
637 636
638 int64_t Assembler::target_at(int64_t pos, bool is_internal) { 637 int Assembler::target_at(int pos, bool is_internal) {
639 if (is_internal) { 638 if (is_internal) {
640 int64_t* p = reinterpret_cast<int64_t*>(buffer_ + pos); 639 int64_t* p = reinterpret_cast<int64_t*>(buffer_ + pos);
641 int64_t address = *p; 640 int64_t address = *p;
642 if (address == kEndOfJumpChain) { 641 if (address == kEndOfJumpChain) {
643 return kEndOfChain; 642 return kEndOfChain;
644 } else { 643 } else {
645 int64_t instr_address = reinterpret_cast<int64_t>(p); 644 int64_t instr_address = reinterpret_cast<int64_t>(p);
646 int64_t delta = instr_address - address; 645 DCHECK(instr_address - address < INT_MAX);
646 int delta = static_cast<int>(instr_address - address);
647 DCHECK(pos > delta); 647 DCHECK(pos > delta);
648 return pos - delta; 648 return pos - delta;
649 } 649 }
650 } 650 }
651 Instr instr = instr_at(pos); 651 Instr instr = instr_at(pos);
652 if ((instr & ~kImm16Mask) == 0) { 652 if ((instr & ~kImm16Mask) == 0) {
653 // Emitted label constant, not part of a branch. 653 // Emitted label constant, not part of a branch.
654 if (instr == 0) { 654 if (instr == 0) {
655 return kEndOfChain; 655 return kEndOfChain;
656 } else { 656 } else {
(...skipping 25 matching lines...) Expand all
682 imm |= static_cast<int64_t>(instr_ori & kImm16Mask) << 32; 682 imm |= static_cast<int64_t>(instr_ori & kImm16Mask) << 32;
683 imm |= static_cast<int64_t>(instr_ori2 & kImm16Mask) << 16; 683 imm |= static_cast<int64_t>(instr_ori2 & kImm16Mask) << 16;
684 // Sign extend address; 684 // Sign extend address;
685 imm >>= 16; 685 imm >>= 16;
686 686
687 if (imm == kEndOfJumpChain) { 687 if (imm == kEndOfJumpChain) {
688 // EndOfChain sentinel is returned directly, not relative to pc or pos. 688 // EndOfChain sentinel is returned directly, not relative to pc or pos.
689 return kEndOfChain; 689 return kEndOfChain;
690 } else { 690 } else {
691 uint64_t instr_address = reinterpret_cast<int64_t>(buffer_ + pos); 691 uint64_t instr_address = reinterpret_cast<int64_t>(buffer_ + pos);
692 int64_t delta = instr_address - imm; 692 DCHECK(instr_address - imm < INT_MAX);
693 int delta = static_cast<int>(instr_address - imm);
693 DCHECK(pos > delta); 694 DCHECK(pos > delta);
694 return pos - delta; 695 return pos - delta;
695 } 696 }
696 } else { 697 } else {
697 int32_t imm28 = (instr & static_cast<int32_t>(kImm26Mask)) << 2; 698 int32_t imm28 = (instr & static_cast<int32_t>(kImm26Mask)) << 2;
698 if (imm28 == kEndOfJumpChain) { 699 if (imm28 == kEndOfJumpChain) {
699 // EndOfChain sentinel is returned directly, not relative to pc or pos. 700 // EndOfChain sentinel is returned directly, not relative to pc or pos.
700 return kEndOfChain; 701 return kEndOfChain;
701 } else { 702 } else {
702 uint64_t instr_address = reinterpret_cast<int64_t>(buffer_ + pos); 703 uint64_t instr_address = reinterpret_cast<int64_t>(buffer_ + pos);
703 instr_address &= kImm28Mask; 704 instr_address &= kImm28Mask;
704 int64_t delta = instr_address - imm28; 705 int delta = static_cast<int>(instr_address - imm28);
705 DCHECK(pos > delta); 706 DCHECK(pos > delta);
706 return pos - delta; 707 return pos - delta;
707 } 708 }
708 } 709 }
709 } 710 }
710 711
711 712
712 void Assembler::target_at_put(int64_t pos, int64_t target_pos, 713 void Assembler::target_at_put(int pos, int target_pos, bool is_internal) {
713 bool is_internal) {
714 if (is_internal) { 714 if (is_internal) {
715 uint64_t imm = reinterpret_cast<uint64_t>(buffer_) + target_pos; 715 uint64_t imm = reinterpret_cast<uint64_t>(buffer_) + target_pos;
716 *reinterpret_cast<uint64_t*>(buffer_ + pos) = imm; 716 *reinterpret_cast<uint64_t*>(buffer_ + pos) = imm;
717 return; 717 return;
718 } 718 }
719 Instr instr = instr_at(pos); 719 Instr instr = instr_at(pos);
720 if ((instr & ~kImm16Mask) == 0) { 720 if ((instr & ~kImm16Mask) == 0) {
721 DCHECK(target_pos == kEndOfChain || target_pos >= 0); 721 DCHECK(target_pos == kEndOfChain || target_pos >= 0);
722 // Emitted label constant, not part of a branch. 722 // Emitted label constant, not part of a branch.
723 // Make label relative to Code* of generated Code object. 723 // Make label relative to Code* of generated Code object.
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 internal_reference_positions_.end()); 789 internal_reference_positions_.end());
790 } 790 }
791 } else { 791 } else {
792 PrintF("label in inconsistent state (pos = %d)\n", L->pos_); 792 PrintF("label in inconsistent state (pos = %d)\n", L->pos_);
793 } 793 }
794 } 794 }
795 795
796 796
797 void Assembler::bind_to(Label* L, int pos) { 797 void Assembler::bind_to(Label* L, int pos) {
798 DCHECK(0 <= pos && pos <= pc_offset()); // Must have valid binding position. 798 DCHECK(0 <= pos && pos <= pc_offset()); // Must have valid binding position.
799 int32_t trampoline_pos = kInvalidSlotPos; 799 int trampoline_pos = kInvalidSlotPos;
800 bool is_internal = false; 800 bool is_internal = false;
801 if (L->is_linked() && !trampoline_emitted_) { 801 if (L->is_linked() && !trampoline_emitted_) {
802 unbound_labels_count_--; 802 unbound_labels_count_--;
803 next_buffer_check_ += kTrampolineSlotsSize; 803 next_buffer_check_ += kTrampolineSlotsSize;
804 } 804 }
805 805
806 while (L->is_linked()) { 806 while (L->is_linked()) {
807 int32_t fixup_pos = L->pos(); 807 int fixup_pos = L->pos();
808 int32_t dist = pos - fixup_pos; 808 int dist = pos - fixup_pos;
809 is_internal = internal_reference_positions_.find(fixup_pos) != 809 is_internal = internal_reference_positions_.find(fixup_pos) !=
810 internal_reference_positions_.end(); 810 internal_reference_positions_.end();
811 next(L, is_internal); // Call next before overwriting link with target at 811 next(L, is_internal); // Call next before overwriting link with target at
812 // fixup_pos. 812 // fixup_pos.
813 Instr instr = instr_at(fixup_pos); 813 Instr instr = instr_at(fixup_pos);
814 if (is_internal) { 814 if (is_internal) {
815 target_at_put(fixup_pos, pos, is_internal); 815 target_at_put(fixup_pos, pos, is_internal);
816 } else if (IsBranch(instr)) { 816 } else if (IsBranch(instr)) {
817 if (dist > kMaxBranchOffset) { 817 if (dist > kMaxBranchOffset) {
818 if (trampoline_pos == kInvalidSlotPos) { 818 if (trampoline_pos == kInvalidSlotPos) {
(...skipping 2142 matching lines...) Expand 10 before | Expand all | Expand 10 after
2961 void Assembler::PopulateConstantPool(ConstantPoolArray* constant_pool) { 2961 void Assembler::PopulateConstantPool(ConstantPoolArray* constant_pool) {
2962 // No out-of-line constant pool support. 2962 // No out-of-line constant pool support.
2963 DCHECK(!FLAG_enable_ool_constant_pool); 2963 DCHECK(!FLAG_enable_ool_constant_pool);
2964 return; 2964 return;
2965 } 2965 }
2966 2966
2967 2967
2968 } } // namespace v8::internal 2968 } } // namespace v8::internal
2969 2969
2970 #endif // V8_TARGET_ARCH_MIPS64 2970 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « src/mips64/assembler-mips64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698