--- a/hotspot/make/jprt.properties Wed Sep 17 16:49:18 2008 +0400
+++ b/hotspot/make/jprt.properties Wed Sep 17 19:59:35 2008 +0400
@@ -295,3 +295,9 @@
${jprt.my.windows.i586.test.targets}, \
${jprt.my.windows.x64.test.targets}
+# The default test/Makefile targets that should be run
+
+# Example:
+# jprt.make.rule.test.targets=*-*-*-packtest
+#jprt.make.rule.test.targets=*-product-*-packtest
+
--- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Wed Sep 17 16:49:18 2008 +0400
+++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Wed Sep 17 19:59:35 2008 +0400
@@ -1129,8 +1129,8 @@
#else
__ pushl(frame_map()->address_for_slot(src ->double_stack_ix(), 0));
// push and pop the part at src + wordSize, adding wordSize for the previous push
- __ pushl(frame_map()->address_for_slot(src ->double_stack_ix(), wordSize));
- __ popl (frame_map()->address_for_slot(dest->double_stack_ix(), wordSize));
+ __ pushl(frame_map()->address_for_slot(src ->double_stack_ix(), 2 * wordSize));
+ __ popl (frame_map()->address_for_slot(dest->double_stack_ix(), 2 * wordSize));
__ popl (frame_map()->address_for_slot(dest->double_stack_ix(), 0));
#endif // _LP64
--- a/hotspot/src/share/vm/opto/addnode.cpp Wed Sep 17 16:49:18 2008 +0400
+++ b/hotspot/src/share/vm/opto/addnode.cpp Wed Sep 17 19:59:35 2008 +0400
@@ -157,6 +157,7 @@
Node *a12 = add1->in(2);
const Type *t12 = phase->type( a12 );
if( t12->singleton() && t12 != Type::TOP && (add1 != add1->in(1)) ) {
+ assert(add1->in(1) != this, "dead loop in AddNode::Ideal");
add2 = add1->clone();
add2->set_req(2, in(2));
add2 = phase->transform(add2);
@@ -173,6 +174,7 @@
Node *a22 = add2->in(2);
const Type *t22 = phase->type( a22 );
if( t22->singleton() && t22 != Type::TOP && (add2 != add2->in(1)) ) {
+ assert(add2->in(1) != this, "dead loop in AddNode::Ideal");
Node *addx = add2->clone();
addx->set_req(1, in(1));
addx->set_req(2, add2->in(1));
--- a/hotspot/src/share/vm/opto/compile.cpp Wed Sep 17 16:49:18 2008 +0400
+++ b/hotspot/src/share/vm/opto/compile.cpp Wed Sep 17 19:59:35 2008 +0400
@@ -2082,7 +2082,7 @@
in2 = n->in(2)->in(1);
} else if ( n->in(2)->Opcode() == Op_ConP ) {
const Type* t = n->in(2)->bottom_type();
- if (t == TypePtr::NULL_PTR) {
+ if (t == TypePtr::NULL_PTR && UseImplicitNullCheckForNarrowOop) {
Node *in1 = n->in(1);
if (Matcher::clone_shift_expressions) {
// x86, ARM and friends can handle 2 adds in addressing mode.
--- a/hotspot/src/share/vm/opto/loopopts.cpp Wed Sep 17 16:49:18 2008 +0400
+++ b/hotspot/src/share/vm/opto/loopopts.cpp Wed Sep 17 19:59:35 2008 +0400
@@ -932,7 +932,7 @@
// to fold a StoreP and an AddP together (as part of an
// address expression) and the AddP and StoreP have
// different controls.
- if( !x->is_Load() ) _igvn._worklist.yank(x);
+ if( !x->is_Load() && !x->is_DecodeN() ) _igvn._worklist.yank(x);
}
_igvn.remove_dead_node(n);
}
--- a/hotspot/src/share/vm/runtime/arguments.cpp Wed Sep 17 16:49:18 2008 +0400
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Wed Sep 17 19:59:35 2008 +0400
@@ -1205,6 +1205,13 @@
warning(" UseCompressedOops does not currently work with UseG1GC; switching off UseCompressedOops. ");
FLAG_SET_DEFAULT(UseCompressedOops, false);
}
+#ifdef _WIN64
+ if (UseLargePages && UseCompressedOops) {
+ // Cannot allocate guard pages for implicit checks in indexed addressing
+ // mode, when large pages are specified on windows.
+ FLAG_SET_DEFAULT(UseImplicitNullCheckForNarrowOop, false);
+ }
+#endif // _WIN64
} else {
if (UseCompressedOops && !FLAG_IS_DEFAULT(UseCompressedOops)) {
warning("Max heap size too large for Compressed Oops");
--- a/hotspot/src/share/vm/runtime/globals.hpp Wed Sep 17 16:49:18 2008 +0400
+++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Sep 17 19:59:35 2008 +0400
@@ -306,6 +306,9 @@
lp64_product(bool, CheckCompressedOops, trueInDebug, \
"generate checks in encoding/decoding code") \
\
+ product(bool, UseImplicitNullCheckForNarrowOop, true, \
+ "generate implicit null check in indexed addressing mode.") \
+ \
/* UseMembar is theoretically a temp flag used for memory barrier \
* removal testing. It was supposed to be removed before FCS but has \
* been re-added (see 6401008) */ \
--- a/hotspot/src/share/vm/runtime/thread.cpp Wed Sep 17 16:49:18 2008 +0400
+++ b/hotspot/src/share/vm/runtime/thread.cpp Wed Sep 17 19:59:35 2008 +0400
@@ -2777,13 +2777,17 @@
// For now, just manually iterate through them.
tc->do_thread(VMThread::vm_thread());
Universe::heap()->gc_threads_do(tc);
- {
- // Grab the Terminator_lock to prevent watcher_thread from being terminated.
- MutexLockerEx mu(Terminator_lock, Mutex::_no_safepoint_check_flag);
- WatcherThread *wt = WatcherThread::watcher_thread();
- if (wt != NULL)
- tc->do_thread(wt);
- }
+ WatcherThread *wt = WatcherThread::watcher_thread();
+ // Strictly speaking, the following NULL check isn't sufficient to make sure
+ // the data for WatcherThread is still valid upon being examined. However,
+ // considering that WatchThread terminates when the VM is on the way to
+ // exit at safepoint, the chance of the above is extremely small. The right
+ // way to prevent termination of WatcherThread would be to acquire
+ // Terminator_lock, but we can't do that without violating the lock rank
+ // checking in some cases.
+ if (wt != NULL)
+ tc->do_thread(wt);
+
// If CompilerThreads ever become non-JavaThreads, add them here
}
--- a/hotspot/src/share/vm/runtime/virtualspace.cpp Wed Sep 17 16:49:18 2008 +0400
+++ b/hotspot/src/share/vm/runtime/virtualspace.cpp Wed Sep 17 19:59:35 2008 +0400
@@ -372,7 +372,8 @@
bool large, char* requested_address) :
ReservedSpace(size, alignment, large,
requested_address,
- UseCompressedOops ? lcm(os::vm_page_size(), alignment) : 0) {
+ UseCompressedOops && UseImplicitNullCheckForNarrowOop ?
+ lcm(os::vm_page_size(), alignment) : 0) {
// Only reserved space for the java heap should have a noaccess_prefix
// if using compressed oops.
protect_noaccess_prefix(size);
@@ -383,7 +384,8 @@
const size_t suffix_size,
const size_t suffix_align) :
ReservedSpace(prefix_size, prefix_align, suffix_size, suffix_align,
- UseCompressedOops ? lcm(os::vm_page_size(), prefix_align) : 0) {
+ UseCompressedOops && UseImplicitNullCheckForNarrowOop ?
+ lcm(os::vm_page_size(), prefix_align) : 0) {
protect_noaccess_prefix(prefix_size+suffix_size);
}
--- a/hotspot/test/Makefile Wed Sep 17 16:49:18 2008 +0400
+++ b/hotspot/test/Makefile Wed Sep 17 19:59:35 2008 +0400
@@ -1,5 +1,5 @@
#
-# Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 1995-2008 Sun Microsystems, Inc. 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
@@ -19,17 +19,18 @@
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
-#
+#
#
#
-# Makefile to run jtreg
+# Makefile to run various jdk tests
#
+# Get OS/ARCH specifics
OSNAME = $(shell uname -s)
+SLASH_JAVA = /java
ifeq ($(OSNAME), SunOS)
PLATFORM = solaris
- JCT_PLATFORM = solaris
ARCH = $(shell uname -p)
ifeq ($(ARCH), i386)
ARCH=i586
@@ -37,203 +38,165 @@
endif
ifeq ($(OSNAME), Linux)
PLATFORM = linux
- JCT_PLATFORM = linux
ARCH = $(shell uname -m)
ifeq ($(ARCH), i386)
- ARCH=i586
+ ARCH = i586
endif
endif
ifeq ($(OSNAME), Windows_NT)
PLATFORM = windows
- JCT_PLATFORM = win32
+ SLASH_JAVA = J:
ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),ia64)
- ARCH=ia64
+ ARCH = ia64
else
ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),AMD64)
- ARCH=x64
+ ARCH = x64
else
ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),EM64T)
- ARCH=x64
+ ARCH = x64
else
- ARCH=i586
+ ARCH = i586
endif
endif
endif
-endif
-
-# Default bundle of all test results (passed or not)
-JPRT_ARCHIVE_BUNDLE=$(TEST_ROOT)/JPRT_ARCHIVE_BUNDLE.zip
-
-# Default home for JTREG
-ifeq ($(PLATFORM), windows)
- JT_HOME = J:/svc/jct-tools3.2.2_01
-else
- JT_HOME = /java/svc/jct-tools3.2.2_01
+ EXESUFFIX = .exe
endif
-# Default JTREG to run
-JTREG = $(JT_HOME)/$(JCT_PLATFORM)/bin/jtreg
-
-# Root of this test area
-TEST_ROOT := $(shell pwd)
-
-# Default JDK to test
-JAVA_HOME = $(TEST_ROOT)/../build/$(PLATFORM)-$(ARCH)
+# Utilities used
+CD = cd
+CP = cp
+ECHO = echo
+MKDIR = mkdir
+ZIP = zip
-# The test directories to run
-DEFAULT_TESTDIRS = serviceability
-TESTDIRS = $(DEFAULT_TESTDIRS)
-
-# Files that hold total passed and failed counts (passed==0 is bad)
-JTREG_TOTALS_DIR = $(TEST_ROOT)/JTREG_TOTALS_$(PLATFORM)_$(ARCH)
-JTREG_FAILED = $(JTREG_TOTALS_DIR)/failed_count
-JTREG_PASSED = $(JTREG_TOTALS_DIR)/passed_count
+# Root of this test area (important to use full paths in some places)
+TEST_ROOT := $(shell pwd)
# Root of all test results
-JTREG_ALL_OUTPUT_DIRNAME = JTREG_OUTPUT_$(PLATFORM)_$(ARCH)
-JTREG_ALL_OUTPUT_DIR = $(TEST_ROOT)/$(JTREG_ALL_OUTPUT_DIRNAME)
-
-# Test results for one test directory
-JTREG_TEST_OUTPUT_DIR = $(JTREG_ALL_OUTPUT_DIR)/$@
-JTREG_TEST_REPORT_DIR = $(JTREG_TEST_OUTPUT_DIR)/JTreport
-JTREG_TEST_WORK_DIR = $(JTREG_TEST_OUTPUT_DIR)/JTwork
-JTREG_TEST_SUMMARY = $(JTREG_TEST_REPORT_DIR)/summary.txt
-
-# Temp files used by this Makefile
-JTREG_TEST_TEMP_DIR = $(JTREG_ALL_OUTPUT_DIR)/$@/temp
-JTREG_TEMP_PASSED = $(JTREG_TEST_TEMP_DIR)/passed
-JTREG_TEMP_FAILED = $(JTREG_TEST_TEMP_DIR)/failed
-JTREG_TEMP_OUTPUT = $(JTREG_TEST_TEMP_DIR)/output
-JTREG_TEMP_RESULTS = $(JTREG_TEST_TEMP_DIR)/results
-
-# JTREG options (different for 2.1.6 and 3.2.2_01)
-JTREG_COMMON_OPTIONS = -r:$(JTREG_TEST_REPORT_DIR) \
- -w:$(JTREG_TEST_WORK_DIR) \
- -testjdk:$(JAVA_HOME) \
- -automatic \
- -verbose:all
-JTREG_216_OPTIONS = $(JTREG_COMMON_OPTIONS) $@ $(JAVA_ARGS)
-JTREG_322_OPTIONS = $(JTREG_COMMON_OPTIONS) $(JAVA_ARGS:%=-vmoption:%) $@
-
-# Default make rule
-all: clean check tests
-
-# Chaeck to make sure these directories exist
-check: $(JT_HOME) $(JAVA_HOME) $(JTREG)
+ABS_BUILD_ROOT = $(TEST_ROOT)/../build/$(PLATFORM)-$(ARCH)
+ABS_TEST_OUTPUT_DIR = $(ABS_BUILD_ROOT)/testoutput
-# Prime the test run
-primecounts: FRC
- @rm -f -r $(JTREG_TOTALS_DIR)
- @mkdir -p $(JTREG_TOTALS_DIR)
- @echo "0" > $(JTREG_FAILED)
- @echo "0" > $(JTREG_PASSED)
+# Expect JPRT to set PRODUCT_HOME (the product or jdk in this case to test)
+ifndef PRODUCT_HOME
+ # Try to use j2sdk-image if it exists
+ ABS_JDK_IMAGE = $(ABS_BUILD_ROOT)/j2sdk-image
+ PRODUCT_HOME := \
+ $(shell \
+ if [ -d $(ABS_JDK_IMAGE) ] ; then \
+ $(ECHO) "$(ABS_JDK_IMAGE)"; \
+ else \
+ $(ECHO) "$(ABS_BUILD_ROOT)" ; \
+ fi)
+endif
-# Run the tests and determine the 'make' command exit status
-# Ultimately we determine the make exit code based on the passed/failed count
-tests: primecounts $(TESTDIRS)
- @echo "JTREG TOTAL: passed=`cat $(JTREG_PASSED)` failed=`cat $(JTREG_FAILED)`"
- zip -q -r $(JPRT_ARCHIVE_BUNDLE) $(JTREG_ALL_OUTPUT_DIRNAME)
- @if [ `cat $(JTREG_FAILED)` -ne 0 -o \
- `cat $(JTREG_PASSED)` -le 0 ] ; then \
- echo "JTREG FAILED"; \
- exit 1; \
- else \
- echo "JTREG PASSED"; \
- exit 0; \
- fi
-
-# Just make sure these directires exist
-$(JT_HOME) $(JAVA_HOME): FRC
- @if [ ! -d $@ ] ; then \
- echo "ERROR: Directory $@ does not exist"; \
- exit 1; \
- fi
-
-# Make sure this file exists
-$(JTREG): FRC
- @if [ ! -f $@ ] ; then \
- echo "ERROR: File $@ does not exist"; \
- exit 1; \
- fi
+# Expect JPRT to set JAVA_ARGS (e.g. -server etc.)
+JAVA_OPTIONS =
+ifdef JAVA_ARGS
+ JAVA_OPTIONS = $(JAVA_ARGS)
+endif
-# Process each test directory one by one, this rule always completes.
-# Note that the use of 'tee' tosses the jtreg process exit status, this
-# is as expected because even if jtreg fails, we need to save the
-# output. So we update the JTREG_PASSED and JTREG_FAILED count files.
-# Note that missing the 'results:' line in the last few lines of output
-# will indicate a failure (or a bump by one of the JTREG_FAILED file.
-# Note that passed: 0 or no passed: indication means a failure.
-# Note that any indication of the word 'failed' indicates failure.
-# Ultimately if the contents of JTREG_FAILED is not 0, we have failed
-# tests, and if the contents of JTREG_PASSED is 0, we consider that a
-# failure.
-$(TESTDIRS): FRC
- @if [ ! -d $@ ] ; then \
- echo "ERROR: Directory $@ does not exist"; \
- exit 1; \
- fi
- @echo "---------------------------------------------------"
- @rm -f -r $(JTREG_TEST_OUTPUT_DIR)
- @mkdir -p $(JTREG_TEST_OUTPUT_DIR)
- @mkdir -p $(JTREG_TEST_WORK_DIR)
- @mkdir -p $(JTREG_TEST_WORK_DIR)/scratch
- @mkdir -p $(JTREG_TEST_REPORT_DIR)
- @mkdir -p $(JTREG_TEST_TEMP_DIR)
- @echo "Testing $@"
- @echo "Using JAVA_HOME=$(JAVA_HOME)"
- @echo "Using JAVA_ARGS=$(JAVA_ARGS)"
- @if [ "`$(JTREG) -help 2>&1 | fgrep -- -vmoption`" != "" ] ; then \
- echo "Assume we are using jtreg 3.2.2_01 or newer"; \
- echo "$(JTREG) $(JTREG_322_OPTIONS)"; \
- $(JTREG) $(JTREG_322_OPTIONS) 2>&1 | tee $(JTREG_TEMP_OUTPUT) ; \
- else \
- echo "Assume we are using jtreg 2.1.6"; \
- echo "$(JTREG) $(JTREG_216_OPTIONS)"; \
- $(JTREG) $(JTREG_216_OPTIONS) 2>&1 | tee $(JTREG_TEMP_OUTPUT) ; \
- fi
- @echo "---------------------------------------------------"
- @echo "Extracting passed and failed counts from jtreg output"
- @tail -10 $(JTREG_TEMP_OUTPUT) | fgrep -i 'results:' | \
- tail -1 | tee $(JTREG_TEMP_RESULTS)
- @sed -e 's@.*\ passed:\ \([1-9][0-9]*\).*@\1@' $(JTREG_TEMP_RESULTS) \
- > $(JTREG_TEMP_PASSED)
- @if [ "`cat $(JTREG_TEMP_PASSED)`" = "" ] ; then \
- echo "ERROR: No passed indication in results"; \
- expr `cat $(JTREG_FAILED)` '+' 1 > $(JTREG_FAILED); \
- elif [ `cat $(JTREG_TEMP_PASSED)` -le 0 ] ; then \
- echo "ERROR: Passed count appears to be 0"; \
- expr `cat $(JTREG_FAILED)` '+' 1 > $(JTREG_FAILED); \
- elif [ "`fgrep -i failed $(JTREG_TEMP_RESULTS)`" = "" ] ; then \
- echo "No indication anything failed"; \
- expr `cat $(JTREG_PASSED)` '+' `cat $(JTREG_TEMP_PASSED)` \
- > $(JTREG_PASSED); \
- else \
- sed -e 's@.*\ failed:\ \([1-9][0-9]*\).*@\1@' $(JTREG_TEMP_FAILED) \
- > $(JTREG_TEMP_FAILED); \
- if [ "`cat $(JTREG_TEMP_FAILED)`" = "" ] ; then \
- echo "ERROR: Failed pattern but no failed count in results"; \
- expr `cat $(JTREG_FAILED)` '+' 1 > $(JTREG_FAILED); \
- elif [ `cat $(JTREG_TEMP_FAILED)` -le 0 ] ; then \
- echo "ERROR: Failed count is 0, did something failed or not?"; \
- expr `cat $(JTREG_FAILED)` '+' 1 > $(JTREG_FAILED); \
- else \
- expr `cat $(JTREG_FAILED)` '+' `cat $(JTREG_TEMP_FAILED)` \
- > $(JTREG_FAILED); \
- fi; \
- fi
- @echo "---------------------------------------------------"
- @echo "Summary: "
- @if [ -f $(JTREG_TEST_SUMMARY) ] ; then \
- cat $(JTREG_TEST_SUMMARY) ; \
- else \
- echo "ERROR: Missing $(JTREG_TEST_SUMMARY)"; \
- fi
- @echo "---------------------------------------------------"
+# Expect JPRT to set JPRT_ARCHIVE_BUNDLE (path to zip bundle for results)
+ARCHIVE_BUNDLE = $(ABS_TEST_OUTPUT_DIR)/ARCHIVE_BUNDLE.zip
+ifdef JPRT_ARCHIVE_BUNDLE
+ ARCHIVE_BUNDLE = $(JPRT_ARCHIVE_BUNDLE)
+endif
+
+# How to create the test bundle (pass or fail, we want to create this)
+BUNDLE_UP = ( $(MKDIR) -p `dirname $(ARCHIVE_BUNDLE)` \
+ && $(CD) $(ABS_TEST_OUTPUT_DIR) \
+ && $(ZIP) -q -r $(ARCHIVE_BUNDLE) . )
+BUNDLE_UP_FAILED = ( exitCode=$$? && $(BUNDLE_UP) && exit $${exitCode} )
+
+################################################################
+
+# Default make rule (runs jtreg_tests)
+all: jtreg_tests
+ @$(ECHO) "Testing completed successfully"
+
+# Prep for output
+prep: clean
+ @$(MKDIR) -p $(ABS_TEST_OUTPUT_DIR)
+ @$(MKDIR) -p `dirname $(ARCHIVE_BUNDLE)`
# Cleanup
clean:
- rm -f -r $(JTREG_ALL_OUTPUT_DIR)
- rm -f $(JPRT_ARCHIVE_BUNDLE)
+ $(RM) -r $(ABS_TEST_OUTPUT_DIR)
+ $(RM) $(ARCHIVE_BUNDLE)
+
+################################################################
+
+# jtreg tests
+
+# Expect JT_HOME to be set for jtreg tests. (home for jtreg)
+JT_HOME = $(SLASH_JAVA)/re/jtreg/4.0/promoted/latest/binaries/jtreg
+ifdef JPRT_JTREG_HOME
+ JT_HOME = $(JPRT_JTREG_HOME)
+endif
+
+# Expect JPRT to set TESTDIRS to the jtreg test dirs
+JTREG_TESTDIRS = demo/jvmti/gctest demo/jvmti/hprof
+ifdef TESTDIRS
+ JTREG_TESTDIRS = $(TESTDIRS)
+endif
+
+# Default JTREG to run (win32 script works for everybody)
+JTREG = $(JT_HOME)/win32/bin/jtreg
+
+# Option to tell jtreg to not run tests marked with "ignore"
+ifeq ($(PLATFORM), windows)
+ JTREG_KEY_OPTION = -k:!ignore
+else
+ JTREG_KEY_OPTION = -k:\!ignore
+endif
+
+#EXTRA_JTREG_OPTIONS =
-FRC:
+jtreg_tests: prep $(JT_HOME) $(PRODUCT_HOME) $(JTREG)
+ $(JTREG) -a -v:fail,error \
+ $(JTREG_KEY_OPTION) \
+ $(EXTRA_JTREG_OPTIONS) \
+ -r:$(ABS_TEST_OUTPUT_DIR)/JTreport \
+ -w:$(ABS_TEST_OUTPUT_DIR)/JTwork \
+ -jdk:$(PRODUCT_HOME) \
+ $(JAVA_OPTIONS:%=-vmoption:%) \
+ $(JTREG_TESTDIRS) \
+ || $(BUNDLE_UP_FAILED)
+ $(BUNDLE_UP)
+
+PHONY_LIST += jtreg_tests
+
+################################################################
+
+# packtest
+
+# Expect JPRT to set JPRT_PACKTEST_HOME.
+PACKTEST_HOME = /net/jprt-web.sfbay.sun.com/jprt/allproducts/packtest
+ifdef JPRT_PACKTEST_HOME
+ PACKTEST_HOME = $(JPRT_PACKTEST_HOME)
+endif
+#EXTRA_PACKTEST_OPTIONS =
+
+packtest: prep $(PACKTEST_HOME)/ptest $(PRODUCT_HOME)
+ ( $(CD) $(PACKTEST_HOME) && \
+ $(PACKTEST_HOME)/ptest \
+ -t "$(PRODUCT_HOME)" \
+ $(PACKTEST_STRESS_OPTION) \
+ $(EXTRA_PACKTEST_OPTIONS) \
+ -W $(ABS_TEST_OUTPUT_DIR) \
+ $(JAVA_OPTIONS:%=-J %) \
+ ) || $(BUNDLE_UP_FAILED)
+ $(BUNDLE_UP)
+
+packtest_stress: PACKTEST_STRESS_OPTION=-s
+packtest_stress: packtest
+
+PHONY_LIST += packtest packtest_stress
+
+################################################################
+
+# Phony targets (e.g. these are not filenames)
+.PHONY: all clean prep $(PHONY_LIST)
+
+################################################################
+