001 /* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013 package org.jikesrvm.objectmodel; 014 015 import org.jikesrvm.VM; 016 import org.jikesrvm.SizeConstants; 017 import org.jikesrvm.mm.mminterface.MemoryManagerConstants; 018 import org.vmmagic.unboxed.Offset; 019 import org.vmmagic.unboxed.Word; 020 021 /** 022 * Constants for the JavaHeader. 023 * 024 * @see ObjectModel 025 */ 026 public interface JavaHeaderConstants extends SizeConstants { 027 028 /** Number of bytes in object's TIB pointer */ 029 int TIB_BYTES = BYTES_IN_ADDRESS; 030 /** Number of bytes indicating an object's status */ 031 int STATUS_BYTES = BYTES_IN_ADDRESS; 032 033 int ALIGNMENT_MASK = 0x00000001; 034 int ALIGNMENT_VALUE = 0xdeadbeef; 035 int LOG_MIN_ALIGNMENT = LOG_BYTES_IN_INT; 036 037 /** 038 * Number of bytes used to store the array length. We use 64 bits 039 * for the length on a 64 bit architecture as this makes the other 040 * words 8-byte aligned, and the header has to be 8-byte aligned. 041 */ 042 int ARRAY_LENGTH_BYTES = VM.BuildFor64Addr ? BYTES_IN_ADDRESS : BYTES_IN_INT; 043 044 /** Number of bytes used by the Java Header */ 045 int JAVA_HEADER_BYTES = TIB_BYTES + STATUS_BYTES; 046 /** Number of bytes used by the GC Header */ 047 int GC_HEADER_BYTES = MemoryManagerConstants.GC_HEADER_BYTES; 048 /** Number of bytes used by the miscellaneous header */ 049 int MISC_HEADER_BYTES = MiscHeaderConstants.NUM_BYTES_HEADER; 050 /** Size of GC and miscellaneous headers */ 051 int OTHER_HEADER_BYTES = GC_HEADER_BYTES + MISC_HEADER_BYTES; 052 053 /** Offset of array length from object reference */ 054 Offset ARRAY_LENGTH_OFFSET = Offset.fromIntSignExtend(-ARRAY_LENGTH_BYTES); 055 /** Offset of the first field from object reference */ 056 Offset FIELD_ZERO_OFFSET = ARRAY_LENGTH_OFFSET; 057 /** Offset of the Java header from the object reference */ 058 Offset JAVA_HEADER_OFFSET = ARRAY_LENGTH_OFFSET.minus(JAVA_HEADER_BYTES); 059 /** Offset of the miscellaneous header from the object reference */ 060 Offset MISC_HEADER_OFFSET = JAVA_HEADER_OFFSET.minus(MISC_HEADER_BYTES); 061 /** Offset of the garbage collection header from the object reference */ 062 Offset GC_HEADER_OFFSET = MISC_HEADER_OFFSET.minus(GC_HEADER_BYTES); 063 /** Offset of first element of an array */ 064 Offset ARRAY_BASE_OFFSET = Offset.zero(); 065 066 /** 067 * This object model supports two schemes for hashcodes: 068 * (1) a 10 bit hash code in the object header 069 * (2) use the address of the object as its hashcode. 070 * In a copying collector, this forces us to add a word 071 * to copied objects that have had their hashcode taken. 072 */ 073 boolean ADDRESS_BASED_HASHING = !MemoryManagerConstants.GENERATE_GC_TRACE; 074 075 /** How many bits in the header are available for the GC and MISC headers? */ 076 int NUM_AVAILABLE_BITS = ADDRESS_BASED_HASHING ? 8 : 2; 077 078 /** 079 * Does this object model use the same header word to contain 080 * the TIB and a forwarding pointer? 081 */ 082 boolean FORWARDING_PTR_OVERLAYS_TIB = false; 083 084 /** 085 * Does this object model place the hash for a hashed and moved object 086 * after the data (at a dynamic offset) 087 */ 088 boolean DYNAMIC_HASH_OFFSET = ADDRESS_BASED_HASHING && MemoryManagerConstants.NEEDS_LINEAR_SCAN; 089 090 /** 091 * Can we perform a linear scan? 092 */ 093 boolean ALLOWS_LINEAR_SCAN = true; 094 095 /** 096 * Do we need to segregate arrays and scalars to do a linear scan? 097 */ 098 boolean SEGREGATE_ARRAYS_FOR_LINEAR_SCAN = false; 099 100 /* 101 * Stuff for address based hashing 102 */ Word HASH_STATE_UNHASHED = Word.zero(); 103 Word HASH_STATE_HASHED = Word.one().lsh(8); //0x00000100 104 Word HASH_STATE_HASHED_AND_MOVED = Word.fromIntZeroExtend(3).lsh(8); //0x0000300 105 Word HASH_STATE_MASK = HASH_STATE_UNHASHED.or(HASH_STATE_HASHED).or(HASH_STATE_HASHED_AND_MOVED); 106 107 int HASHCODE_BYTES = BYTES_IN_INT; 108 Offset HASHCODE_OFFSET = GC_HEADER_OFFSET.minus(HASHCODE_BYTES); 109 110 }