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

Side by Side Diff: src/mark-compact.cc

Issue 7039058: MIPS: arch-independent changes to support mips. (Closed)
Patch Set: Rebased on r7964. Created 9 years, 7 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
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 2589 matching lines...) Expand 10 before | Expand all | Expand 10 after
2600 2600
2601 // ------------------------------------------------------------------------- 2601 // -------------------------------------------------------------------------
2602 // Phase 3: Update pointers 2602 // Phase 3: Update pointers
2603 2603
2604 // Helper class for updating pointers in HeapObjects. 2604 // Helper class for updating pointers in HeapObjects.
2605 class UpdatingVisitor: public ObjectVisitor { 2605 class UpdatingVisitor: public ObjectVisitor {
2606 public: 2606 public:
2607 explicit UpdatingVisitor(Heap* heap) : heap_(heap) {} 2607 explicit UpdatingVisitor(Heap* heap) : heap_(heap) {}
2608 2608
2609 void VisitPointer(Object** p) { 2609 void VisitPointer(Object** p) {
2610 UpdatePointer(p); 2610 UpdatePointer(p, NULL);
2611 }
2612
2613 void VisitPointer(Object** p, RelocInfo* rinfo) {
2614 // Variant of UpdatePointer, for arch's where RelocInfo is needed.
2615 UpdatePointer(p, rinfo);
2611 } 2616 }
2612 2617
2613 void VisitPointers(Object** start, Object** end) { 2618 void VisitPointers(Object** start, Object** end) {
2614 // Mark all HeapObject pointers in [start, end) 2619 // Mark all HeapObject pointers in [start, end)
2615 for (Object** p = start; p < end; p++) UpdatePointer(p); 2620 for (Object** p = start; p < end; p++) UpdatePointer(p, NULL);
2616 } 2621 }
2617 2622
2618 void VisitCodeTarget(RelocInfo* rinfo) { 2623 void VisitCodeTarget(RelocInfo* rinfo) {
2619 ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode())); 2624 ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
2620 Object* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); 2625 Object* target = Code::GetCodeFromTargetAddress(rinfo->target_address());
2621 VisitPointer(&target); 2626 VisitPointer(&target);
2622 rinfo->set_target_address( 2627 rinfo->set_target_address(
2623 reinterpret_cast<Code*>(target)->instruction_start()); 2628 reinterpret_cast<Code*>(target)->instruction_start());
2624 } 2629 }
2625 2630
2626 void VisitDebugTarget(RelocInfo* rinfo) { 2631 void VisitDebugTarget(RelocInfo* rinfo) {
2627 ASSERT((RelocInfo::IsJSReturn(rinfo->rmode()) && 2632 ASSERT((RelocInfo::IsJSReturn(rinfo->rmode()) &&
2628 rinfo->IsPatchedReturnSequence()) || 2633 rinfo->IsPatchedReturnSequence()) ||
2629 (RelocInfo::IsDebugBreakSlot(rinfo->rmode()) && 2634 (RelocInfo::IsDebugBreakSlot(rinfo->rmode()) &&
2630 rinfo->IsPatchedDebugBreakSlotSequence())); 2635 rinfo->IsPatchedDebugBreakSlotSequence()));
2631 Object* target = Code::GetCodeFromTargetAddress(rinfo->call_address()); 2636 Object* target = Code::GetCodeFromTargetAddress(rinfo->call_address());
2632 VisitPointer(&target); 2637 VisitPointer(&target);
2633 rinfo->set_call_address( 2638 rinfo->set_call_address(
2634 reinterpret_cast<Code*>(target)->instruction_start()); 2639 reinterpret_cast<Code*>(target)->instruction_start());
2635 } 2640 }
2636 2641
2637 inline Heap* heap() const { return heap_; } 2642 inline Heap* heap() const { return heap_; }
2638 2643
2639 private: 2644 private:
2640 void UpdatePointer(Object** p) { 2645 void UpdatePointer(Object** p, RelocInfo* rinfo) {
2641 if (!(*p)->IsHeapObject()) return; 2646 if (!(*p)->IsHeapObject()) return;
2642 2647
2643 HeapObject* obj = HeapObject::cast(*p); 2648 HeapObject* obj = HeapObject::cast(*p);
2644 Address old_addr = obj->address(); 2649 Address old_addr = obj->address();
2645 Address new_addr; 2650 Address new_addr;
2646 ASSERT(!heap()->InFromSpace(obj)); 2651 ASSERT(!heap()->InFromSpace(obj));
2647 2652
2648 if (heap()->new_space()->Contains(obj)) { 2653 if (heap()->new_space()->Contains(obj)) {
2649 Address forwarding_pointer_addr = 2654 Address forwarding_pointer_addr =
2650 heap()->new_space()->FromSpaceLow() + 2655 heap()->new_space()->FromSpaceLow() +
(...skipping 25 matching lines...) Expand all
2676 original_space = spaces.next(); 2681 original_space = spaces.next();
2677 } 2682 }
2678 ASSERT(original_space != NULL); 2683 ASSERT(original_space != NULL);
2679 #endif 2684 #endif
2680 new_addr = MarkCompactCollector::GetForwardingAddressInOldSpace(obj); 2685 new_addr = MarkCompactCollector::GetForwardingAddressInOldSpace(obj);
2681 ASSERT(original_space->Contains(new_addr)); 2686 ASSERT(original_space->Contains(new_addr));
2682 ASSERT(original_space->MCSpaceOffsetForAddress(new_addr) <= 2687 ASSERT(original_space->MCSpaceOffsetForAddress(new_addr) <=
2683 original_space->MCSpaceOffsetForAddress(old_addr)); 2688 original_space->MCSpaceOffsetForAddress(old_addr));
2684 } 2689 }
2685 2690
2686 *p = HeapObject::FromAddress(new_addr); 2691 if (rinfo) {
2692 // For arch (like mips) without natural pointers in embedded code
2693 // objects, rinfo->set_target_object() allows proper pointer update.
2694 rinfo->set_target_object(HeapObject::FromAddress(new_addr));
2695 } else {
2696 // Do normal indirect pointer update when there is no reloc info.
2697 *p = HeapObject::FromAddress(new_addr);
2698 }
2687 2699
2688 #ifdef DEBUG 2700 #ifdef DEBUG
2689 if (FLAG_gc_verbose) { 2701 if (FLAG_gc_verbose) {
2690 PrintF("update %p : %p -> %p\n", 2702 PrintF("update %p : %p -> %p\n",
2691 reinterpret_cast<Address>(p), old_addr, new_addr); 2703 reinterpret_cast<Address>(p), old_addr, new_addr);
2692 } 2704 }
2693 #endif 2705 #endif
2694 } 2706 }
2695 2707
2696 Heap* heap_; 2708 Heap* heap_;
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
3129 } 3141 }
3130 3142
3131 3143
3132 void MarkCompactCollector::Initialize() { 3144 void MarkCompactCollector::Initialize() {
3133 StaticPointersToNewGenUpdatingVisitor::Initialize(); 3145 StaticPointersToNewGenUpdatingVisitor::Initialize();
3134 StaticMarkingVisitor::Initialize(); 3146 StaticMarkingVisitor::Initialize();
3135 } 3147 }
3136 3148
3137 3149
3138 } } // namespace v8::internal 3150 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/assembler.h ('k') | src/mips/assembler-mips-inl.h » ('j') | src/mips/assembler-mips-inl.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698