/* * This file is part of the Jikes RVM project (http://jikesrvm.org). * * This file is licensed to You under the Eclipse Public License (EPL); * You may not use this file except in compliance with the License. You * may obtain a copy of the License at * * http://www.opensource.org/licenses/eclipse-1.0.php * * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. */ package org.jikesrvm.objectmodel; import org.jikesrvm.VM; import org.jikesrvm.classloader.SpecializedMethodManager; /** * Layout the TIB (Type Information Block). */ public interface TIBLayoutConstants { //--------------------------------------------------------------------------------------------// // Type Information Block (TIB) Layout Constants // //--------------------------------------------------------------------------------------------// // // Object[] (type info block) RVMType (class info) // / / // +--------------------+ +--------------+ // | TIB pointer | | TIB pointer | // +--------------------+ +--------------+ // | status | | status | // +--------------------+ +--------------+ // | length | | field0 | // +--------------------+ +--------------+ // TIB: 0:| type +------------> | ... | // +--------------------+ +--------------+ // 1:| superclass ids +--> | fieldN-1 | // +--------------------+ +--------------+ // 2:| implements trits +--> // +--------------------+ // 3:| array element TIB +--> // +--------------------+ // 4:| iTABLES/IMT +--> // +--------------------+ // 5:| specialized 0 +--> // +--------------------+ // | ... +--> // +--------------------+ // V0:| virtual method 0 +-----+ // +--------------------+ | // | ... | | INSTRUCTION[] (machine code) // +--------------------+ | / // VN-1:| virtual method N-1 | | +--------------+ // +--------------------+ | | TIB pointer | // | +--------------+ // | | status | // | +--------------+ // | | length | // | +--------------+ // +------->| code0 | // +--------------+ // | ... | // +--------------+ // | codeN-1 | // +--------------+ // // Number of slots reserved for interface method pointers. // int IMT_METHOD_SLOTS = VM.BuildForIMTInterfaceInvocation ? 29 : 0; // First slot of tib points to RVMType (slot 0 in above diagram). // int TIB_TYPE_INDEX = 0; // A vector of ids for classes that this one extends. // (see vm/classLoader/DynamicTypeCheck.java) // int TIB_SUPERCLASS_IDS_INDEX = TIB_TYPE_INDEX + 1; // "Does this class implement the ith interface?" // (see vm/classLoader/DynamicTypeCheck.java) // int TIB_DOES_IMPLEMENT_INDEX = TIB_SUPERCLASS_IDS_INDEX + 1; // The TIB of the elements type of an array (may be null in fringe cases // when element type couldn't be resolved during array resolution). // Will be null when not an array. // int TIB_ARRAY_ELEMENT_TIB_INDEX = TIB_DOES_IMPLEMENT_INDEX + 1; // A pointer to either an ITable or InterfaceMethodTable (IMT) // depending on which dispatch implementation we are using. int TIB_INTERFACE_DISPATCH_TABLE_INDEX = TIB_ARRAY_ELEMENT_TIB_INDEX + 1; // A set of 0 or more specialized methods used in the VM such as for GC scanning int TIB_FIRST_SPECIALIZED_METHOD_INDEX = TIB_INTERFACE_DISPATCH_TABLE_INDEX + 1; // Next group of slots point to virtual method code blocks // (slots V1..VN in above diagram). int TIB_FIRST_VIRTUAL_METHOD_INDEX = TIB_FIRST_SPECIALIZED_METHOD_INDEX + SpecializedMethodManager.numSpecializedMethods(); /** * Special value returned by RVMClassLoader.getFieldOffset() or * RVMClassLoader.getMethodOffset() to indicate fields or methods * that must be accessed via dynamic linking code because their * offset is not yet known or the class's static initializer has not * yet been run. * * We choose a value that will never match a valid jtoc-, * instance-, or virtual method table- offset. Short.MIN_VALUE+1 is * a good value: * * <ul> * <li>the jtoc offsets are aligned and this value should be * too huge to address the table</li> * <li>instance field offsets are always >e; -4</li> * <li>virtual method offsets are always positive w.r.t. TIB pointer</li> * <li>fits into a PowerPC 16bit immediate operand</li> * </ul> */ int NEEDS_DYNAMIC_LINK = Short.MIN_VALUE + 1; }