From: <cap...@us...> - 2007-08-07 23:28:57
|
Revision: 13237 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=13237&view=rev Author: captain5050 Date: 2007-08-07 16:28:43 -0700 (Tue, 07 Aug 2007) Log Message: ----------- Unsafe annotations to indicate a method shouldn't have null or bounds checks generated in its body. Modified Paths: -------------- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/VM_AnnotatedElement.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/VM_TypeReference.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_Compiler.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/OPT_BC2IR.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/OPT_GenerationContext.java Added Paths: ----------- rvmroot/trunk/vmmagic/src/org/vmmagic/pragma/NoBoundsCheck.java rvmroot/trunk/vmmagic/src/org/vmmagic/pragma/NoNullCheck.java Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/VM_AnnotatedElement.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/VM_AnnotatedElement.java 2007-08-06 23:20:11 UTC (rev 13236) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/VM_AnnotatedElement.java 2007-08-07 23:28:43 UTC (rev 13237) @@ -266,6 +266,22 @@ } /** + * Return true if this element has a NoNullCheck annotation. + * @see org.vmmagic.pragma.NoNullCheck + */ + public final boolean hasNoNullCheckAnnotation() { + return isAnnotationDeclared(VM_TypeReference.NoNullCheck); + } + + /** + * Return true if this element has a NoBoundsCheck annotation. + * @see org.vmmagic.pragma.NoBoundsCheck + */ + public final boolean hasNoBoundsCheckAnnotation() { + return isAnnotationDeclared(VM_TypeReference.NoBoundsCheck); + } + + /** * Return true if this element has a RuntimeFinal annotation. * @see org.vmmagic.pragma.RuntimeFinal */ Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/VM_TypeReference.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/VM_TypeReference.java 2007-08-06 23:20:11 UTC (rev 13236) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/VM_TypeReference.java 2007-08-07 23:28:43 UTC (rev 13237) @@ -155,6 +155,8 @@ VM.BuildForIA32 ? null : findOrCreate(org.vmmagic.pragma.BaselineSaveLSRegisters.class); public static final VM_TypeReference Pure = findOrCreate(org.vmmagic.pragma.Pure.class); public static final VM_TypeReference RuntimeFinal = findOrCreate(org.vmmagic.pragma.RuntimeFinal.class); + public static final VM_TypeReference NoNullCheck = findOrCreate(org.vmmagic.pragma.NoNullCheck.class); + public static final VM_TypeReference NoBoundsCheck = findOrCreate(org.vmmagic.pragma.NoBoundsCheck.class); public static final VM_TypeReference VM_BaseAnnotation = findOrCreate(org.jikesrvm.classloader.VM_Annotation.BaseAnnotation.class); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_Compiler.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_Compiler.java 2007-08-06 23:20:11 UTC (rev 13236) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_Compiler.java 2007-08-07 23:28:43 UTC (rev 13237) @@ -57,7 +57,9 @@ private final int parameterWords; private int firstLocalOffset; - + /** Generate array index out of bounds checks? */ + private final boolean generateBoundsChecks; + private static final Offset NO_SLOT = Offset.zero(); private static final Offset ONE_SLOT = NO_SLOT.plus(WORDSIZE); private static final Offset TWO_SLOTS = ONE_SLOT.plus(WORDSIZE); @@ -73,6 +75,7 @@ super(cm); stackHeights = new int[bcodes.length()]; parameterWords = method.getParameterWords() + (method.isStatic() ? 0 : 1); // add 1 for this pointer + generateBoundsChecks = !method.hasNoBoundsCheckAnnotation(); } protected void initializeCompiler() { @@ -3101,20 +3104,22 @@ * @param indexReg the register containing the index * @param arrayRefReg the register containing the array reference */ - private static void genBoundsCheck(VM_Assembler asm, byte indexReg, byte arrayRefReg) { - // compare index to array length - asm.emitCMP_RegDisp_Reg(arrayRefReg, - VM_ObjectModel.getArrayLengthOffset(), - indexReg); - // Jmp around trap if index is OK - asm.emitBranchLikelyNextInstruction(); - VM_ForwardReference fr = asm.forwardJcc(VM_Assembler.LGT); - // "pass" index param to C trap handler - VM_ProcessorLocalState.emitMoveRegToField(asm, - VM_ArchEntrypoints.arrayIndexTrapParamField.getOffset(), indexReg); - // trap - asm.emitINT_Imm(VM_Runtime.TRAP_ARRAY_BOUNDS + RVM_TRAP_BASE); - fr.resolve(asm); + private void genBoundsCheck(VM_Assembler asm, byte indexReg, byte arrayRefReg) { + if (generateBoundsChecks) { + // compare index to array length + asm.emitCMP_RegDisp_Reg(arrayRefReg, + VM_ObjectModel.getArrayLengthOffset(), + indexReg); + // Jmp around trap if index is OK + asm.emitBranchLikelyNextInstruction(); + VM_ForwardReference fr = asm.forwardJcc(VM_Assembler.LGT); + // "pass" index param to C trap handler + VM_ProcessorLocalState.emitMoveRegToField(asm, + VM_ArchEntrypoints.arrayIndexTrapParamField.getOffset(), indexReg); + // trap + asm.emitINT_Imm(VM_Runtime.TRAP_ARRAY_BOUNDS + RVM_TRAP_BASE); + fr.resolve(asm); + } } /** Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/OPT_BC2IR.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/OPT_BC2IR.java 2007-08-06 23:20:11 UTC (rev 13236) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/OPT_BC2IR.java 2007-08-07 23:28:43 UTC (rev 13237) @@ -3515,7 +3515,7 @@ * @return true if an unconditional throw is generated, false otherwise */ public boolean do_NullCheck(OPT_Operand ref) { - if (gc.options.NO_NULL_CHECK) { + if (gc.noNullChecks()) { return false; } if (ref.isDefinitelyNull()) { @@ -3609,7 +3609,7 @@ */ public boolean do_BoundsCheck(OPT_Operand ref, OPT_Operand index) { // Unsafely eliminate all bounds checks - if (gc.options.NO_BOUNDS_CHECK) { + if (gc.noBoundsChecks()) { return false; } OPT_RegisterOperand guard = gc.temps.makeTempValidation(); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/OPT_GenerationContext.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/OPT_GenerationContext.java 2007-08-06 23:20:11 UTC (rev 13236) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/OPT_GenerationContext.java 2007-08-07 23:28:43 UTC (rev 13237) @@ -489,6 +489,20 @@ } /** + * Should null checks be generated? + */ + boolean noNullChecks() { + return options.NO_NULL_CHECK || method.hasNoNullCheckAnnotation(); + } + + /** + * Should bounds checks be generated? + */ + boolean noBoundsChecks() { + return options.NO_BOUNDS_CHECK || method.hasNoBoundsCheckAnnotation(); + } + + /** * Make a register operand that refers to the given local variable number * and has the given type. * Added: rvmroot/trunk/vmmagic/src/org/vmmagic/pragma/NoBoundsCheck.java =================================================================== --- rvmroot/trunk/vmmagic/src/org/vmmagic/pragma/NoBoundsCheck.java (rev 0) +++ rvmroot/trunk/vmmagic/src/org/vmmagic/pragma/NoBoundsCheck.java 2007-08-07 23:28:43 UTC (rev 13237) @@ -0,0 +1,28 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * 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/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.vmmagic.pragma; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.ElementType; +import org.vmmagic.Pragma; + +/** + * This pragma indicates that a particular method should never have bounds + * checks generated. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@Pragma +public @interface NoBoundsCheck { } Added: rvmroot/trunk/vmmagic/src/org/vmmagic/pragma/NoNullCheck.java =================================================================== --- rvmroot/trunk/vmmagic/src/org/vmmagic/pragma/NoNullCheck.java (rev 0) +++ rvmroot/trunk/vmmagic/src/org/vmmagic/pragma/NoNullCheck.java 2007-08-07 23:28:43 UTC (rev 13237) @@ -0,0 +1,28 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * 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/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.vmmagic.pragma; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.ElementType; +import org.vmmagic.Pragma; + +/** + * This pragma indicates that a particular method should never have null checks + * generated. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@Pragma +public @interface NoNullCheck { } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |