1 /* 2 * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. 7 * 8 * This code is distributed in the hope that it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 11 * version 2 for more details (a copy is included in the LICENSE file that 12 * accompanied this code). 13 * 14 * You should have received a copy of the GNU General Public License version 15 * 2 along with this work; if not, write to the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 17 * 18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 19 * or visit www.oracle.com if you need additional information or have any 20 * questions. 21 * 22 */ 23 24 #ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHBROOKSPOINTER_HPP 25 #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHBROOKSPOINTER_HPP 26 27 #include "oops/oop.hpp" 28 #include "utilities/globalDefinitions.hpp" 29 30 class ShenandoahBrooksPointer { 31 /* 32 * Notes: 33 * 34 * a. It is important to have byte_offset and word_offset return constant 35 * expressions, because that will allow to constant-fold forwarding ptr 36 * accesses. This is not a problem in JIT compilers that would generate 37 * the code once, but it is problematic in GC hotpath code. 38 * 39 * b. With filler object mechanics, we may need to allocate more space for 40 * the forwarding ptr to meet alignment requirements for objects. This 41 * means *_offset and *_size calls are NOT interchangeable. The accesses 42 * to forwarding ptrs should always be via *_offset. Storage size 43 * calculations should always be via *_size. 44 */ 45 46 public: 47 /* Offset from the object start, in HeapWords. */ word_offset()48 static inline int word_offset() { 49 return -1; // exactly one HeapWord 50 } 51 52 /* Offset from the object start, in bytes. */ byte_offset()53 static inline int byte_offset() { 54 return -HeapWordSize; // exactly one HeapWord 55 } 56 57 /* Allocated size, in HeapWords. */ word_size()58 static inline uint word_size() { 59 return (uint) MinObjAlignment; 60 } 61 62 /* Allocated size, in bytes */ byte_size()63 static inline uint byte_size() { 64 return (uint) MinObjAlignmentInBytes; 65 } 66 67 /* Assert basic stuff once at startup. */ initial_checks()68 static void initial_checks() { 69 guarantee (MinObjAlignment > 0, "sanity, word_size is correct"); 70 guarantee (MinObjAlignmentInBytes > 0, "sanity, byte_size is correct"); 71 } 72 73 /* Initializes Brooks pointer (to self). 74 */ 75 static inline void initialize(oop obj); 76 77 /* Gets forwardee from the given object. 78 */ 79 static inline oop forwardee(oop obj); 80 81 /* Tries to atomically update forwardee in $holder object to $update. 82 * Assumes $holder points at itself. 83 * Asserts $holder is in from-space. 84 * Asserts $update is in to-space. 85 */ 86 static inline oop try_update_forwardee(oop obj, oop update); 87 88 /* Sets raw value for forwardee slot. 89 * THIS IS DANGEROUS: USERS HAVE TO INITIALIZE/SET FORWARDEE BACK AFTER THEY ARE DONE. 90 */ 91 static inline void set_raw(oop obj, HeapWord* update); 92 93 /* Returns the raw value from forwardee slot. 94 */ 95 static inline HeapWord* get_raw(oop obj); 96 97 /* Returns the raw value from forwardee slot without any checks. 98 * Used for quick verification. 99 */ 100 static inline HeapWord* get_raw_unchecked(oop obj); 101 102 private: 103 static inline HeapWord** brooks_ptr_addr(oop obj); 104 }; 105 106 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHBROOKSPOINTER_HPP 107