/*
* Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.max.vm.heap;
import com.sun.max.util.*;
public interface WriteBarrierSpecification {
public enum WriteBarrierSpec {
/**
* Indicate that the barrier applies to a reference held by a tuple.
*/
TUPLE_CELL,
/**
* Indicate that the barrier applies to a reference held by a array.
*/
ARRAY_CELL,
/**
* Indicates that the barrier must be generated before the store.
*/
PRE_WRITE,
/**
* Indicates that the barrier must be generated after the store.
*/
POST_WRITE,
/**
* Indicates that the barrier is generated at runtime. "Constants" defined at
* VM startup are available, and the barrier may take advantage of this.
*/
RUNTIME_GENERATED,
/**
* Indicates that the barrier is generated by the image generator. Some runtime-only constants
* may not be available, which may require an alternate implementation.
*/
HOST_GENERATED,
/**
* The barrier needs the origin of the cell holding the updated reference.
* This applies both for tuple and array cells.
*/
NEEDS_ORIGIN,
/**
* The barrier needs the precise address of the updated reference location.
*/
NEEDS_REF_ADDR,
/**
* The barrier needs a field offset. Relevant only for barrier generated for tuples.
*/
NEEDS_FIELD_OFFSET,
/**
* The barrier needs an index. Relevant only for barrier generated for arrays.
*/
NEEDS_ARRAY_INDEX,
/**
* The barrier needs the new value of the updated references.
*/
NEEDS_NEW_VALUE;
}
IntBitSet<WriteBarrierSpec> TUPLE_PRE_BARRIER = new IntBitSet<WriteBarrierSpec>().set(WriteBarrierSpec.TUPLE_CELL).set(WriteBarrierSpec.PRE_WRITE);
IntBitSet<WriteBarrierSpec> TUPLE_POST_BARRIER = new IntBitSet<WriteBarrierSpec>().set(WriteBarrierSpec.TUPLE_CELL).set(WriteBarrierSpec.POST_WRITE);
IntBitSet<WriteBarrierSpec> ARRAY_PRE_BARRIER = new IntBitSet<WriteBarrierSpec>().set(WriteBarrierSpec.ARRAY_CELL).set(WriteBarrierSpec.PRE_WRITE);
IntBitSet<WriteBarrierSpec> ARRAY_POST_BARRIER = new IntBitSet<WriteBarrierSpec>().set(WriteBarrierSpec.ARRAY_CELL).set(WriteBarrierSpec.POST_WRITE);
}