From: <jik...@li...> - 2014-07-10 13:07:02
|
details: http://hg.code.sourceforge.net/p/jikesrvm/code/rev/a519238dd146 changeset: 10765:a519238dd146 user: Erik Brangs <eri...@gm...> date: Wed Jul 09 19:10:39 2014 +0200 description: Add missing @Entrypoint annotations. details: http://hg.code.sourceforge.net/p/jikesrvm/code/rev/7be8ed5d75ad changeset: 10766:7be8ed5d75ad user: Erik Brangs <eri...@gm...> date: Wed Jul 09 20:16:40 2014 +0200 description: Modify warnings for forbidden bytecodes (e.g. new in uninterruptible methods) so that the whole message is on a single line. This ensures that the data about the affected method is visible immediately when the build fails. Consequently, it is no longer necessary to look at the output log of the bootimage writer to determine where the problem lies. details: http://hg.code.sourceforge.net/p/jikesrvm/code/rev/5b83d78b731c changeset: 10767:5b83d78b731c user: Erik Brangs <eri...@gm...> date: Wed Jul 09 20:25:38 2014 +0200 description: Fail the build if an @Entrypoint annotation is missing and assertions are enabled. The presence of an @Entrypoint annotation is an important hint to ensure correctness. For example, one should do careful research before making fields final if they are annotated with @Entrypoint because writes to the field from code generated by the JIT compilers will not be visible in IDEs. diffstat: libraryInterface/Common/src/java/lang/VMCommonLibrarySupport.java | 1 + rvm/src/org/jikesrvm/compilers/baseline/TemplateCompilerFramework.java | 12 ++++---- rvm/src/org/jikesrvm/ia32/MultianewarrayHelper.java | 2 + rvm/src/org/jikesrvm/ia32/OutOfLineMachineCode.java | 9 +++--- rvm/src/org/jikesrvm/ia32/Registers.java | 6 ++++ rvm/src/org/jikesrvm/ppc/MultianewarrayHelper.java | 2 + rvm/src/org/jikesrvm/ppc/OutOfLineMachineCode.java | 13 +++++---- rvm/src/org/jikesrvm/ppc/Registers.java | 6 ++++ rvm/src/org/jikesrvm/runtime/EntrypointHelper.java | 11 ++++++++ rvm/src/org/jikesrvm/scheduler/RVMThread.java | 5 +++ 10 files changed, 51 insertions(+), 16 deletions(-) diffs (truncated from 302 to 300 lines): diff --git a/libraryInterface/Common/src/java/lang/VMCommonLibrarySupport.java b/libraryInterface/Common/src/java/lang/VMCommonLibrarySupport.java --- a/libraryInterface/Common/src/java/lang/VMCommonLibrarySupport.java +++ b/libraryInterface/Common/src/java/lang/VMCommonLibrarySupport.java @@ -102,6 +102,7 @@ * @param dstPos position within destination array * @param len amount of elements to copy */ + @Entrypoint static void arraycopy(Object src, int srcPos, Object dst, int dstPos, int len) { if (src == null || dst == null) { RuntimeEntrypoints.raiseNullPointerException(); diff --git a/rvm/src/org/jikesrvm/compilers/baseline/TemplateCompilerFramework.java b/rvm/src/org/jikesrvm/compilers/baseline/TemplateCompilerFramework.java --- a/rvm/src/org/jikesrvm/compilers/baseline/TemplateCompilerFramework.java +++ b/rvm/src/org/jikesrvm/compilers/baseline/TemplateCompilerFramework.java @@ -2074,8 +2074,8 @@ if (method.hasUnpreemptibleNoWarnAnnotation()) return; } // NB generate as a single string to avoid threads splitting output - VM.sysWriteln("WARNING: UNINTERRUPTIBLE VIOLATION\n "+ method + " at line " + method.getLineNumberForBCIndex(bci) + - "\n Uninterruptible methods may not contain the following forbidden bytecode\n " + msg); + VM.sysWriteln("WARNING: UNINTERRUPTIBLE VIOLATION. " + method + " at line " + method.getLineNumberForBCIndex(bci) + + ". Uninterruptible methods may not contain the following forbidden bytecode: " + msg); } /** @@ -2093,13 +2093,13 @@ } if (isUninterruptible && !target.isUninterruptible()) { // NB generate as a single string to avoid threads splitting output - VM.sysWrite("WARNING: UNINTERRUPTIBLE VIOLATION\n "+ method + " at line " + method.getLineNumberForBCIndex(bci) + - "\n Uninterruptible method calls non-uninterruptible method " + target + "\n"); + VM.sysWrite("WARNING: UNINTERRUPTIBLE VIOLATION. " + method + " at line " + method.getLineNumberForBCIndex(bci) + + ". Uninterruptible method calls non-uninterruptible method " + target + "\n"); } if (isUnpreemptible && target.isInterruptible()) { // NB generate as a single string to avoid threads splitting output - VM.sysWrite("WARNING: UNPREEMPTIBLE VIOLATION\n "+ method + " at line " + method.getLineNumberForBCIndex(bci) + - "\n Unpreemptible method calls interruptible method " + target + "\n"); + VM.sysWrite("WARNING: UNPREEMPTIBLE VIOLATION. " + method + " at line " + method.getLineNumberForBCIndex(bci) + + ". Unpreemptible method calls interruptible method " + target + "\n"); } } diff --git a/rvm/src/org/jikesrvm/ia32/MultianewarrayHelper.java b/rvm/src/org/jikesrvm/ia32/MultianewarrayHelper.java --- a/rvm/src/org/jikesrvm/ia32/MultianewarrayHelper.java +++ b/rvm/src/org/jikesrvm/ia32/MultianewarrayHelper.java @@ -17,6 +17,7 @@ import org.jikesrvm.classloader.TypeReference; import org.jikesrvm.runtime.Magic; import org.jikesrvm.runtime.RuntimeEntrypoints; +import org.vmmagic.pragma.Entrypoint; import org.vmmagic.unboxed.Address; import static org.jikesrvm.SizeConstants.BYTES_IN_WORD; @@ -42,6 +43,7 @@ * * See also: bytecode 0xc5 ("multianewarray") in BaselineCompilerImpl */ + @Entrypoint static Object newArrayArray(int methodId, int numDimensions, int typeId, int argOffset) throws NoClassDefFoundError, NegativeArraySizeException, OutOfMemoryError { if (numDimensions == 2) { diff --git a/rvm/src/org/jikesrvm/ia32/OutOfLineMachineCode.java b/rvm/src/org/jikesrvm/ia32/OutOfLineMachineCode.java --- a/rvm/src/org/jikesrvm/ia32/OutOfLineMachineCode.java +++ b/rvm/src/org/jikesrvm/ia32/OutOfLineMachineCode.java @@ -25,6 +25,7 @@ import org.jikesrvm.runtime.Entrypoints; import org.jikesrvm.runtime.Magic; import org.jikesrvm.scheduler.RVMThread; +import org.vmmagic.pragma.Entrypoint; import org.vmmagic.unboxed.Offset; import static org.jikesrvm.runtime.RuntimeEntrypoints.TRAP_UNKNOWN; @@ -92,16 +93,16 @@ private static ArchitectureSpecific.CodeArray pcThunkEDIInstructions; @SuppressWarnings({"unused", "UnusedDeclaration", "FieldCanBeLocal"}) - // Accessed via EntryPoints + @Entrypoint private static ArchitectureSpecific.CodeArray reflectiveMethodInvokerInstructions; @SuppressWarnings({"unused", "UnusedDeclaration", "FieldCanBeLocal"}) - // Accessed via EntryPoints + @Entrypoint private static ArchitectureSpecific.CodeArray saveThreadStateInstructions; @SuppressWarnings({"unused", "UnusedDeclaration", "FieldCanBeLocal"}) - // Accessed via EntryPoints + @Entrypoint private static ArchitectureSpecific.CodeArray threadSwitchInstructions; @SuppressWarnings({"unused", "UnusedDeclaration", "FieldCanBeLocal"}) - // Accessed via EntryPoints + @Entrypoint private static ArchitectureSpecific.CodeArray restoreHardwareExceptionStateInstructions; private static final Offset PARAMS_FP_OFFSET = Offset.fromIntSignExtend(WORDSIZE * 2); diff --git a/rvm/src/org/jikesrvm/ia32/Registers.java b/rvm/src/org/jikesrvm/ia32/Registers.java --- a/rvm/src/org/jikesrvm/ia32/Registers.java +++ b/rvm/src/org/jikesrvm/ia32/Registers.java @@ -17,6 +17,7 @@ import org.jikesrvm.scheduler.RVMThread; import org.jikesrvm.VM; import org.jikesrvm.mm.mminterface.MemoryManager; +import org.vmmagic.pragma.Entrypoint; import org.vmmagic.pragma.NonMoving; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.pragma.Untraced; @@ -36,15 +37,19 @@ /** General purpose registers */ @Untraced + @Entrypoint public final WordArray gprs; /** Floating point registers */ @Untraced + @Entrypoint public final double[] fprs; public final WordArray gprsShadow; public final double[] fprsShadow; /** Instruction address register */ + @Entrypoint public Address ip; /** Frame pointer */ + @Entrypoint public Address fp; /** @@ -52,6 +57,7 @@ * exception handler and RuntimeEntrypoints.athrow and reset by each * implementation of ExceptionDeliverer.deliverException */ + @Entrypoint public boolean inuse; public Registers() { diff --git a/rvm/src/org/jikesrvm/ppc/MultianewarrayHelper.java b/rvm/src/org/jikesrvm/ppc/MultianewarrayHelper.java --- a/rvm/src/org/jikesrvm/ppc/MultianewarrayHelper.java +++ b/rvm/src/org/jikesrvm/ppc/MultianewarrayHelper.java @@ -18,6 +18,7 @@ import org.jikesrvm.classloader.TypeReference; import org.jikesrvm.runtime.Magic; import org.jikesrvm.runtime.RuntimeEntrypoints; +import org.vmmagic.pragma.Entrypoint; import org.vmmagic.unboxed.Address; /** @@ -40,6 +41,7 @@ * be allocated for each dimension. * See also: bytecode 0xc5 ("multianewarray") in Compiler */ + @Entrypoint static Object newArrayArray(int methodId, int numDimensions, int typeId, int argOffset) throws NoClassDefFoundError, NegativeArraySizeException, OutOfMemoryError { if (numDimensions == 2) { diff --git a/rvm/src/org/jikesrvm/ppc/OutOfLineMachineCode.java b/rvm/src/org/jikesrvm/ppc/OutOfLineMachineCode.java --- a/rvm/src/org/jikesrvm/ppc/OutOfLineMachineCode.java +++ b/rvm/src/org/jikesrvm/ppc/OutOfLineMachineCode.java @@ -20,6 +20,7 @@ import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.runtime.ArchEntrypoints; import org.jikesrvm.runtime.Entrypoints; +import org.vmmagic.pragma.Entrypoint; import org.vmmagic.unboxed.Offset; /** @@ -47,21 +48,21 @@ } @SuppressWarnings("unused") - // Accessed via EntryPoints + @Entrypoint private static ArchitectureSpecific.CodeArray reflectiveMethodInvokerInstructions; @SuppressWarnings("unused") - // Accessed via EntryPoints + @Entrypoint private static ArchitectureSpecific.CodeArray saveThreadStateInstructions; @SuppressWarnings("unused") - // Accessed via EntryPoints + @Entrypoint private static ArchitectureSpecific.CodeArray threadSwitchInstructions; @SuppressWarnings("unused") - // Accessed via EntryPoints + @Entrypoint private static ArchitectureSpecific.CodeArray restoreHardwareExceptionStateInstructions; @SuppressWarnings("unused") - // Accessed via EntryPoints + @Entrypoint private static ArchitectureSpecific.CodeArray saveVolatilesInstructions; - // Accessed via EntryPoints + @Entrypoint private static ArchitectureSpecific.CodeArray restoreVolatilesInstructions; /** Machine code for reflective method invocation. diff --git a/rvm/src/org/jikesrvm/ppc/Registers.java b/rvm/src/org/jikesrvm/ppc/Registers.java --- a/rvm/src/org/jikesrvm/ppc/Registers.java +++ b/rvm/src/org/jikesrvm/ppc/Registers.java @@ -17,6 +17,7 @@ import org.jikesrvm.runtime.Magic; import org.jikesrvm.scheduler.RVMThread; import org.jikesrvm.VM; +import org.vmmagic.pragma.Entrypoint; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.pragma.Untraced; import org.vmmagic.unboxed.Address; @@ -35,12 +36,15 @@ /** word size general purpose registers (either 32 or 64 bit) */ @Untraced + @Entrypoint public final WordArray gprs; @Untraced + @Entrypoint public final double[] fprs; // 64-bit floating point registers public final WordArray gprsShadow; public final double[] fprsShadow; /** instruction address register **/ + @Entrypoint public Address ip; // The following are used by exception delivery. @@ -49,8 +53,10 @@ // They are not used for context switching. // /** link register */ + @Entrypoint public Address lr; /** do exception registers currently contain live values? */ + @Entrypoint public boolean inuse; private static final Address invalidIP = Address.max(); diff --git a/rvm/src/org/jikesrvm/runtime/EntrypointHelper.java b/rvm/src/org/jikesrvm/runtime/EntrypointHelper.java --- a/rvm/src/org/jikesrvm/runtime/EntrypointHelper.java +++ b/rvm/src/org/jikesrvm/runtime/EntrypointHelper.java @@ -22,6 +22,7 @@ import org.jikesrvm.classloader.MethodReference; import org.jikesrvm.classloader.NormalMethod; import org.jikesrvm.classloader.TypeReference; +import org.vmmagic.pragma.Entrypoint; /** * Helper class for retrieving entrypoints. Entrypoints are fields and @@ -52,9 +53,11 @@ RVMMember member; if ((member = cls.findDeclaredField(memName, memDescriptor)) != null) { + verifyPresenceOfEntrypointAnnotation(member); return member; } if ((member = cls.findDeclaredMethod(memName, memDescriptor)) != null) { + verifyPresenceOfEntrypointAnnotation(member); return member; } } catch (Exception e) { @@ -75,6 +78,14 @@ return null; } + private static void verifyPresenceOfEntrypointAnnotation(RVMMember member) { + if (VM.VerifyAssertions && !(member.isAnnotationPresent(Entrypoint.class))) { + String msg = "WARNING: MISSING @Entrypoint ANNOTATION: " + member + + " is missing an @Entrypoint annotation!"; + VM.sysWriteln(msg); + } + } + public static NormalMethod getMethod(String klass, String member, String descriptor, final boolean runtimeServiceMethod) { NormalMethod m = (NormalMethod) getMember(klass, member, descriptor); m.setRuntimeServiceMethod(runtimeServiceMethod); diff --git a/rvm/src/org/jikesrvm/scheduler/RVMThread.java b/rvm/src/org/jikesrvm/scheduler/RVMThread.java --- a/rvm/src/org/jikesrvm/scheduler/RVMThread.java +++ b/rvm/src/org/jikesrvm/scheduler/RVMThread.java @@ -295,9 +295,11 @@ } /** Registers used by return barrier trampoline */ + @Entrypoint private Registers trampolineRegisters = new Registers(); /** Return address of stack frame hijacked by return barrier */ + @Entrypoint private Address hijackedReturnAddress; /** Callee frame pointer for stack frame hijacked by return barrier */ @@ -501,16 +503,19 @@ /** * FP for current frame, saved in the prologue of every method */ + @Entrypoint Address framePointer; /** * "hidden parameter" for interface invocation thru the IMT */ + @Entrypoint int hiddenSignatureId; /** * "hidden parameter" from ArrayIndexOutOfBounds trap to C trap handler */ + @Entrypoint int arrayIndexTrapParam; |