This commit is contained in:
John Coomes 2011-08-19 14:08:18 -07:00
commit af31d0cf27
16 changed files with 3381 additions and 1495 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2011 Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it

View file

@ -1,4 +1,4 @@
Copyright (c) 2007 Oracle and/or its affiliates. All rights reserved. Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2007, 2010 Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All Rights Reserved. * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All Rights Reserved. * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it

View file

@ -3252,7 +3252,6 @@ bool os::unguard_memory(char* addr, size_t bytes) {
// supported Solaris versions, this combination // supported Solaris versions, this combination
// is equivalent to +UseISM -UseMPSS. // is equivalent to +UseISM -UseMPSS.
typedef int (*getpagesizes_func_type) (size_t[], int);
static size_t _large_page_size = 0; static size_t _large_page_size = 0;
bool os::Solaris::ism_sanity_check(bool warn, size_t * page_size) { bool os::Solaris::ism_sanity_check(bool warn, size_t * page_size) {
@ -3284,23 +3283,29 @@ static void insertion_sort_descending(size_t* array, int len) {
} }
bool os::Solaris::mpss_sanity_check(bool warn, size_t * page_size) { bool os::Solaris::mpss_sanity_check(bool warn, size_t * page_size) {
getpagesizes_func_type getpagesizes_func =
CAST_TO_FN_PTR(getpagesizes_func_type, dlsym(RTLD_DEFAULT, "getpagesizes"));
if (getpagesizes_func == NULL) {
if (warn) {
warning("MPSS is not supported by the operating system.");
}
return false;
}
const unsigned int usable_count = VM_Version::page_size_count(); const unsigned int usable_count = VM_Version::page_size_count();
if (usable_count == 1) { if (usable_count == 1) {
return false; return false;
} }
// Find the right getpagesizes interface. When solaris 11 is the minimum
// build platform, getpagesizes() (without the '2') can be called directly.
typedef int (*gps_t)(size_t[], int);
gps_t gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes2"));
if (gps_func == NULL) {
gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes"));
if (gps_func == NULL) {
if (warn) {
warning("MPSS is not supported by the operating system.");
}
return false;
}
}
// Fill the array of page sizes. // Fill the array of page sizes.
int n = getpagesizes_func(_page_sizes, page_sizes_max); int n = (*gps_func)(_page_sizes, page_sizes_max);
assert(n > 0, "Solaris bug?"); assert(n > 0, "Solaris bug?");
if (n == page_sizes_max) { if (n == page_sizes_max) {
// Add a sentinel value (necessary only if the array was completely filled // Add a sentinel value (necessary only if the array was completely filled
// since it is static (zeroed at initialization)). // since it is static (zeroed at initialization)).
@ -3308,6 +3313,7 @@ bool os::Solaris::mpss_sanity_check(bool warn, size_t * page_size) {
DEBUG_ONLY(warning("increase the size of the os::_page_sizes array.");) DEBUG_ONLY(warning("increase the size of the os::_page_sizes array.");)
} }
assert(_page_sizes[n] == 0, "missing sentinel"); assert(_page_sizes[n] == 0, "missing sentinel");
trace_page_sizes("available page sizes", _page_sizes, n);
if (n == 1) return false; // Only one page size available. if (n == 1) return false; // Only one page size available.
@ -3337,6 +3343,7 @@ bool os::Solaris::mpss_sanity_check(bool warn, size_t * page_size) {
} }
*page_size = _page_sizes[0]; *page_size = _page_sizes[0];
trace_page_sizes("usable page sizes", _page_sizes, end + 1);
return true; return true;
} }

View file

@ -1,5 +1,5 @@
!! !!
!! Copyright (c) 2005, 2008 Oracle and/or its affiliates. All rights reserved. !! Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
!! DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. !! DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
!! !!
!! This code is free software; you can redistribute it and/or modify it !! This code is free software; you can redistribute it and/or modify it

View file

@ -1,4 +1,4 @@
Copyright (c) 2008 Oracle and/or its affiliates. All rights reserved. Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it

View file

@ -1,5 +1,5 @@
/* /*
* copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2007, 2011 Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it

View file

@ -963,10 +963,21 @@ void GenerateOopMap::init_basic_blocks() {
// initialize the CellTypeState-related information. // initialize the CellTypeState-related information.
init_state(); init_state();
// We allocate space for all state-vectors for all basicblocks in one huge chuck. // We allocate space for all state-vectors for all basicblocks in one huge
// Then in the next part of the code, we set a pointer in each _basic_block that // chunk. Then in the next part of the code, we set a pointer in each
// points to each piece. // _basic_block that points to each piece.
CellTypeState *basicBlockState = NEW_RESOURCE_ARRAY(CellTypeState, bbNo * _state_len);
// The product of bbNo and _state_len can get large if there are lots of
// basic blocks and stack/locals/monitors. Need to check to make sure
// we don't overflow the capacity of a pointer.
if ((unsigned)bbNo > UINTPTR_MAX / sizeof(CellTypeState) / _state_len) {
report_error("The amount of memory required to analyze this method "
"exceeds addressable range");
return;
}
CellTypeState *basicBlockState =
NEW_RESOURCE_ARRAY(CellTypeState, bbNo * _state_len);
memset(basicBlockState, 0, bbNo * _state_len * sizeof(CellTypeState)); memset(basicBlockState, 0, bbNo * _state_len * sizeof(CellTypeState));
// Make a pass over the basicblocks and assign their state vectors. // Make a pass over the basicblocks and assign their state vectors.

View file

@ -1232,6 +1232,17 @@ size_t os::page_size_for_region(size_t region_min_size, size_t region_max_size,
} }
#ifndef PRODUCT #ifndef PRODUCT
void os::trace_page_sizes(const char* str, const size_t* page_sizes, int count)
{
if (TracePageSizes) {
tty->print("%s: ", str);
for (int i = 0; i < count; ++i) {
tty->print(" " SIZE_FORMAT, page_sizes[i]);
}
tty->cr();
}
}
void os::trace_page_sizes(const char* str, const size_t region_min_size, void os::trace_page_sizes(const char* str, const size_t region_min_size,
const size_t region_max_size, const size_t page_size, const size_t region_max_size, const size_t page_size,
const char* base, const size_t size) const char* base, const size_t size)

View file

@ -208,11 +208,13 @@ class os: AllStatic {
size_t region_max_size, size_t region_max_size,
uint min_pages); uint min_pages);
// Method for tracing page sizes returned by the above method; enabled by // Methods for tracing page sizes returned by the above method; enabled by
// TracePageSizes. The region_{min,max}_size parameters should be the values // TracePageSizes. The region_{min,max}_size parameters should be the values
// passed to page_size_for_region() and page_size should be the result of that // passed to page_size_for_region() and page_size should be the result of that
// call. The (optional) base and size parameters should come from the // call. The (optional) base and size parameters should come from the
// ReservedSpace base() and size() methods. // ReservedSpace base() and size() methods.
static void trace_page_sizes(const char* str, const size_t* page_sizes,
int count) PRODUCT_RETURN;
static void trace_page_sizes(const char* str, const size_t region_min_size, static void trace_page_sizes(const char* str, const size_t region_min_size,
const size_t region_max_size, const size_t region_max_size,
const size_t page_size, const size_t page_size,

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, 2010 Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it

View file

@ -0,0 +1,86 @@
#!/bin/sh
##
## @test
## @bug 7020373 7055247
## @key cte_test
## @summary JSR rewriting can overflow memory address size variables
## @ignore Ignore it until 7053586 fixed
## @run shell Test7020373.sh
##
if [ "${TESTSRC}" = "" ]
then TESTSRC=.
fi
if [ "${TESTJAVA}" = "" ]
then
PARENT=`dirname \`which java\``
TESTJAVA=`dirname ${PARENT}`
echo "TESTJAVA not set, selecting " ${TESTJAVA}
echo "If this is incorrect, try setting the variable manually."
fi
if [ "${TESTCLASSES}" = "" ]
then
echo "TESTCLASSES not set. Test cannot execute. Failed."
exit 1
fi
BIT_FLAG=""
# set platform-dependent variables
OS=`uname -s`
case "$OS" in
SunOS | Linux )
NULL=/dev/null
PS=":"
FS="/"
## for solaris, linux it's HOME
FILE_LOCATION=$HOME
if [ -f ${FILE_LOCATION}${FS}JDK64BIT -a ${OS} = "SunOS" ]
then
BIT_FLAG=`cat ${FILE_LOCATION}${FS}JDK64BIT | grep -v '^#'`
fi
;;
Windows_* )
NULL=NUL
PS=";"
FS="\\"
;;
* )
echo "Unrecognized system!"
exit 1;
;;
esac
JEMMYPATH=${CPAPPEND}
CLASSPATH=.${PS}${TESTCLASSES}${PS}${JEMMYPATH} ; export CLASSPATH
THIS_DIR=`pwd`
${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} -version
${TESTJAVA}${FS}bin${FS}jar xvf ${TESTSRC}${FS}testcase.jar
${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} OOMCrashClass4000_1 > test.out 2>&1
cat test.out
egrep "SIGSEGV|An unexpected error has been detected" test.out
if [ $? = 0 ]
then
echo "Test Failed"
exit 1
else
grep "java.lang.LinkageError" test.out
if [ $? = 0 ]
then
echo "Test Passed"
exit 0
else
echo "Test Failed"
exit 1
fi
fi