diff --git a/.hgtags-top-repo b/.hgtags-top-repo
index 1ef732a3700..5dad9a69090 100644
--- a/.hgtags-top-repo
+++ b/.hgtags-top-repo
@@ -200,3 +200,4 @@ b43aa5bd8ca5c8121336495382d35ecfa7a71536 jdk8-b74
278af9fc67e7eba2884936b49ec07345f423aabb jdk8-b76
3933eebc659d58c597aa8cb4b3e58f2250ce3e1a jdk8-b77
fd1a5574cf68af24bfd52decc37ac6361afb278a jdk8-b78
+91d35211e74464dca5edf9b66ab01d0d0d8cded7 jdk8-b79
diff --git a/README b/README
index 45b71d266e0..40c9fbc6a77 100644
--- a/README
+++ b/README
@@ -1,45 +1,40 @@
README:
This file should be located at the top of the OpenJDK Mercurial root
- repository. This root repository will include a "make" directory,
- and a Makefile for building the entire OpenJDK.
- A full OpenJDK repository set (forest) should also include the following
- 6 nested repositories:
+ repository. A full OpenJDK repository set (forest) should also include
+ the following 6 nested repositories:
"jdk", "hotspot", "langtools", "corba", "jaxws" and "jaxp".
- There are also several source downloads for the jax* repositories that
- will be needed.
-
- This one root repository can be obtained with something like:
+ The root repository can be obtained with something like:
hg clone http://hg.openjdk.java.net/jdk8/jdk8 openjdk8
- To make sure you have all the nested repositories, you can run the
- get_source.sh script located in the same respository as this file:
-
+ You can run the get_source.sh script located in the root repository to get
+ the other needed repositories:
cd openjdk8 && sh ./get_source.sh
People unfamiliar with Mercurial should read the first few chapters of
the Mercurial book: http://hgbook.red-bean.com/read/
- See http://openjdk.java.net/ for more information about the OpenJDK.
+ See http://openjdk.java.net/ for more information about OpenJDK.
Simple Build Instructions:
0. Get the necessary system software/packages installed on your system, see
- http://hg.openjdk.java.net/jdk8/build/raw-file/tip/README-builds.html
+ http://hg.openjdk.java.net/jdk8/jdk8/raw-file/tip/README-builds.html
- 1. If you don't have a jdk6 installed, download and install a JDK 6 from
+ 1. If you don't have a jdk7u7 or newer jdk, download and install it from
http://java.sun.com/javase/downloads/index.jsp
- Set the environment variable ALT_BOOTDIR to the location of JDK 6.
+ Add the /bin directory of this installation to your PATH environment
+ variable.
- 2. Check the sanity of doing a build with your current system:
- make sanity
- See README-builds.html if you run into problems.
+ 2. Configure the build:
+ bash ./configure
- 3. Do a complete build of the OpenJDK:
+ 3. Build the OpenJDK:
make all
- The resulting JDK image should be found in build/*/j2sdk-image
+ The resulting JDK image should be found in build/*/images/j2sdk-image
where make is GNU make 3.81 or newer, /usr/bin/make on Linux usually
-is 3.81 or newer.
+is 3.81 or newer. Note that on Solaris, GNU make is called "gmake".
-Complete details are available in README-builds.html.
+Complete details are available in the file:
+ http://hg.openjdk.java.net/jdk8/jdk8/raw-file/tip/README-builds.html
diff --git a/README-builds.html b/README-builds.html
index 446588f7a36..9a52859f8c2 100644
--- a/README-builds.html
+++ b/README-builds.html
@@ -3,14 +3,15 @@
- This README file contains build instructions for the
- OpenJDK.
- Building the source code for the
- OpenJDK
- requires
- a certain degree of technical expertise.
+ This README file contains build instructions for the
+ OpenJDK.
+ Building the source code for the
+ OpenJDK
+ requires
+ a certain degree of technical expertise.
+
+
+
!!!!!!!!!!!!!!! THIS IS A MAJOR RE-WRITE of this document. !!!!!!!!!!!!!
+
+ Some Headlines:
+
+
+ The build is now a "configure && make" style build
+
+
+ Any GNU make 3.81 or newer should work
+
+
+ The build should scale, i.e. more processors should
+ cause the build to be done in less wall-clock time
+
+
+ Nested or recursive make invocations have been significantly
+ reduced, as has the total fork/exec or spawning
+ of sub processes during the build
+
+
+ Windows MKS usage is no longer supported
+
+
+ Windows Visual Studio vsvars*.bat and
+ vcvars*.bat files are run automatically
+
+
+ Ant is no longer used when building the OpenJDK
+
+
+ Use of ALT_* environment variables for configuring the
+ build is no longer supported
+
The OpenJDK sources are maintained with the revision control system
Mercurial.
If you are new to Mercurial, please see the
- Beginner Guides
- or refer to the Mercurial Book.
+
+ Beginner Guides
+ or refer to the
+ Mercurial Book.
The first few chapters of the book provide an excellent overview of
Mercurial, what it is and how it works.
@@ -130,578 +138,1631 @@
Developer Guide: Installing and Configuring Mercurial
section for more information.
-
To get the entire set of OpenJDK Mercurial repositories
- use the script get_source.sh located in the root repository:
+ use the script get_source.sh located in the
+ root repository:
-
- hg clone http://hg.openjdk.java.net/jdk8/jdk8 YourOpenJDK
- cd YourOpenJDK
- sh ./get_source.sh
-
-
- Once you have all the repositories, the
- script make/scripts/hgforest.sh
- can be used to repeat the same hg
- command on every repository in the forest, e.g.
-
+ Once you have all the repositories, keep in mind that each
+ repository is it's own independent repository.
+ You can also re-run ./get_source.sh anytime to
+ pull over all the latest changesets in all the repositories.
+ This set of nested repositories has been given the term
+ "forest" and there are various ways to apply the same
+ hg command to each of the repositories.
+ For example, the script make/scripts/hgforest.sh
+ can be used to repeat the same hg
+ command on every repository, e.g.
+
+
+ cd YourOpenJDK
+
+ bash ./make/scripts/hgforest.sh status
+
- This file often describes specific requirements for what we call the
- "minimum build environments" (MBE) for this
- specific release of the JDK,
- Building with the MBE will generate the most compatible
- bits that install on, and run correctly on, the most variations
- of the same base OS and hardware architecture.
- These usually represent what is often called the
- least common denominator platforms.
- It is understood that most developers will NOT be using these
- specific platforms, and in fact creating these specific platforms
- may be difficult due to the age of some of this software.
-
- The minimum OS and C/C++ compiler versions needed for building the
- OpenJDK:
-
-
-
-
-
Base OS and Architecture
-
OS
-
C/C++ Compiler
-
BOOT JDK
-
-
-
-
-
Linux X86 (32-bit)
-
Fedora 9
-
gcc 4.3
-
JDK 6u18
-
-
-
Linux X64 (64-bit)
-
Fedora 9
-
gcc 4.3
-
JDK 6u18
-
-
-
Solaris SPARC (32-bit)
-
Solaris 10 Update 6
-
Sun Studio 12 Update 1 + patches
-
JDK 6u18
-
-
-
Solaris SPARCV9 (64-bit)
-
Solaris 10 Update 6
-
Sun Studio 12 Update 1 + patches
-
JDK 6u18
-
-
-
Solaris X86 (32-bit)
-
Solaris 10 Update 6
-
Sun Studio 12 Update 1 + patches
-
JDK 6u18
-
-
-
Solaris X64 (64-bit)
-
Solaris 10 Update 6
-
Sun Studio 12 Update 1 + patches
-
JDK 6u18
-
-
-
Windows X86 (32-bit)
-
Windows XP
-
Microsoft Visual Studio C++ 2010 Professional Edition
-
JDK 6u18
-
-
-
Windows X64 (64-bit)
-
Windows Server 2003 - Enterprise x64 Edition
-
Microsoft Visual Studio C++ 2010 Professional Edition
-
JDK 6u18
-
-
-
Mac OS X X64 (64-bit)
-
Mac OS X 10.7.3 "Lion"
-
XCode 4.1 or later
-
Java for OS X Lion Update 1
-
-
-
-
- These same sources do indeed build on many more systems than the
- above older generation systems, again the above is just a minimum.
-
- Compilation problems with newer or different C/C++ compilers is a
- common problem.
- Similarly, compilation problems related to changes to the
- /usr/include or system header files is also a
- common problem with newer or unreleased OS versions.
- Please report these types of problems as bugs so that they
- can be dealt with accordingly.
-
- After installing Fedora 9
- you need to install several build dependencies. The simplest
- way to do it is to execute the following commands as user
- root:
-
- yum-builddep java-1.6.0-openjdk
-
- yum install gcc gcc-c++
-
- In addition, it's necessary to set a few environment variables for the build:
-
-
- export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-openjdk
+
The set of repositories and what they contain:
+
+
+
+
Repository
+
Contains
+
+
+
+
+
+ . (root)
+
+
+ common configure and makefile logic
+
+
+
+
+ hotspot
+
+
+ source code and make files for building
+ the OpenJDK Hotspot Virtual Machine
+
+
+
+
+ langtools
+
+
+ source code for the OpenJDK javac and language tools
+
+
+
+
+ jdk
+
+
+ source code and make files for building
+ the OpenJDK runtime libraries and misc files
+
+
+
+
+ jaxp
+
+
+ source code for the OpenJDK JAXP functionality
+
+
+
+
+ jaxws
+
+
+ source code for the OpenJDK JAX-WS functionality
+
+
+
+
+ corba
+
+
+ source code for the OpenJDK Corba functionality
+
+
+
+
-
Fedora 10
-
-
- After installing Fedora 10
- you need to install several build dependencies. The simplest
- way to do it is to execute the following commands as user
- root:
-
- yum-builddep java-1.6.0-openjdk
-
- yum install gcc gcc-c++
-
- In addition, it's necessary to set a few environment variables for the build:
-
- export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-openjdk
-
-
Fedora 11
-
-
- After installing Fedora 11
- you need to install several build dependencies. The simplest
- way to do it is to execute the following commands as user
- root:
-
- yum-builddep java-1.6.0-openjdk
-
- yum install gcc gcc-c++
-
- In addition, it's necessary to set a few environment variables for the build:
-
-
- export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-openjdk
-
+ Use of whitespace in source files
+ (.java, .c, .h, .cpp, and .hpp files)
+ is restricted.
+ No TABs, no trailing whitespace on lines, and files
+ should not terminate in more than one blank line.
+
+
+ Files with execute permissions should not be added
+ to the source repositories.
+
+
+ All generated files need to be kept isolated from
+ the files
+ maintained or managed by the source control system.
+ The standard area for generated files is the top level
+ build/ directory.
+
+
+ The default build process should be to build the product
+ and nothing else, in one form, e.g. a product (optimized),
+ debug (non-optimized, -g plus assert logic), or
+ fastdebug (optimized, -g plus assert logic).
+
+
+ The .hgignore file in each repository
+ must exist and should
+ include ^build/, ^dist/ and
+ optionally any
+ nbproject/private directories.
+ It should NEVER include
+ anything in the
+ src/ or test/
+ or any managed directory area of a repository.
+
+
+ Directory names and file names should never contain
+ blanks or
+ non-printing characters.
+
+
+ Generated source or binary files should NEVER be added to
+ the repository (that includes javah output).
+ There are some exceptions to this rule, in particular
+ with some of the generated configure scripts.
+
+
+ Files not needed for typical building
+ or testing of the repository
+ should not be added to the repository.
+
-
- Plus the following packages:
-
-
-
cups devel: Cups Development Package
-
alsa devel: Alsa Development Package
-
ant: Ant Package
-
Xi devel: libXi.so Development Package
-
-
-
- The freetype 2.3 packages don't seem to be available,
- but the freetype 2.3 sources can be downloaded, built,
- and installed easily enough from
-
- the freetype site.
- Build and install with something like:
-
- ./configure && make && sudo -u root make install
-
-
- Mercurial packages could not be found easily, but a Google
- search should find ones, and they usually include Python if
- it's needed.
-
- After installing Debian 5
- you need to install several build dependencies.
- The simplest way to install the build dependencies is to
- execute the following commands as user root:
-
- aptitude build-dep openjdk-6
-
- aptitude install openjdk-6-jdk libmotif-dev
-
- In addition, it's necessary to set a few environment variables for the build:
-
- export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk
-
- After installing Ubuntu 8.04
- you need to install several build dependencies.
-
- First, you need to enable the universe repository in the
- Software Sources application and reload the repository
- information. The Software Sources application is available
- under the System/Administration menu.
-
- The simplest way to install the build dependencies is to
- execute the following commands:
-
- sudo aptitude build-dep openjdk-6
-
- sudo aptitude install openjdk-6-jdk
-
- In addition, it's necessary to set a few environment variables for the build:
-
- export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk
-
-
Ubuntu 8.10
-
-
- After installing Ubuntu 8.10
- you need to install several build dependencies. The simplest
- way to do it is to execute the following commands:
-
- sudo aptitude build-dep openjdk-6
-
- sudo aptitude install openjdk-6-jdk
-
- In addition, it's necessary to set a few environment variables for the build:
-
- export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk
-
-
Ubuntu 9.04
-
-
- After installing Ubuntu 9.04
- you need to install several build dependencies. The simplest
- way to do it is to execute the following commands:
-
- sudo aptitude build-dep openjdk-6
-
- sudo aptitude install openjdk-6-jdk
-
- In addition, it's necessary to set a few environment variables for the build:
-
- export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk
-
- After installing OpenSUSE 11.1
- you need to install several build dependencies.
- The simplest way to install the build dependencies is to
- execute the following commands:
-
- sudo zypper source-install -d java-1_6_0-openjdk
-
- sudo zypper install make
-
- In addition, it is necessary to set a few environment variables for the build:
-
- export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-1.6.0-openjdk
-
- Finally, you need to unset the JAVA_HOME environment variable:
-
- export -n JAVA_HOME
-
- After installing Mandriva Linux One 2009 Spring
- you need to install several build dependencies.
- The simplest way to install the build dependencies is to
- execute the following commands as user root:
-
- urpmi java-1.6.0-openjdk-devel ant make gcc gcc-c++ freetype-devel zip unzip libcups2-devel libxrender1-devel libalsa2-devel libstc++-static-devel libxtst6-devel libxi-devel
-
- In addition, it is necessary to set a few environment variables for the build:
-
- export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-1.6.0-openjdk
-
- After installing OpenSolaris 2009.06
- you need to install several build dependencies.
- The simplest way to install the build dependencies is to
- execute the following commands:
-
- pfexec pkg install SUNWgmake SUNWj6dev SUNWant sunstudioexpress SUNWcups SUNWzip SUNWunzip SUNWxwhl SUNWxorg-headers SUNWaudh SUNWfreetype2
-
- In addition, it is necessary to set a few environment variables for the build:
-
- export LANG=C ALT_COMPILER_PATH=/opt/SunStudioExpress/bin/ ALT_CUPS_HEADERS_PATH=/usr/include/
-
- Finally, you need to make sure that the build process can find the Sun Studio compilers:
-
- export PATH=$PATH:/opt/SunStudioExpress/bin/
-
- The source code for the OpenJDK is delivered in a set of
- directories:
- hotspot,
- langtools,
- corba,
- jaxws,
- jaxp,
- and
- jdk.
- The hotspot directory contains the source code and make
- files for building the OpenJDK Hotspot Virtual Machine.
- The langtools directory contains the source code and make
- files for building the OpenJDK javac and language tools.
- The corba directory contains the source code and make
- files for building the OpenJDK Corba files.
- The jaxws directory contains the source code and make
- files for building the OpenJDK JAXWS files.
- The jaxp directory contains the source code and make
- files for building the OpenJDK JAXP files.
- The jdk directory contains the source code and make files for
- building the OpenJDK runtime libraries and misc files.
- The top level Makefile
- is used to build the entire OpenJDK.
-
+ The very first step in building the OpenJDK is making sure the
+ system itself has everything it needs to do OpenJDK builds.
+ Once a system is setup, it generally doesn't need to be done again.
+
+ Building the OpenJDK is now done with running a
+ configure
+ script which will try and find and verify you have everything
+ you need, followed by running
+ make, e.g.
-
- The repositories jaxp and jaxws actually
- do not contain the sources for JAXP or JAX-WS.
- These products have their own open source procedures at their
- JAXP and
- JAX-WS home pages.
- The OpenJDK project does need access to these sources to build
- a complete JDK image because JAXP and JAX-WS are part of the JDK.
- The current process for delivery of the JAXP and JAX-WS sources
- involves so called "source drop bundles" downloaded from a public
- website.
- There are many reasons for this current mechanism, and it is
- understood that this is not ideal for the open source community.
- It is possible this process could change in the future.
+
+
+ bash ./configure
+ make all
+
+
+
+ Where possible the configure script will attempt to located the
+ various components in the default locations or via component
+ specific variable settings.
+ When the normal defaults fail or components cannot be found,
+ additional configure options may be necessary to help configure
+ find the necessary tools for the build, or you may need to
+ re-visit the setup of your system due to missing software
+ packages.
+
+ NOTE: The configure script
+ file does not have
+ execute permissions and will need to be explicitly run with
+ bash,
+ see the source guidelines.
+
+
+
+
+ Before even attempting to use a system to build the OpenJDK
+ there are some very basic system setups needed.
+ For all systems:
+
+
+ Be sure the GNU make utility is version 3.81 or newer,
+ e.g. run "make -version"
+
+
+ Install a
+ Bootstrap JDK
+
+ All OpenJDK builds require access to a previously released
+ JDK, this is often called a bootstrap JDK.
+ Currently, for this JDK release we require
+ JDK 7 Update 7 or newer.
+ The JDK 7 binaries can be downloaded from Oracle's
+ JDK 7 download site.
+ For build performance reasons
+ is very important that this bootstrap JDK be made available
+ on the local disk of the machine doing the build.
+ You should add its bin directory
+ to the PATH environment variable.
+ If configure has any issues finding this JDK, you may
+ need to use the configure option
+ --with-boot-jdk.
+
+
+ Insure that GNU make, the Bootstrap JDK,
+ and the compilers are all
+ in your PATH environment variable
+
+ With Linux, try and favor the system packages over
+ building your own
+ or getting packages from other areas.
+ Most Linux builds should be possible with the system's
+ available packages.
- NOTE: The
- Complete OpenJDK Source Bundleswill contain the JAXP and
- JAX-WS sources.
+ Note that some Linux systems have a habit of pre-populating
+ your environment variables for you, for example JAVA_HOME
+ might get pre-defined for you to refer to the JDK installed on
+ your Linux system.
+ You will need to unset JAVA_HOME.
+ It's a good idea to run env and verify the
+ environment variables you are getting from the default system
+ settings make sense for building the OpenJDK.
+
+
+ At a minimum, the
+
+ Studio 12 Update 1 Compilers
+ (containing version 5.10 of the C and C++ compilers) is required,
+ including specific patches.
+
+ The Solaris SPARC patch list is:
+
+
+ 118683-05: SunOS 5.10: Patch for profiling libraries and assembler
+
+
+ 119963-21: SunOS 5.10: Shared library patch for C++
+
+ 141858-06: Sun Studio 12 Update 1_x86: Sun Compiler Common patch for x86 backend
+
+
+ 128229-09: Sun Studio 12 Update 1_x86: Patch for C++ Compiler
+
+
+ 142363-05: Sun Studio 12 Update 1_x86: Patch for C Compiler
+
+
+ 142368-01: Sun Studio 12.1_x86: Patch for Performance Analyzer Tools
+
+
+
+ Place the bin directory in PATH.
+
+ The Oracle Solaris Studio Express compilers at:
+
+ Oracle Solaris Studio Express Download site
+ are also an option, although these compilers have not
+ been extensively used yet.
+
+ Building on Windows requires a Unix-like environment, notably a
+ Unix-like shell.
+ There are several such environments available of which
+ Cygwin and
+ MinGW/MSYS are
+ currently supported for
+ the OpenJDK build. One of the differences of these
+ systems from standard Windows tools is the way
+ they handle Windows path names, particularly path names which contain
+ spaces, backslashes as path separators and possibly drive letters.
+ Depending
+ on the use case and the specifics of each environment these path
+ problems can
+ be solved by a combination of quoting whole paths, translating
+ backslashes to
+ forward slashes, escaping backslashes with additional backslashes and
+ translating the path names to their
+
+ "8.3" version.
+
+
+ CYGWIN is an open source, Linux-like environment which tries to emulate
+ a complete POSIX layer on Windows. It tries to be smart about path names
+ and can usually handle all kinds of paths if they are correctly quoted
+ or escaped although internally it maps drive letters <drive>:
+ to a virtual directory /cygdrive/<drive>.
+
+ You can always use the cygpath utility to map pathnames with spaces
+ or the backslash character into the C:/ style of pathname
+ (called 'mixed'), e.g. cygpath -s -m "path".
+
+
+ Note that the use of CYGWIN creates a unique problem with regards to
+ setting PATH. Normally on Windows
+ the PATH variable contains directories
+ separated with the ";" character (Solaris and Linux use ":").
+ With CYGWIN, it uses ":", but that means that paths like "C:/path"
+ cannot be placed in the CYGWIN version of PATH and
+ instead CYGWIN uses something like /cygdrive/c/path
+ which CYGWIN understands, but only CYGWIN understands.
+
+
+ The OpenJDK build requires CYGWIN version 1.7.16 or newer.
+ Information about CYGWIN can
+ be obtained from the CYGWIN website at
+ www.cygwin.com.
+
+
+ By default CYGWIN doesn't install all the tools required for building
+ the OpenJDK.
+ Along with the default installation, you need to install
+ the following tools.
+
+
+
+
+
Binary Name
+
Category
+
Package
+
Description
+
+
+
+
+
ar.exe
+
Devel
+
binutils
+
+ The GNU assembler, linker and binary utilities
+
+
+
+
make.exe
+
Devel
+
make
+
+ The GNU version of the 'make' utility built for CYGWIN
+
+
+
+
m4.exe
+
Interpreters
+
m4
+
+ GNU implementation of the traditional Unix macro
+ processor
+
+
+
+
cpio.exe
+
Utils
+
cpio
+
+ A program to manage archives of files
+
+
+
+
gawk.exe
+
Utils
+
awk
+
+ Pattern-directed scanning and processing language
+
+
+
+
file.exe
+
Utils
+
file
+
+ Determines file type using 'magic' numbers
+
+
+
+
zip.exe
+
Archive
+
zip
+
+ Package and compress (archive) files
+
+
+
+
unzip.exe
+
Archive
+
unzip
+
+ Extract compressed files in a ZIP archive
+
+
+
+
free.exe
+
System
+
procps
+
+ Display amount of free and used memory in the system
+
+
+
+
+
+ Note that the CYGWIN software can conflict with other non-CYGWIN
+ software on your Windows system.
+ CYGWIN provides a
+ FAQ for
+ known issues and problems, of particular interest is the
+ section on
+
+ BLODA (applications that interfere with CYGWIN).
+
+ MinGW ("Minimalist GNU for Windows") is a collection of free Windows
+ specific header files and import libraries combined with GNU toolsets that
+ allow one to produce native Windows programs that do not rely on any
+ 3rd-party C runtime DLLs. MSYS is a supplement to MinGW which allows building
+ applications and programs which rely on traditional UNIX tools to
+ be present. Among others this includes tools like bash
+ and make.
+ See MinGW/MSYS
+ for more information.
+
+ Like Cygwin, MinGW/MSYS can handle different types of path formats. They
+ are internally converted to paths with forward slashes and drive letters
+ <drive>: replaced by a virtual
+ directory /<drive>. Additionally, MSYS automatically
+ detects binaries compiled for the MSYS environment and feeds them with the
+ internal, Unix-style path names. If native Windows applications are called
+ from within MSYS programs their path arguments are automatically converted
+ back to Windows style path names with drive letters and backslashes as
+ path separators. This may cause problems for Windows applications which
+ use forward slashes as parameter separator (e.g. cl /nologo /I)
+ because MSYS may wrongly
+ replace such parameters by drive letters.
+
+
+ In addition to the tools which will be installed
+ by default, you have
+ to manually install the
+ msys-zip and
+ msys-unzip packages.
+ This can be easily done with the MinGW command line installer:
+
+ The 32-bit and 64-bit OpenJDK Windows build requires
+ Microsoft Visual Studio C++ 2010 (VS2010) Professional
+ Edition or Express compiler.
+ The compiler and other tools are expected to reside
+ in the location defined by the variable
+ VS100COMNTOOLS which
+ is set by the Microsoft Visual Studio installer.
+
+
+ Only the C++ part of VS2010 is needed.
+ Try to let the installation go to the default
+ install directory.
+ Always reboot your system after installing VS2010.
+ The system environment variable VS100COMNTOOLS
+ should be
+ set in your environment.
+
+
+ Make sure that TMP and TEMP are also set
+ in the environment
+ and refer to Windows paths that exist,
+ like C:\temp,
+ not /tmp, not /cygdrive/c/temp,
+ and not C:/temp.
+ C:\temp is just an example,
+ it is assumed that this area is
+ private to the user, so by default
+ after installs you should
+ see a unique user path in these variables.
+
+ The basic invocation of the configure script
+ looks like:
+
+ bash ./configure [options]
+
+ This will create an output directory containing the
+ "configuration" and setup an area for the build result.
+ This directory typically looks like:
+
+ build/linux-x64-normal-server-release
+
+ configure will try to figure out what system you are running on
+ and where all necessary build components are.
+ If you have all prerequisites for building installed,
+ it should find everything.
+ If it fails to detect any component automatically,
+ it will exit and inform you about the problem.
+ When this happens, read more below in
+ the configure options.
+
+ Complete details on all the OpenJDK configure options can
+ be seen with:
+
+ bash ./configure --help=short
+
+ Use -help to see all the configure options
+ available.
+
+ You can generate any number of different configurations,
+ e.g. debug, release, 32, 64, etc.
+
+ Some of the more commonly used configure options are:
+
+
+
+
+
OpenJDK Configure Option
+
Description
+
+
+
+
+
--enable-debug
+
+ set the debug level to fastdebug (this is a shorthand for
+ --with-debug-level=fastdebug)
+
+
+
+
--with-alsa=path
+
+ select the location of the
+ Advanced Linux Sound Architecture (ALSA)
+
+ Version 0.9.1 or newer of the ALSA files are
+ required for building the OpenJDK on Linux.
+ These Linux files are usually available from an "alsa"
+ of "libasound"
+ development package,
+ and it's highly recommended that you try and use
+ the package provided by the particular version of Linux that
+ you are using.
+
+ provide the JVM options to be used to run the
+ Bootstrap JDK
+
+
+
+
--with-cacerts=path
+
+ select the path to the cacerts file.
+
+ See
+ http://en.wikipedia.org/wiki/Certificate_Authority
+ for a better understanding of the Certificate Authority (CA).
+ A certificates file named "cacerts"
+ represents a system-wide keystore with CA certificates.
+ In JDK and JRE
+ binary bundles, the "cacerts" file contains root CA certificates from
+ several public CAs (e.g., VeriSign, Thawte, and Baltimore).
+ The source contain a cacerts file
+ without CA root certificates.
+ Formal JDK builders will need to secure
+ permission from each public CA and include the certificates into their
+ own custom cacerts file.
+ Failure to provide a populated cacerts file
+ will result in verification errors of a certificate chain during runtime.
+ By default an empty cacerts file is provided and that should be
+ fine for most JDK developers.
+
+
+
+
--with-cups=path
+
+ select the CUPS install location
+
+ The
+ Common UNIX Printing System (CUPS) Headers
+ are required for building the
+ OpenJDK on Solaris and Linux.
+ The Solaris header files can be obtained by installing
+ the package SFWcups from the Solaris Software
+ Companion CD/DVD, these often will be installed into the
+ directory /opt/sfw/cups.
+
+ The CUPS header files can always be downloaded from
+ www.cups.org.
+
+
+
+
--with-cups-include=path
+
+ select the CUPS include directory location
+
+
+
+
--with-debug-level=level
+
+ select the debug information level of release,
+ fastdebug, or slowdebug
+
+
+
+
--with-dev-kit=path
+
+ select location of the compiler install or
+ developer install location
+
+
+
+
--with-dxsdk=path
+
+ select location of the Windows Direct X SDK install
+
+ The Microsoft DirectX 9.0 SDK
+ header files and libraries
+ from the Summer 2004 edition
+ are required for building OpenJDK.
+ This SDK can be downloaded from
+
+ Microsoft DirectX 9.0 SDK (Summer 2004).
+ If the link above becomes obsolete, the SDK can be found from
+ the Microsoft Download Site
+ (search with "DirectX 9.0 SDK Update Summer 2004").
+ Installation usually will set the environment variable
+ DXSDK_DIR to it's install location.
+
+
+
+
--with-freetype=path
+
+ select the freetype files to use.
+
+ Expecting the
+ freetype libraries under
+ lib/ and the
+ headers under include/.
+
+ Version 2.3 or newer of FreeType is required.
+ On Unix systems required files can be available as part of your
+ distribution (while you still may need to upgrade them).
+ Note that you need development version of package that
+ includes both the FreeType library and header files.
+
+ You can always download latest FreeType version from the
+ FreeType website.
+
+ Building the freetype 2 libraries from scratch is also possible,
+ however on Windows refer to the
+
+ Windows FreeType DLL build instructions.
+
+ Note that by default FreeType is built with byte code hinting
+ support disabled due to licensing restrictions.
+ In this case, text appearance and metrics are expected to
+ differ from Sun's official JDK build.
+ See
+
+ the SourceForge FreeType2 Home Page
+
+ for more information.
+
+
+
+
--with-import-hotspot=path
+
+ select the location to find hotspot
+ binaries from a previous build to avoid building
+ hotspot
+
+
+
+
--with-target-bits=arg
+
+ select 32 or 64 bit build
+
+
+
+
--with-jvm-variants=variants
+
+ select the JVM variants to build from, comma
+ separated list that can include:
+ server, client, kernel, zero and zeroshark
+
+
+
+
--with-memory-size=size
+
+ select the RAM size that GNU make will think
+ this system has
+
+ select the msvcr100.dll
+ file to include in the
+ Windows builds (C/C++ runtime library for
+ Visual Studio).
+
+ This is usually picked up automatically
+ from the redist
+ directories of Visual Studio 2010.
+
+
+
+
--with-num-cores=cores
+
+ select the number of cores to use (processor
+ count or CPU count)
+
+
+
+
--with-x=path
+
+ select the location of the X11 and xrender files.
+
+ The
+ XRender Extension Headers
+ are required for building the
+ OpenJDK on Solaris and Linux.
+
+ The Linux header files are usually available from a "Xrender"
+ development package, it's recommended that you try and use
+ the package provided by the particular distribution of Linux that
+ you are using.
+
+ The Solaris XRender header files is
+ included with the other X11 header files
+ in the package SFWxwinc
+ on new enough versions of
+ Solaris and will be installed in
+ /usr/X11/include/X11/extensions/Xrender.h or
+ /usr/openwin/share/include/X11/extensions/Xrender.h
+
+ The basic invocation of the make utility
+ looks like:
+
+ make all
+
+ This will start the build to the output directory containing the
+ "configuration" that was created by the configure
+ script. Run make help for more information on
+ the available targets.
+
+ There are some of the make targets that
+ are of general interest:
+
+
+
+
Make Target
+
Description
+
+
+
+
+
empty
+
build everything but no images
+
+
+
all
+
build everything including images
+
+
+
all-conf
+
build all configurations
+
+
+
images
+
create complete j2sdk and j2re images
+
+
+
install
+
install the generated images locally,
+ typically in /usr/local
+
+
+
clean
+
remove all files generated by make,
+ but not those generated by configure
+
+
+
dist-clean
+
remove all files generated by both
+ and configure (basically killing the configuration)
+
+
+
help
+
give some help on using make,
+ including some interesting make targets
+ When the build is completed, you should see the generated
+ binaries and associated files in the j2sdk-image
+ directory in the output directory.
+ In particular, the
+ build/*/images/j2sdk-image/bin
+ directory should contain executables for the
+ OpenJDK tools and utilities for that configuration.
+ The testing tool jtreg will be needed
+ and can be found at:
+
+ the jtreg site.
+ The provided regression tests in the repositories
+ can be run with the command:
+
+ cd test && make PRODUCT_HOME=`pwd`/../build/*/images/j2sdk-image all
+
+ Q: The configure file looks horrible!
+ How are you going to edit it?
+
+ A: The configure file is generated (think
+ "compiled") by the autoconf tools. The source code is
+ in configure.ac various .m4 files in common/autoconf,
+ which are
+ much more readable.
+ Q:
+ Why is the configure file checked in,
+ if it is generated?
+
+ A:
+ If it was not generated, every user would need to have the autoconf
+ tools installed, and re-generate the configure file
+ as the first step.
+ Our goal is to minimize the work needed to be done by the user
+ to start building OpenJDK, and to minimize
+ the number of external dependencies required.
+
+
+
+ Q:
+ Do you require a specific version of autoconf for regenerating
+ configure?
+
+ A:
+ Currently, no, but this will likely be the case when things have
+ settled down a bit more. (The reason for this is to avoid
+ large spurious changes in configure
+ in commits that made small changes to configure.ac).
+
+
+
+ Q:
+ What are the files in common/makefiles/support/* for?
+ They look like gibberish.
+
+ A:
+ They are a somewhat ugly hack to compensate for command line length
+ limitations on certain platforms (Windows, Solaris).
+ Due to a combination of limitations in make and the shell,
+ command lines containing too many files will not work properly.
+ These
+ helper files are part of an elaborate hack that will compress the
+ command line in the makefile and then uncompress it safely.
+ We're
+ not proud of it, but it does fix the problem.
+ If you have any better suggestions, we're all ears! :-)
+
+
+
+ Q:
+ I want to see the output of the commands that make runs,
+ like in the old build. How do I do that?
+
+ A:
+ You specify the LOG variable to make. There are
+ several log levels:
+
-
+
- The JAXP or JAX-WS team prepares a new zip bundle,
- places a copy in a public download area on java.net,
- sends us a link and a list of CRs (Change Request Numbers).
- The older download bundles should not be deleted.
- It is the responsibility of the JAXP and JAX-WS team to
- place the proper GPL legal notices on the sources
- and do any filtering or java re-packaging for the
- OpenJDK instances of these classes.
+ warn — Default and very quiet.
- The OpenJDK team copies this new bundle into shared
- area (e.g. /java/devtools/share/jdk8-drops).
- Older bundles are never deleted so we retain the history.
+ info — Shows more progress information
+ than warn.
- The OpenJDK team edits the ant property file
- jaxp/jaxp.properties or
- jaxws/jaxws.properties to update the
- base URL, the zip bundle name, and the MD5 checksum
- of the zip bundle
- (on Solaris: sum -c md5 bundlename)
+ debug — Echos all command lines and
+ prints all macro calls for compilation definitions.
- OpenJDK team reviews and commits those changes with the
- given CRs.
+ trace — Echos all $(shell) command
+ lines as well.
- The ant scripts that build jaxp and jaxws
- will attempt to locate these zip bundles from the directory
- in the environment variable
- ALT_DROPS_DIR.
- The checksums protect from getting the wrong, corrupted, or
- improperly modified sources.
- Once the sources are made available, the population will not
- happen again unless a make clobber is requested
- or the jaxp/drop/ or jaxws/drop/
- directory is explicitly deleted.
-
- NOTE: The default Makefile and ant script behavior
- is to NOT download these bundles from the public http site.
- In general, doing downloads
- during the build process is not advised, it creates too much
- unpredictability in the build process.
- However, you can use make ALLOW_DOWNLOADS=true to
- tell the ant script that the download of the zip bundle is
- acceptable.
-
-
- The recommended procedure for keeping a cache of these
- source bundles would be to download them once, place them
- in a directory outside the repositories, and then set
- ALT_DROPS_DIR to refer
- to that directory.
- These drop bundles do change occasionally, so the newer
- bundles may need to be added to this area from time to time.
-
-
+
+ Q:
+ When do I have to re-run configure?
+
+ A:
+ Normally you will run configure only once for creating a
+ configuration.
+ You need to re-run configuration only if you want to change any
+ configuration options,
+ or if you pull down changes to the configure script.
+
+
+
+ Q:
+ I have added a new source file. Do I need to modify the makefiles?
+
+ A:
+ Normally, no. If you want to create e.g. a new native
+ library,
+ you will need to modify the makefiles. But for normal file
+ additions or removals, no changes are needed. There are certan
+ exceptions for some native libraries where the source files are spread
+ over many directories which also contain courses for other
+ libraries. In these cases it was simply easier to create include lists
+ rather thane excludes.
+
+
+
+ Q:
+ When I run configure --help, I see many strange options,
+ like --dvidir. What is this?
+
+ A:
+ Configure provides a slew of options by default, to all projects
+ that use autoconf. Most of them are not used in OpenJDK,
+ so you can safely ignore them. To list only OpenJDK specific features,
+ use configure --help=short instead.
+
+
+
+ Q:
+ configure provides OpenJDK-specific features such as
+ --enable-jigsaw or --with-builddeps-server
+ that are not described in this document. What about those?
+
+ A:
+ Try them out if you like! But be aware that most of these are
+ experimental features.
+ Many of them don't do anything at all at the moment; the option
+ is just a placeholder. Other depends on
+ pieces of code or infrastructure that is currently
+ not ready for prime time.
+
+
+
+ Q:
+ How will you make sure you don't break anything?
+
+ A:
+ We have a script that compares the result of the new build system
+ with the result of the old. For most part, we aim for (and achieve)
+ byte-by-byte identical output. There are however technical issues
+ with e.g. native binaries, which might differ in a byte-by-byte
+ comparison, even
+ when building twice with the old build system.
+ For these, we compare relevant aspects
+ (e.g. the symbol table and file size).
+ Note that we still don't have 100%
+ equivalence, but we're close.
+
+
+
+ Q:
+ I noticed this thing X in the build that looks very broken by design.
+ Why don't you fix it?
+
+ A:
+ Our goal is to produce a build output that is as close as
+ technically possible to the old build output.
+ If things were weird in the old build,
+ they will be weird in the new build.
+ Often, things were weird before due to obscurity,
+ but in the new build system the weird stuff comes up to the surface.
+ The plan is to attack these things at a later stage,
+ after the new build system is established.
+
+
+
+ Q:
+ The code in the new build system is not that well-structured.
+ Will you fix this?
+
+ A:
+ Yes! The new build system has grown bit by bit as we converted
+ the old system. When all of the old build system is converted,
+ we can take a step back and clean up the structure of the new build
+ system. Some of this we plan to do before replacing the old build
+ system and some will need to wait until after.
+
+
+
+ Q: What is @GenerateNativeHeaders?
+
+ A:
+ To speed up compilation, we added a flag to javac which makes it
+ do the job of javah as well, as a by-product; that is, generating
+ native .h header files. These files are only generated
+ if a class contains native methods. However, sometimes
+ a class contains no native method,
+ but still contains constants that native code needs to use.
+ The new GenerateNativeHeaders annotation tells javac to
+ force generation of a
+ header file in these cases. (We don't want to generate
+ native headers for all classes that contains constants
+ but no native methods, since
+ that would slow down the compilation process needlessly.)
+
+
+
+ Q:
+ Is anything able to use the results of the new build's default make target?
+
+ A:
+ Yes, this is the minimal (or roughly minimal)
+ set of compiled output needed for a developer to actually
+ execute the newly built JDK. The idea is that in an incremental
+ development fashion, when doing a normal make,
+ you should only spend time recompiling what's changed
+ (making it purely incremental) and only do the work that's
+ needed to actually run and test your code.
+ The packaging stuff that is part of the images
+ target is not needed for a normal developer who wants to
+ test his new code. Even if it's quite fast, it's still unnecessary.
+ We're targeting sub-second incremental rebuilds! ;-)
+ (Or, well, at least single-digit seconds...)
+
+
+
+ Q:
+ I usually set a specific environment variable when building,
+ but I can't find the equivalent in the new build.
+ What should I do?
+
+ A:
+ It might very well be that we have missed to add support for
+ an option that was actually used from outside the build system.
+ Email us and we will
+ add support for it!
+
- Building the OpenJDK
- is done with a GNU make command line
- and various
- environment or make variable settings that direct the makefile rules
- to where various components have been installed.
- Where possible the makefiles will attempt to located the various
- components in the default locations or any component specific
- variable settings.
- When the normal defaults fail or components cannot be found,
- the various
- ALT_* variables (alternates)
- can be used to help the makefiles locate components.
-
- Refer to the bash/sh/ksh setup file
- jdk/make/jdk_generic_profile.sh
- if you need help in setting up your environment variables.
- A build could be as simple as:
+
+
- bash
- . jdk/make/jdk_generic_profile.sh
- make sanity && make
-
+
+
Building OpenJDK requires a lot of horsepower.
+ Some of the build tools can be adjusted to utilize more or less
+ of resources such as
+ parallel threads and memory.
+ The configure script analyzes your system and selects reasonable
+ values for such options based on your hardware.
+ If you encounter resource problems, such as out of memory conditions,
+ you can modify the detected values with:
+
+
+
+ --with-num-cores
+ —
+ number of cores in the build system,
+ e.g. --with-num-cores=8
+
+
+ --with-memory-size
+ — memory (in MB) available in the build system,
+ e.g. --with-memory-size=1024
+
+
+
+
It might also be necessary to specify the JVM arguments passed
+ to the Bootstrap JDK, using e.g.
+ --with-boot-jdk-jvmargs="-Xmx8G -enableassertions".
+ Doing this will override the default JVM arguments
+ passed to the Bootstrap JDK.
+
+
+
One of the top goals of the new build system is to improve the
+ build performance and decrease the time needed to build. This will
+ soon also apply to the java compilation when the Smart Javac wrapper
+ is making its way into jdk8. It can be tried in the build-infra
+ repository already. You are likely to find that the new build system
+ is faster than the old one even without this feature.
+
+
At the end of a successful execution of configure,
+ you will get a performance summary,
+ indicating how well the build will perform. Here you will
+ also get performance hints.
+ If you want to build fast, pay attention to those!
+
+
Building with ccache
+
+
A simple way to radically speed up compilation of native code
+ (typically hotspot and native libraries in JDK) is to install
+ ccache. This will cache and reuse prior compilation results, if the
+ source code is unchanged. However, ccache versions prior to 3.1.4
+ does not work correctly with the precompiled headers used in
+ OpenJDK. So if your platform supports ccache at 3.1.4 or later, we
+ highly recommend installing it. This is currently only supported on
+ linux.
+
+
Building on local disk
+
+
If you are using network shares, e.g. via NFS, for your source code,
+ make sure the build directory is situated on local disk.
+ The performance
+ penalty is extremely high for building on a network share,
+ close to unusable.
+
+
Building only one JVM
+
+
The old build builds multiple JVMs on 32-bit systems (client and
+ server; and on Windows kernel as well). In the new build we have
+ changed this default to only build server when it's available. This
+ improves build times for those not interested in multiple JVMs. To
+ mimic the old behavior on platforms that support it,
+ use --with-jvm-variants=client,server.
+
+
Selecting the number of cores to build on
+
+
By default, configure will analyze your machine and run the make
+ process in parallel with as many threads as you have cores. This
+ behavior can be overridden, either "permanently" (on a configure
+ basis) using --with-num-cores=N or for a single build
+ only (on a make basis), using make JOBS=N.
+
+
If you want to make a slower build just this time, to save some CPU
+ power for other processes, you can run
+ e.g. make JOBS=2. This will force the makefiles
+ to only run 2 parallel processes, or even make JOBS=1
+ which will disable parallelism.
+
+
If you want to have it the other way round, namely having slow
+ builds default and override with fast if you're
+ impatient, you should call configure with
+ --with-num-cores=2, making 2 the default.
+ If you want to run with more
+ cores, run make JOBS=8
+
-
- Of course ksh or sh would work too.
- But some customization will probably be necessary.
- The sanity rule will make some basic checks on build
- dependencies and generate appropriate warning messages
- regarding missing, out of date, or newer than expected components
- found on your system.
-
+ If the build fails (and it's not due to a compilation error in
+ a source file you've changed), the first thing you should do
+ is to re-run the build with more verbosity.
+ Do this by adding LOG=debug to your make command line.
+
+ The build log (with both stdout and stderr intermingled,
+ basically the same as you see on your console) can be found as
+ build.log in your build directory.
+
+ You can ask for help on build problems with the new build system
+ on either the
+
+ build-dev
+ or the
+
+ build-infra-dev
+ mailing lists. Please include the relevant parts
+ of the build log.
+
+ A build can fail for any number of reasons.
+ Most failures
+ are a result of trying to build in an environment in which all the
+ pre-build requirements have not been met.
+ The first step in
+ troubleshooting a build failure is to recheck that you have satisfied
+ all the pre-build requirements for your platform.
+ Scanning the configure log is a good first step, making
+ sure that what it found makes sense for your system.
+ Look for strange error messages or any difficulties that
+ configure had in finding things.
+
+ Some of the more common problems with builds are briefly
+ described
+ below, with suggestions for remedies.
+
+
+ Corrupted Bundles on Windows:
+
+ Some virus scanning software has been known to
+ corrupt the
+ downloading of zip bundles.
+ It may be necessary to disable the 'on access' or
+ 'real time'
+ virus scanning features to prevent this corruption.
+ This type of "real time" virus scanning can also
+ slow down the
+ build process significantly.
+ Temporarily disabling the feature, or excluding the build
+ output directory may be necessary to get correct and
+ faster builds.
+
+
+
+ Slow Builds:
+
+ If your build machine seems to be overloaded from too many
+ simultaneous C++ compiles, try setting the
+ JOBS=1 on the make command line.
+ Then try increasing the count slowly to an acceptable
+ level for your system. Also:
+
+ Creating the javadocs can be very slow,
+ if you are running
+ javadoc, consider skipping that step.
+
+ Faster CPUs, more RAM, and a faster DISK usually helps.
+ The VM build tends to be CPU intensive
+ (many C++ compiles),
+ and the rest of the JDK will often be disk intensive.
+
+ Faster compiles are possible using a tool called
+ ccache.
+
+
+
+
+ File time issues:
+
+ If you see warnings that refer to file time stamps, e.g.
+
+ Warning message:
+ File `xxx' has modification time in
+ the future.
+
+ Warning message: Clock skew detected.
+ Your build may
+ be incomplete.
+
+ These warnings can occur when the clock on the build
+ machine is out of
+ sync with the timestamps on the source files.
+ Other errors, apparently
+ unrelated but in fact caused by the clock skew,
+ can occur along with
+ the clock skew warnings.
+ These secondary errors may tend to obscure the
+ fact that the true root cause of the problem
+ is an out-of-sync clock.
+
+ If you see these warnings, reset the clock on the
+ build
+ machine, run "gmake clobber"
+ or delete the directory
+ containing the build output, and restart the
+ build from the beginning.
+
+
+
+ Error message:
+ Trouble writing out table to disk
+
+ Increase the amount of swap space on your build machine.
+ This could be caused by overloading the system and
+ it may be necessary to use:
+
+ make JOBS=1
+
+ to reduce the load on the system.
+
+
+
+ Error Message:
+ libstdc++ not found:
+
+ This is caused by a missing libstdc++.a library.
+ This is installed as part of a specific package
+ (e.g. libstdc++.so.devel.386).
+ By default some 64-bit Linux versions (e.g. Fedora)
+ only install the 64-bit version of the libstdc++ package.
+ Various parts of the JDK build require a static
+ link of the C++ runtime libraries to allow for maximum
+ portability of the built images.
+
+
+
+ Linux Error Message:
+ cannot restore segment prot after reloc
+
+ This is probably an issue with SELinux (See
+
+ http://en.wikipedia.org/wiki/SELinux).
+ Parts of the VM is built without the -fPIC for
+ performance reasons.
+
+ To completely disable SELinux:
+
+
$ su root
+
# system-config-securitylevel
+
In the window that appears, select the SELinux tab
+
Disable SELinux
+
+
+ Alternatively, instead of completely disabling it you could
+ disable just this one check.
+
+
Select System->Administration->SELinux Management
+
In the SELinux Management Tool which appears,
+ select "Boolean" from the menu on the left
+
Expand the "Memory Protection" group
+
Check the first item, labeled
+ "Allow all unconfined executables to use
+ libraries requiring text relocation ..."
+
+
+
+
+ Windows Error Messages:
+
+ *** fatal error - couldn't allocate heap, ...
+
+ rm fails with "Directory not empty"
+
+ unzip fails with "cannot create ... Permission denied"
+
+ unzip fails with "cannot create ... Error 50"
+
+
+ Try rebooting the system, or there could be some kind of
+ issue with the disk or disk partition being used.
+ Sometimes it comes with a "Permission Denied" message.
+
+
The Makefiles in the OpenJDK are only valid when used with the
- GNU version of the utility command make
- (gmake).
+ GNU version of the utility command make
+ (usually called gmake on Solaris).
A few notes about using GNU make:
You need GNU make version 3.81 or newer.
+ If the GNU make utility on your systems is not
+ 3.81 or newer,
+ see "Building GNU make".
- Place the location of the GNU make binary in the PATH.
-
-
- Linux:
- The /usr/bin/make should be 3.81 or newer
- and should work fine for you.
- If this version is not 3.81 or newer,
- see the "Building GNU make" section.
+ Place the location of the GNU make binary in the
+ PATH.
Solaris:
- Do NOT use /usr/bin/make on Solaris.
+ Do NOT use /usr/bin/make on Solaris.
If your Solaris system has the software
- from the Solaris Companion CD installed,
- you should try and use gmake
- which will be located in either the /opt/sfw/bin or
- /usr/sfw/bin directory.
- In more recent versions of Solaris GNU make might be found
- at /usr/bin/gmake.
- NOTE: It is very likely that this gmake
- could be 3.80, you need 3.81, in which case,
- see the "Building GNU make" section.
+ from the Solaris Developer Companion CD installed,
+ you should try and use gmake
+ which will be located in either the
+ /usr/bin, /opt/sfw/bin or
+ /usr/sfw/bin directory.
Windows:
- Make sure you start your build inside a bash/sh/ksh shell and are
- using a make.exe utility built for that environment.
- MKS builds need a native Windows version of GNU make
- (see Building GNU make).
- Cygwin builds need
- a make version which was specially compiled for the Cygwin environment
- (see Building GNU make). WARNING:
- the OpenJDK build with the make utility provided by Cygwin will not
- work because it does not support drive letters in paths. Make sure that
- your version of make will be found before the Cygwins default make by
- setting an appropriate PATH environment variable or by removing
- Cygwin's make after you built your own make version.
- MinGW/MSYS builds can use the default make which
- comes with the environment.
+ Make sure you start your build inside a bash shell.
+
+
+ Mac OS X:
+ The XCode "command line tools" must be installed on your Mac.
- First step is to get the GNU make 3.81 (or newer) source from
+ First step is to get the GNU make 3.81 or newer source from
ftp.gnu.org/pub/gnu/make/.
- Building is a little different depending on the OS and unix toolset
- on Windows:
-
-
- Linux:
- ./configure && make
-
-
- Solaris:
- ./configure && gmake CC=gcc
-
-
- Windows for CYGWIN:
- ./configure
- Add the line #define HAVE_CYGWIN_SHELL 1 to the end of config.h
- make
-
- This should produce make.exe in the current directory.
-
-
- Windows for MKS:
- Edit config.h.W32 and uncomment the line #define HAVE_MKS_SHELL 1
- Set the environment for your native compiler (e.g. by calling:
- "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /Release /xp /x64)
- nmake -f NMakefile.win32
-
- This should produce WinDebug/make.exe and WinRel/make.exe
-
- If you get the error: NMAKE : fatal error U1045: spawn failed : Permission denied
- you have to set the Read & execute permission for the file subproc.bat.
-
-
+ Building is a little different depending on the OS but is
+ basically done with:
+
- i586 only:
- The minimum recommended hardware for building the Linux version
- is a Pentium class processor or better, at least 256 MB of RAM, and
- approximately 1.5 GB of free disk space.
-
- X64 only:
- The minimum recommended hardware for building the Linux
- version is an AMD Opteron class processor, at least 512 MB of RAM, and
- approximately 4 GB of free disk space.
-
- The build will use the tools contained in
- /bin and
- /usr/bin
- of a standard installation of the Linux operating environment.
- You should ensure that these directories are in your
- PATH.
-
- Note that some Linux systems have a habit of pre-populating
- your environment variables for you, for example JAVA_HOME
- might get pre-defined for you to refer to the JDK installed on
- your Linux system.
- You will need to unset JAVA_HOME.
- It's a good idea to run env and verify the
- environment variables you are getting from the default system
- settings make sense for building the
- OpenJDK.
-
- The minimum recommended hardware for building the
- Solaris SPARC version is an UltraSPARC with 512 MB of RAM.
- For building
- the Solaris x86 version, a Pentium class processor or better and at
- least 512 MB of RAM are recommended.
- Approximately 1.4 GB of free disk
- space is needed for a 32-bit build.
-
- If you are building the 64-bit version, you should
- run the command "isainfo -v" to verify that you have a
- 64-bit installation, it should say sparcv9 or
- amd64.
- An additional 7 GB of free disk space is needed
- for a 64-bit build.
-
- The build uses the tools contained in /usr/ccs/bin
- and /usr/bin of a standard developer or full installation of
- the Solaris operating environment.
-
- Solaris patches specific to the JDK can be downloaded from the
-
- SunSolve JDK Solaris patches download page.
- You should ensure that the latest patch cluster for
- your version of the Solaris operating environment has also
- been installed.
-
- i586 only:
- The minimum recommended hardware for building the 32-bit or X86
- Windows version is an Pentium class processor or better, at least
- 512 MB of RAM, and approximately 600 MB of free disk space.
-
- NOTE: The Windows build machines need to use the
- file system NTFS.
- Build machines formatted to FAT32 will not work
- because FAT32 doesn't support case-sensitivity in file names.
-
-
- X64 only:
- The minimum recommended hardware for building
- the Windows X64 version is an AMD Opteron class processor, at least 1
- GB of RAM, and approximately 10 GB of free disk space.
-
- Windows:
- Note that GNU make, the shell and other Unix-tools required during the build
- do not tolerate the Windows habit
- of having spaces in pathnames or the use of the \characters in pathnames.
- Luckily on most Windows systems, you can use /instead of \, and
- there is always a short
- "8.3" pathname without spaces for any path that contains spaces.
- Unfortunately, this short pathname is somewhat dynamic (i.e. dependant on the
- other files and directories inside a given directory) and can not be
- algorithmicly calculated by only looking at a specific path name.
-
- The makefiles will try to translate any pathnames supplied
- to it into the C:/ style automatically.
-
-
- Special care has to be taken if native Windows applications
- like nmake or cl are called with file arguments processed
- by Unix-tools like make or sh!
-
- Building on Windows requires a Unix-like environment, notably a Unix-like shell.
- There are several such environments available of which
- MKS,
- Cygwin and
- MinGW/MSYS are currently supported for
- the OpenJDK build. One of the differences of these three systems is the way
- they handle Windows path names, particularly path names which contain
- spaces, backslashes as path separators and possibly drive letters. Depending
- on the use case and the specifics of each environment these path problems can
- be solved by a combination of quoting whole paths, translating backslashes to
- forward slashes, escaping backslashes with additional backslashes and
- translating the path names to their
- "8.3" version.
-
- As of this writing (MKS ver. 9.4, Cygwin ver. 1.7.9, MinGW/MSYS 1.0.17),
- MKS builds are known to be the fastest Windows builds while MingGW/MSYS
- builds are slightly slower (about 10%) than MKS builds and Cygwin builds
- require nearly twice the time (about 180%) of MKS builds (e.g. on a
- DualCore i7 notebook with 8GB of RAM, HDD and 64-bit Windows 7 operating system
- the complete OpenJDK 8 product build takes about 49min with MKS, 54min with
- MinGW/MSYS and 88min with Cygwin).
-
-
- Mixing tools from the different Unix emulation environments is not a good
- idea and will probably not work!
-
-
- MKS: is a commercial product which includes
- all the Unix utilities which are required to build the OpenJDK except GNU
- make. In pre-OpenJDK times it was the only supported build environment on
- Windows. The MKS tools support Windows paths with drive letters and
- forward slashes as path separator. Paths in environment variables like (for
- example) PATH are separated by semicolon ';'.
-
-
- Recent versions of MKS provide the dosname utility to convert paths
- with spaces to short (8.3) path names,e .g.
- dosname -s "path".
-
- Cygwin:
- is an open source, Linux-like environment which tries to emulate
- a complete POSIX layer on Windows. It tries to be smart about path names
- and can usually handle all kinds of paths if they are correctly quoted
- or escaped although internally it maps drive letters <drive>:
- to a virtual directory /cygdrive/<drive>.
-
-
- You can always use the cygpath utility to map pathnames with spaces
- or the backslash character into the C:/ style of pathname
- (called 'mixed'), e.g. cygpath -s -m "path".
-
-
- Note that the use of CYGWIN creates a unique problem with regards to
- setting PATH. Normally on Windows
- the PATH variable contains directories
- separated with the ";" character (Solaris and Linux use ":").
- With CYGWIN, it uses ":", but that means that paths like "C:/path"
- cannot be placed in the CYGWIN version of PATH and
- instead CYGWIN uses something like /cygdrive/c/path
- which CYGWIN understands, but only CYGWIN understands.
-
-
- If you are using the Cygwin environment, you need to
- compile your own version
- of GNU make because the default Cygwin make can not handle drive letters in paths.
-
-
- MinGW/MSYS:
- MinGW ("Minimalist GNU for Windows") is a collection of free Windows
- specific header files and import libraries combined with GNU toolsets that
- allow one to produce native Windows programs that do not rely on any
- 3rd-party C runtime DLLs. MSYS is a supplement to MinGW which allows building
- applications and programs which rely on traditional UNIX tools to
- be present. Among others this includes tools like bash and make.
-
-
- Like Cygwin, MinGW/MSYS can handle different types of path formats. They
- are internally converted to paths with forward slashes and drive letters
- <drive>: replaced by a virtual
- directory /<drive>. Additionally, MSYS automatically
- detects binaries compiled for the MSYS environment and feeds them with the
- internal, Unix-style path names. If native Windows applications are called
- from within MSYS programs their path arguments are automatically converted
- back to Windows style path names with drive letters and backslashes as
- path separators. This may cause problems for Windows applications which
- use forward slashes as parameter separator (e.g. cl /nologo /I)
- because MSYS may wrongly
- replace such parameters by drive letters.
-
-
- If you are using the MinGW/MSYS system you can use the default make
- version supplied by the environment.
-
- X64 only:
- The minimum recommended hardware for building
- the Mac OS X version is any 64-bit capable Intel processor, at least 2
- GB of RAM, and approximately 3 GB of free disk space. You should also
- have OS X Lion 10.7.3 installed.
-
- Install XCode 4.1 or newer.
- If you install XCode 4.3 or newer, make sure you also install
- "Command line tools" found under the preferences pane "Downloads".
-
- Depending on the platform, the OpenJDK build process has some basic
- dependencies on components not part of the OpenJDK sources.
- Some of these are specific to a platform, some even specific to
- an architecture.
- Each dependency will have a set of ALT variables that can be set
- to tell the makefiles where to locate the component.
- In most cases setting these ALT variables may not be necessary
- and the makefiles will find defaults on the system in standard
- install locations or through component specific variables.
-
-
- All OpenJDK builds require access to the previously released
- JDK 6, this is often called a bootstrap JDK.
- The JDK 6 binaries can be downloaded from Sun's
- JDK 6 download site.
- For build performance reasons
- is very important that this bootstrap JDK be made available on the
- local disk of the machine doing the build.
- You should always set
- ALT_BOOTDIR
- to point to the location of
- the bootstrap JDK installation, this is the directory pathname
- that contains a bin, lib, and include
- It's also a good idea to also place its bin directory
- in the PATH environment variable, although it's
- not required.
+ This file often describes specific requirements for what we
+ call the
+ "minimum build environments" (MBE) for this
+ specific release of the JDK.
+ What is listed below is what the Oracle Release
+ Engineering Team will use to build the Oracle JDK product.
+ Building with the MBE will hopefully generate the most compatible
+ bits that install on, and run correctly on, the most variations
+ of the same base OS and hardware architecture.
+ In some cases, these represent what is often called the
+ least common denominator, but each Operating System has different
+ aspects to it.
- Solaris:
- Some pre-installed JDK images may be available to you in the
- directory /usr/jdk/instances.
- If you don't set
- ALT_BOOTDIR
- the makefiles will look in that location for a JDK it can use.
+ In all cases, the Bootstrap JDK version minimum is critical,
+ we cannot guarantee builds will work with older Bootstrap JDK's.
+ Also in all cases, more RAM and more processors is better,
+ the minimums listed below are simply recommendations.
+
+ With Solaris and Mac OS X, the version listed below is the
+ oldest release we can guarantee builds and works, and the
+ specific version of the compilers used could be critical.
+
+ With Windows the critical aspect is the Visual Studio compiler
+ used, which due to it's runtime, generally dictates what Windows
+ systems can do the builds and where the resulting bits can
+ be used.
+ NOTE: We expect a change here off these older Windows OS releases
+ and to a 'less older' one, probably Windows 2008R2 X64.
+
+ With Linux, it was just a matter of picking a
+ stable distribution that is a good representative for Linux
+ in general.
+ NOTE: We expect a change here from Fedora 9 to something else,
+ but it has not been completely determined yet, possibly
+ Ubuntu 12.04 X64, unbiased community feedback would be welcome on
+ what a good choice would be here.
+
+ It is understood that most developers will NOT be using these
+ specific versions, and in fact creating these specific versions
+ may be difficult due to the age of some of this software.
+ It is expected that developers are more often using the more
+ recent releases and distributions of these operating systems.
+
+ Compilation problems with newer or different C/C++ compilers is a
+ common problem.
+ Similarly, compilation problems related to changes to the
+ /usr/include or system header files is also a
+ common problem with older, newer, or unreleased OS versions.
+ Please report these types of problems as bugs so that they
+ can be dealt with accordingly.
+
+
+
+
+
Base OS and Architecture
+
OS
+
C/C++ Compiler
+
Bootstrap JDK
+
Processors
+
RAM Minimum
+
DISK Needs
+
+
+
+
+
Linux X86 (32-bit) and X64 (64-bit)
+
Fedora 9
+
gcc 4.3
+
JDK 7u7
+
2 or more
+
1 GB
+
6 GB
+
+
+
Solaris SPARC (32-bit) and SPARCV9 (64-bit)
+
Solaris 10 Update 6
+
Studio 12 Update 1 + patches
+
JDK 7u7
+
4 or more
+
4 GB
+
8 GB
+
+
+
Solaris X86 (32-bit) and X64 (64-bit)
+
Solaris 10 Update 6
+
Studio 12 Update 1 + patches
+
JDK 7u7
+
4 or more
+
4 GB
+
8 GB
+
+
+
Windows X86 (32-bit)
+
Windows XP
+
Microsoft Visual Studio C++ 2010 Professional Edition
+
JDK 7u7
+
2 or more
+
2 GB
+
6 GB
+
+
+
Windows X64 (64-bit)
+
Windows Server 2003 - Enterprise x64 Edition
+
Microsoft Visual Studio C++ 2010 Professional Edition
- The ALT_JDK_IMPORT_PATH
- setting is only needed if you are not building the entire
- JDK. For example, if you have built the entire JDK once, and
- wanted to avoid repeatedly building the Hotspot VM, you could
- set this to the location of the previous JDK install image
- and the build will copy the needed files from this import area.
+ We won't be listing all the possible environments, but
+ we will try to provide what information we have available to us.
+
+ NOTE: The community can help out by updating
+ this part of the document.
+
+
+
+ After installing the latest
+ Fedora
+ you need to install several build dependencies.
+ The simplest way to do it is to execute the
+ following commands as user root:
+
+ After installing
+ CentOS 5.5
+ you need to make sure you have
+ the following Development bundles installed:
+
+
+
Development Libraries
+
Development Tools
+
Java Development
+
X Software Development (Including XFree86-devel)
+
+
+
+ Plus the following packages:
+
+
+
cups devel: Cups Development Package
+
alsa devel: Alsa Development Package
+
Xi devel: libXi.so Development Package
+
+
+
+ The freetype 2.3 packages don't seem to be available,
+ but the freetype 2.3 sources can be downloaded, built,
+ and installed easily enough from
+
+ the freetype site.
+ Build and install with something like:
+
+ bash ./configure
+
+ make
+
+ sudo -u root make install
+
+
+ Mercurial packages could not be found easily, but a Google
+ search should find ones, and they usually include Python if
+ it's needed.
+
+ After installing Debian 5
+ you need to install several build dependencies.
+ The simplest way to install the build dependencies is to
+ execute the following commands as user root:
+
+ After installing OpenSUSE 11.1
+ you need to install several build dependencies.
+ The simplest way to install the build dependencies is to
+ execute the following commands:
+
+ After installing Mandriva
+ Linux One 2009 Spring
+ you need to install several build dependencies.
+ The simplest way to install the build dependencies is to
+ execute the following commands as user root:
+
+ urpmi java-1.7.0-openjdk-devel make gcc gcc-c++
+ freetype-devel zip unzip libcups2-devel libxrender1-devel
+ libalsa2-devel libstc++-static-devel libxtst6-devel
+ libxi-devel
+
+
+ In addition, it is necessary to set a few environment
+ variables for the build:
+
+ After installing OpenSolaris 2009.06
+ you need to install several build dependencies.
+ The simplest way to install the build dependencies is to
+ execute the following commands:
+
- All OpenJDK builds require access to least Ant 1.7.1.
- The Ant tool is available from the
-
- Ant 1.7.1 archive download site.
- You should always make sure ant is in your PATH, and
- on Windows you may also need to set
- ANT_HOME
- to point to the location of
- the Ant installation, this is the directory pathname
- that contains a bin and lib.
+
+
- See
- http://en.wikipedia.org/wiki/Certificate_Authority
- for a better understanding of the Certificate Authority (CA).
- A certificates file named "cacerts"
- represents a system-wide keystore with CA certificates.
- In JDK and JRE
- binary bundles, the "cacerts" file contains root CA certificates from
- several public CAs (e.g., VeriSign, Thawte, and Baltimore).
- The source contain a cacerts file
- without CA root certificates.
- Formal JDK builders will need to secure
- permission from each public CA and include the certificates into their
- own custom cacerts file.
- Failure to provide a populated cacerts file
- will result in verification errors of a certificate chain during runtime.
- The variable
- ALT_CACERTS_FILE
- can be used to override the default location of the
- cacerts file that will get placed in your build.
- By default an empty cacerts file is provided and that should be
- fine for most JDK developers.
-
- At a minimum, the
-
- Sun Studio 12 Update 1 Compilers
- (containing version 5.10 of the C and C++ compilers) is required,
- including specific patches.
-
- The Solaris SPARC patch list is:
-
-
- 118683-05: SunOS 5.10: Patch for profiling libraries and assembler
-
-
- 119963-21: SunOS 5.10: Shared library patch for C++
-
- 141858-06: Sun Studio 12 Update 1_x86: Sun Compiler Common patch for x86 backend
-
-
- 128229-09: Sun Studio 12 Update 1_x86: Patch for C++ Compiler
-
-
- 142363-05: Sun Studio 12 Update 1_x86: Patch for C Compiler
-
-
- 142368-01: Sun Studio 12.1_x86: Patch for Performance Analyzer Tools
-
-
-
- Set
- ALT_COMPILER_PATH
- to point to the location of
- the compiler binaries, and place this location in the PATH.
-
- The Oracle Solaris Studio Express compilers at:
-
- Oracle Solaris Studio Express Download site
- are also an option, although these compilers have not
- been extensively used yet.
-
- BEGIN WARNING: JDK 7 has transitioned to
- use the newest VS2010 Microsoft compilers.
- No other compilers are known to build the entire JDK,
- including non-open portions.
- Visual Studio 2010 Express compilers are now able to build all the
- open source repositories, but this is 32 bit only. To build 64 bit
- Windows binaries use the the 7.1 Windows SDK.
- END WARNING.
-
- The 32-bit OpenJDK Windows build requires
- Microsoft Visual Studio C++ 2010 (VS2010) Professional
- Edition or Express compiler.
- The compiler and other tools are expected to reside
- in the location defined by the variable
- VS100COMNTOOLS which
- is set by the Microsoft Visual Studio installer.
-
- Once the compiler is installed,
- it is recommended that you run VCVARS32.BAT
- to set the compiler environment variables
- INCLUDE,
- LIB, and
- PATH
- prior to building the
- OpenJDK.
- The above environment variables MUST be set.
- This compiler also contains the Windows SDK v 7.0a,
- which is an update to the Windows 7 SDK.
-
- WARNING: Make sure you check out the
- CYGWIN link.exe WARNING.
- The path /usr/bin must be after the path to the
- Visual Studio product.
-
- For X64, the set up is much the same as 32 bit
- except that you run amd64\VCVARS64.BAT
- to set the compiler environment variables.
- Previously 64 bit builds had to use the 64 bit compiler in
- an unbundled Windows SDK but this is no longer necessary if
- you have VS2010 Professional.
-
- What was tested is just directly setting up LIB, INCLUDE,
- PATH and based on the installation directories using the
- DOS short name appropriate for the system, (you will
- need to set them for yours, not just blindly copy this) eg :
-
- set VSINSTALLDIR=c:\PROGRA~2\MICROS~1.0
- set WindowsSdkDir=c:\PROGRA~1\MICROS~1\Windows\v7.1
- set PATH=%VSINSTALLDIR%\vc\bin\amd64;%VSINSTALLDIR%\Common7\IDE;%WindowsSdkDir%\bin;%PATH%
- set INCLUDE=%VSINSTALLDIR%\vc\include;%WindowsSdkDir%\include
- set LIB=%VSINSTALLDIR%\vc\lib\amd64;%WindowsSdkDir%\lib\x64
-
- Version 2.2 (November 3rd 1997) or newer of the zip utility
- and version 5.12 or newer of the unzip utility is needed
- to build the JDK.
- With Solaris, Linux, and Windows CYGWIN, the zip and unzip
- utilities installed on the system should be fine.
- Information and the source code for
- ZIP.EXE and UNZIP.EXE is available on the
- info-zip web site.
-
- Solaris:
- CUPS header files are required for building the
- OpenJDK on Solaris.
- The Solaris header files can be obtained by installing
- the package SFWcups from the Solaris Software
- Companion CD/DVD, these often will be installed into
- /opt/sfw/cups.
-
- Linux:
- CUPS header files are required for building the
- OpenJDK on Linux.
- The Linux header files are usually available from a "cups"
- development package, it's recommended that you try and use
- the package provided by the particular version of Linux that
- you are using.
-
- The CUPS header files can always be downloaded from
- www.cups.org.
- The variable
- ALT_CUPS_HEADERS_PATH
- can be used to override the default location of the
- CUPS Header files.
-
- Solaris:
- XRender header files are required for building the
- OpenJDK on Solaris.
- The XRender header file is included with the other X11 header files
- in the package SFWxwinc on new enough versions of
- Solaris and will be installed in
- /usr/X11/include/X11/extensions/Xrender.h or
- /usr/openwin/share/include/X11/extensions/Xrender.h
-
- Linux:
- XRender header files are required for building the
- OpenJDK on Linux.
- The Linux header files are usually available from a "Xrender"
- development package, it's recommended that you try and use
- the package provided by the particular distribution of Linux that
- you are using.
-
- Version 2.3 or newer of FreeType is required for building the OpenJDK.
- On Unix systems required files can be available as part of your
- distribution (while you still may need to upgrade them).
- Note that you need development version of package that
- includes both FreeType library and header files.
-
- You can always download latest FreeType version from the
- FreeType website.
-
- Makefiles will try to pick FreeType from /usr/lib and /usr/include.
- In case it is installed elsewhere you will need to set environment
- variables
- ALT_FREETYPE_LIB_PATH
- and
- ALT_FREETYPE_HEADERS_PATH
- to refer to place where library and header files are installed.
-
- Note that by default FreeType is built with byte code hinting
- support disabled due to licensing restrictions.
- In this case, text appearance and metrics are expected to
- differ from Sun's official JDK build.
- See
-
- the SourceForge FreeType2 Home Page
-
- for more information.
-
- Linux only:
- Version 0.9.1 or newer of the ALSA files are
- required for building the OpenJDK on Linux.
- These Linux files are usually available from an "alsa"
- of "libasound"
- development package, it's highly recommended that you try and use
- the package provided by the particular version of Linux that
- you are using.
- The makefiles will check this emit a sanity error if it is
- missing or the wrong version.
-
- In particular, older Linux systems will likely not have the
- right version of ALSA installed, for example
- Redhat AS 2.1 U2 and SuSE 8.1 do not include a sufficiently
- recent ALSA distribution.
- On rpm-based systems, you can see if ALSA is installed by
- running this command:
-
- rpm -qa | grep alsa
-
- Both alsa and alsa-devel packages are needed.
-
- If your distribution does not come with ALSA, and you can't
- find ALSA packages built for your particular system,
- you can try to install the pre-built ALSA rpm packages from
-
- www.freshrpms.net.
- Note that installing a newer ALSA could
- break sound output if an older version of ALSA was previously
- installed on the system, but it will enable JDK compilation.
-
- Installation: execute as root
- [i586]: rpm -Uv --force alsa-lib-devel-0.9.1-rh61.i386.rpm
- [x64]: rpm -Uv --force alsa-lib-devel-0.9.8-amd64.x86_64.rpm
- Uninstallation:
- [i586]: rpm -ev alsa-lib-devel-0.9.1-rh61
- [x64]:rpm -ev alsa-lib-devel-0.9.8-amd64
- Make sure that you do not link to the static library
- (libasound.a),
- by verifying that the dynamic library (libasound.so) is
- correctly installed in /usr/lib.
-
- Download driver and library
- source tarballs from
- ALSA's homepage.
- As root, execute the following
- commands (you may need to adapt the version number):
-
-
- $ tar xjf alsa-driver-0.9.1.tar.bz2
- $ cd alsa-driver-0.9.1
- $ ./configure
- $ make install
- $ cd ..
- $ tar xjf alsa-lib-0.9.1.tar.bz2
- $ cd alsa-lib-0.9.1
- $ ./configure
- $ make install
-
-
- Should one of the above steps fail, refer to the documentation on
- ALSA's home page.
-
- Note that this is a minimum install that enables
- building the JDK platform. To actually use ALSA sound drivers, more
- steps are necessary as outlined in the documentation on ALSA's homepage.
-
- ALSA can be uninstalled by executing make uninstall first in
- the alsa-lib-0.9.1 directory and then in
- alsa-driver-0.9.1.
-
- There are no ALT* variables to change the assumed locations of ALSA,
- the makefiles will expect to find the ALSA include files and library at:
- /usr/include/alsa and /usr/lib/libasound.so.
-
- The OpenJDK requires access to a set of unix command tools
- on Windows which can be supplied by
- CYGWIN.
-
- The OpenJDK build requires CYGWIN version 1.5.12 or newer.
- Information about CYGWIN can
- be obtained from the CYGWIN website at
- www.cygwin.com.
-
- By default CYGWIN doesn't install all the tools required for building
- the OpenJDK.
- Along with the default installation, you need to install
- the following tools.
-
-
-
-
-
Binary Name
-
Category
-
Package
-
Description
-
-
-
-
-
ar.exe
-
Devel
-
binutils
-
The GNU assembler, linker and binary
- utilities
-
-
-
make.exe
-
Devel
-
make
-
The GNU version of the 'make' utility built for CYGWIN.
- NOTE: the Cygwin make can not be used to build the
- OpenJDK. You only need it to build your own version of make
- (see the GNU make section)
-
-
-
m4.exe
-
Interpreters
-
m4
-
GNU implementation of the traditional Unix macro
- processor
-
-
-
cpio.exe
-
Utils
-
cpio
-
A program to manage archives of files
-
-
-
gawk.exe
-
Utils
-
awk
-
Pattern-directed scanning and processing language
-
-
-
file.exe
-
Utils
-
file
-
Determines file type using 'magic' numbers
-
-
-
zip.exe
-
Archive
-
zip
-
Package and compress (archive) files
-
-
-
unzip.exe
-
Archive
-
unzip
-
Extract compressed files in a ZIP archive
-
-
-
free.exe
-
System
-
procps
-
Display amount of free and used memory in the system
-
-
-
-
-
- Note that the CYGWIN software can conflict with other non-CYGWIN
- software on your Windows system.
- CYGWIN provides a
- FAQ for
- known issues and problems, of particular interest is the
- section on
-
- BLODA (applications that interfere with CYGWIN).
-
- WARNING:
- Be very careful with link.exe, it will conflict
- with the Visual Studio version. You need the Visual Studio
- version of link.exe, not the CYGWIN one.
- So it's important that the Visual Studio paths in PATH preceed
- the CYGWIN path /usr/bin.
-
- Alternatively, the set of unix command tools for the OpenJDK build on
- Windows can be supplied by
- MinGW/MSYS.
-
- In addition to the tools which will be installed by default, you have
- to manually install the msys-zip and msys-unzip packages.
- This can be easily done with the MinGW command line installer:
-
- mingw-get.exe install msys-zip
- mingw-get.exe install msys-unzip
-
-
- Microsoft DirectX 9.0 SDK (Summer 2004)
- headers are required for building
- OpenJDK.
- This SDK can be downloaded from
-
- Microsoft DirectX 9.0 SDK (Summer 2004).
- If the link above becomes obsolete, the SDK can be found from
- the Microsoft Download Site
- (search with "DirectX 9.0 SDK Update Summer 2004").
- The location of this SDK can be set with
- ALT_DXSDK_PATH
- but it's normally found via the DirectX environment variable
- DXSDK_DIR.
-
- The OpenJDK build requires access to a redistributable
- MSVCR100.DLL.
- This is usually picked up automatically from the redist
- directories of Visual Studio 2010.
- If this cannot be found set the
- ALT_MSVCRNN_DLL_PATH
- variable to the location of this file.
-
- Once a machine is setup to build the OpenJDK,
- the steps to create the build are fairly simple.
- The various ALT settings can either be made into variables
- or can be supplied on the
- gmake
- command.
-
-
Use the sanity rule to double check all the ALT settings:
-
- Solaris:
- Note that ARCH_DATA_MODEL is really only needed on Solaris to
- indicate you want to built the 64-bit version.
- And before the Solaris 64-bit binaries can be used, they
- must be merged with the binaries from a separate 32-bit build.
- The merged binaries may then be used in either 32-bit or 64-bit mode, with
- the selection occurring at runtime
- with the -d32 or -d64 options.
-
- When the build is completed, you should see the generated
- binaries and associated files in the j2sdk-image
- directory in the output directory.
- The default output directory is
- build/platform,
- where platform is one of
-
+ cd build/my-special-output
+
+ bash ../../configure
+
+ to build:
+
+ cd build/my-special-output
+
+ make
+
+
+
+
set ALT_BOOTDIR=/opt/java/jdk7
+
run configure --with-boot-jdk=/opt/java/jdk7
+
+
+
run make ARCH_DATA_MODEL=32
+
run configure --with-target-bits=32
+
+
+
set BUILD_CLIENT_ONLY=true
+
run configure --with-jvm-variants=client
+
+
+
set ALT_FREETYPE_LIB_PATH=/opt/freetype/lib
+ and ALT_FREETYPE_HEADERS_PATH=/opt/freetype/include
+
run configure --with-freetype=/opt/freetype
+
+
+
set ALT_CUPS_HEADERS_PATH=/opt/cups/include
+
run configure --with-cups=/opt/cups
+
+
+
set ALT_OPENWIN_HOME=/opt/X11R6
+
run configure --with-x=/opt/X11R6
+
+
+
set ALT_MSVCRNN_DLL_PATH=c:/vc_redist
+
run configure --with-msvcr100dll=/cygdrive/c/vc_redist
+
+
+
set ALT_COMPILER_PATH=/opt/my-gcc/bin/gcc
+
run CC=/opt/my-gcc/bin/gcc configure
+ or CXX=/opt/my-gcc/bin/g++ configure
+
+
+
+
set BUILD_HEADLESS_ONLY=true
+
run configure --disable-headful
+
+
+
set ALT_DEVTOOLS_PATH=/opt/mytools
+
just run configure,
+ your tools should be detected automatically.
+ If you have an unusual configuration,
+ add the tools directory to your PATH.
+
+
+
+
set ALT_DROPS_DIR=/home/user/dropdir
+
source drops are not used anymore
+
+
+
set USE_ONLY_BOOTDIR_TOOLS=true
+
not needed, configure should always do the Right Thing automatically
+
+
+
set ALT_JDK_IMPORT_PATH=/opt/java/import-jdk
+ or ALT_BUILD_JDK_IMPORT_PATH=/opt/java/import-jdk
+
+
Importing JDKs is no longer possible,
+ but hotspot can be imported using
+ --with-import-hotspot.
+ Documentation on how to achieve a
+ similar solution will come soon!
+
The location of the Bootstrap JDK java
+ (see Bootstrap JDK)
+
The location of the C/C++ compilers
+ (see compilers)
+
The location or locations for the Unix command utilities
+ (e.g. /usr/bin)
-
- In particular, the
- build/platform/j2sdk-image/bin
- directory should contain executables for the
- OpenJDK tools and utilities.
-
- You can test that the build completed properly by using the build
- to run the various demos that you will find in the
- build/platform/j2sdk-image/demo
- directory.
-
- The provided regression tests can be run with the jtreg
- utility from
- the jtreg site.
-
-
+
+
MILESTONE
+
+ The milestone name for the build (e.g."beta").
+ The default value is "internal".
+
+
BUILD_NUMBER
+
+ The build number for the build (e.g. "b27").
+ The default value is "b00".
+
The ARCH_DATA_MODEL variable
+ is used to specify whether the build is to generate 32-bit or 64-bit
+ binaries.
+ The Solaris build supports either 32-bit or 64-bit builds, but
+ Windows and Linux will support only one, depending on the specific
+ OS being used.
+ Normally, setting this variable is only necessary on Solaris.
+ Set ARCH_DATA_MODEL to 32 for generating 32-bit binaries,
+ or to 64 for generating 64-bit binaries.
+
+ The location of the bootstrap JDK installation.
+ See Bootstrap JDK for more information.
+ You should always install your own local Bootstrap JDK and
+ always set ALT_BOOTDIR explicitly.
+
+ The location of the CUPS header files.
+ See CUPS information for more information.
+ If this path does not exist the fallback path is
+ /usr/include.
+
+ The location of tools like the
+ zip and unzip
+ binaries, but might also contain the GNU make utility
+ (gmake).
+ So this area is a bit of a grab bag, especially on Windows.
+ The default value depends on the platform and
+ Unix Commands being used.
+ On Linux the default will be
+ $(ALT_JDK_DEVTOOLS_PATH)/linux/bin,
+ on Solaris
+ $(ALT_JDK_DEVTOOLS_PATH)/{sparc,i386}/bin,
+ and on Windows with CYGWIN
+ /usr/bin.
+
+ The default root location for many of the ALT path locations
+ of the following ALT variables.
+ The default value is
+ "/java" on Solaris and Linux,
+ "J:" on Windows.
+
+ The top-level directory of the libraries and include files
+ for the platform's
+ graphical programming environment.
+ The default location is platform specific.
+ For example, on Linux it defaults to /usr/X11R6/.
+
+ The location of the
+ Microsoft Windows SDK where some tools will be
+ located.
+ The default is whatever WINDOWSSDKDIR is set to
+ (or WindowsSdkDir) or the path
+
+ c:\Program Files\Microsoft SDKs\Windows\v7.0a
+
+ The location of the
+ Microsoft DirectX 9 SDK.
+ The default will be to try and use the DirectX environment
+ variable DXSDK_DIR,
+ failing that, look in C:/DXSDK.
+
+ Set to the target architecture of a
+ cross-compilation build. If set, this
+ variable is used to signify that we are
+ cross-compiling. The expectation
+ is that
+ ALT_COMPILER_PATH
+ is set
+ to point to the cross-compiler and that any
+ cross-compilation specific flags
+ are passed using
+ EXTRA_CFLAGS.
+ The ALT_OPENWIN_HOME
+ variable should
+ also be set to point to the graphical header files
+ (e.g. X11) provided with
+ the cross-compiler.
+ When cross-compiling we skip execution of any demos
+ etc that may be built, and
+ also skip binary-file verification.
+
+ Used primarily for cross-compilation builds
+ (and always set in that case)
+ this variable indicates that tools from the
+ boot JDK should be used during
+ the build process, not the tools
+ (javac, javah, jar)
+ just built (which can't execute on the build host).
+
+ The location of the C compiler to generate programs
+ to run on the build host.
+ Some parts of the build generate programs that are
+ then compiled and executed
+ to produce other parts of the build. Normally the
+ primary C compiler is used
+ to do this, but when cross-compiling that would be
+ the cross-compiler and the
+ resulting program could not be executed.
+ On Linux this defaults to /usr/bin/gcc;
+ on other platforms it must be
+ set explicitly.
+
+
+
Specialized Build Options:
+
+ Some build variables exist to support specialized build
+ environments and/or specialized
+ build products. Their use is only supported in those contexts:
+
+ Indicates this build will only contain the
+ Hotspot client VM. In addition to
+ controlling the Hotspot build target,
+ it ensures that we don't try to copy
+ any server VM files/directories,
+ and defines a default jvm.cfg file
+ suitable for a client-only environment.
+ Using this in a 64-bit build will
+ generate a sanity warning as 64-bit client
+ builds are not directly supported.
+
+
BUILD_HEADLESS_ONLY
+
+ Used when the build environment has no graphical
+ capabilities at all. This
+ excludes building anything that requires graphical
+ libraries to be available.
+
+
JAVASE_EMBEDDED
+
+ Used to indicate this is a build of the Oracle
+ Java SE Embedded product.
+ This will enable the directives included in the
+ SE-Embedded specific build
+ files.
+
The ARCH_DATA_MODEL variable
- is used to specify whether the build is to generate 32-bit or 64-bit
- binaries.
- The Solaris build supports either 32-bit or 64-bit builds, but
- Windows and Linux will support only one, depending on the specific
- OS being used.
- Normally, setting this variable is only necessary on Solaris.
- Set ARCH_DATA_MODEL to 32 for generating 32-bit binaries,
- or to 64 for generating 64-bit binaries.
-
- The location of the bootstrap JDK installation.
- See Bootstrap JDK for more information.
- You should always install your own local Bootstrap JDK and
- always set ALT_BOOTDIR explicitly.
-
- The location of the CUPS header files.
- See CUPS information for more information.
- If this path does not exist the fallback path is
- /usr/include.
-
- The location of tools like the
- zip and unzip
- binaries, but might also contain the GNU make utility
- (gmake).
- So this area is a bit of a grab bag, especially on Windows.
- The default value depends on the platform and
- Unix Commands being used.
- On Linux the default will be
- $(ALT_JDK_DEVTOOLS_PATH)/linux/bin,
- on Solaris
- $(ALT_JDK_DEVTOOLS_PATH)/{sparc,i386}/bin,
- and on Windows with CYGWIN
- /usr/bin.
-
- The default root location for many of the ALT path locations
- of the following ALT variables.
- The default value is
- "/java" on Solaris and Linux,
- "J:" on Windows.
-
- These are useful in managing builds on multiple platforms.
- The default network location for all of the import JDK images
- for all platforms.
- If ALT_JDK_IMPORT_PATH
- is not set, this directory will be used and should contain
- the following directories:
- solaris-sparc,
- solaris-i586,
- solaris-sparcv9,
- solaris-amd64,
- linux-i586,
- linux-amd64,
- windows-i586,
- and
- windows-amd64.
- Where each of these directories contain the import JDK image
- for that platform.
-
- The top-level directory of the libraries and include files for the platform's
- graphical programming environment. The default location is platform specific.
- For example, on Linux it defaults to /usr/X11R6/.
-
- The location of the
- Microsoft Windows SDK where some tools will be
- located.
- The default is whatever WINDOWSSDKDIR is set to
- (or WindowsSdkDir) or the path
-
- c:\Program Files\Microsoft SDKs\Windows\v7.0a
-
- The location of the
- Microsoft DirectX 9 SDK.
- The default will be to try and use the DirectX environment
- variable DXSDK_DIR,
- failing that, look in C:/DXSDK.
-
- Set to the target architecture of a cross-compilation build. If set, this
- variable is used to signify that we are cross-compiling. The expectation
- is that ALT_COMPILER_PATH is set
- to point to the cross-compiler and that any cross-compilation specific flags
- are passed using EXTRA_CFLAGS.
- The ALT_OPENWIN_HOME variable should
- also be set to point to the graphical header files (e.g. X11) provided with
- the cross-compiler.
- When cross-compiling we skip execution of any demos etc that may be built, and
- also skip binary-file verification.
-
- Used primarily for cross-compilation builds (and always set in that case)
- this variable indicates that tools from the boot JDK should be used during
- the build process, not the tools (javac, javah, jar)
- just built (which can't execute on the build host).
-
- The location of the C compiler to generate programs to run on the build host.
- Some parts of the build generate programs that are then compiled and executed
- to produce other parts of the build. Normally the primary C compiler is used
- to do this, but when cross-compiling that would be the cross-compiler and the
- resulting program could not be executed.
- On Linux this defaults to /usr/bin/gcc; on other platforms it must be
- set explicitly.
-
-
-
Specialized Build Options:
-
- Some build variables exist to support specialized build environments and/or specialized
- build products. Their use is only supported in those contexts:
-
- Indicates this build will only contain the Hotspot client VM. In addition to
- controlling the Hotspot build target, it ensures that we don't try to copy
- any server VM files/directories, and defines a default jvm.cfg file
- suitable for a client-only environment. Using this in a 64-bit build will
- generate a sanity warning as 64-bit client builds are not directly supported.
-
-
BUILD_HEADLESS_ONLY
-
- Used when the build environment has no graphical capabilities at all. This
- excludes building anything that requires graphical libraries to be available.
-
-
JAVASE_EMBEDDED
-
- Used to indicate this is a build of the Oracle Java SE Embedded product.
- This will enable the directives included in the SE-Embedded specific build
- files.
-
- You don't have to use all these hints and tips, and in fact people do actually
- build with systems that contradict these, but they might prove to be
- helpful to some.
-
-
- If make sanity does not work, find out why, fix that
- before going any further. Or at least understand what the
- complaints are from it.
-
-
- JDK: Keep in mind that you are building a JDK, but you need
- a JDK (BOOTDIR JDK) to build this JDK.
-
-
- Ant: The ant utility is a java application and besides having
- ant available to you, it's important that ant finds the right
- java to run with. Make sure you can type ant -version
- and get clean results with no error messages.
-
-
- Linux: Try and favor the system packages over building your own
- or getting packages from other areas.
- Most Linux builds should be possible with the system's
- available packages.
-
-
- Solaris: Typically you will need to get compilers on your systems
- and occasionally GNU make 3.81 if a gmake binary is not available.
- The gmake binary might not be 3.81, be careful.
-
-
- Windows VS2010:
-
-
- Only the C++ part of VS2010 is needed.
- Try to let the installation go to the default install directory.
- Always reboot your system after installing VS2010.
- The system environment variable VS100COMNTOOLS should be
- set in your environment.
-
-
- Make sure that TMP and TEMP are also set in the environment
- and refer to Windows paths that exist, like C:\temp,
- not /tmp, not /cygdrive/c/temp, and not C:/temp.
- C:\temp is just an example, it is assumed that this area is
- private to the user, so by default after installs you should
- see a unique user path in these variables.
-
-
- You need to use vsvars32.bat or vsvars64.bat to get the
- PATH, INCLUDE, LIB, LIBPATH, and WINDOWSSDKDIR
- variables set in your shell environment.
- These bat files are not easy to use from a shell environment.
- However, there is a script placed in the root jdk8 repository called
- vsvars.sh that can help, it should only be done once in a shell
- that will be doing the build, e.g.
- sh ./make/scripts/vsvars.sh -v10 > settings
- eval `cat settings`
- Or just eval `sh ./make/scripts/vsvars.sh -v10`.
-
-
-
-
- Windows: PATH order is critical, see the
- paths section for more information.
-
- A build can fail for any number of reasons.
- Most failures
- are a result of trying to build in an environment in which all the
- pre-build requirements have not been met.
- The first step in
- troubleshooting a build failure is to recheck that you have satisfied
- all the pre-build requirements for your platform.
- Look for the check list of the platform you are building on in the
- Table of Contents.
-
- You can validate your build environment by using the sanity
- target.
- Any errors listed
- will stop the build from starting, and any warnings may result in
- a flawed product build.
- We strongly encourage you to evaluate every
- sanity check warning and fix it if required, before you proceed
- further with your build.
-
- Some of the more common problems with builds are briefly described
- below, with suggestions for remedies.
-
-
- Corrupted Bundles on Windows:
-
- Some virus scanning software has been known to corrupt the
- downloading of zip bundles.
- It may be necessary to disable the 'on access' or 'real time'
- virus scanning features to prevent this corruption.
- This type of "real time" virus scanning can also slow down the
- build process significantly.
- Temporarily disabling the feature, or excluding the build
- output directory may be necessary to get correct and faster builds.
-
-
-
- Slow Builds:
-
- If your build machine seems to be overloaded from too many
- simultaneous C++ compiles, try setting the HOTSPOT_BUILD_JOBS
- variable to 1 (if you're using a multiple CPU
- machine, setting it to more than the the number of CPUs is probably
- not a good idea).
-
- Creating the javadocs can be very slow, if you are running
- javadoc, consider skipping that step.
-
- Faster hardware and more RAM always helps too.
- The VM build tends to be CPU intensive (many C++ compiles),
- and the rest of the JDK will often be disk intensive.
-
- Faster compiles are possible using a tool called
- ccache.
-
-
-
- File time issues:
-
- If you see warnings that refer to file time stamps, e.g.
-
- Warning message: File `xxx' has modification time in
- the future.
-
- Warning message: Clock skew detected. Your build may
- be incomplete.
-
- These warnings can occur when the clock on the build machine is out of
- sync with the timestamps on the source files. Other errors, apparently
- unrelated but in fact caused by the clock skew, can occur along with
- the clock skew warnings. These secondary errors may tend to obscure the
- fact that the true root cause of the problem is an out-of-sync clock.
- For example, an out-of-sync clock has been known to cause an old
- version of javac to be used to compile some files, resulting in errors
- when the pre-1.4 compiler ran across the new assert keyword
- in the 1.4 source code.
-
- If you see these warnings, reset the clock on the build
- machine, run "gmake clobber" or delete the directory
- containing the build output, and restart the build from the beginning.
-
-
-
- Error message: Trouble writing out table to disk
-
- Increase the amount of swap space on your build machine.
-
-
-
- Error Message: libstdc++ not found:
-
- This is caused by a missing libstdc++.a library.
- This is installed as part of a specific package
- (e.g. libstdc++.so.devel.386).
- By default some 64-bit Linux versions (e.g. Fedora)
- only install the 64-bit version of the libstdc++ package.
- Various parts of the JDK build require a static
- link of the C++ runtime libraries to allow for maximum
- portability of the built images.
-
-
-
- Error Message: cannot restore segment prot after reloc
-
- This is probably an issue with SELinux (See
-
- http://en.wikipedia.org/wiki/SELinux).
- Parts of the VM is built without the -fPIC for
- performance reasons.
-
- To completely disable SELinux:
-
-
$ su root
-
# system-config-securitylevel
-
In the window that appears, select the SELinux tab
-
Disable SELinux
-
-
- Alternatively, instead of completely disabling it you could
- disable just this one check.
-
-
Select System->Administration->SELinux Management
-
In the SELinux Management Tool which appears,
- select "Boolean" from the menu on the left
-
Expand the "Memory Protection" group
-
Check the first item, labeled
- "Allow all unconfined executables to use libraries requiring text relocation ..."
-
-
-
-
- Windows Error Messages:
- *** fatal error - couldn't allocate heap, ...
- rm fails with "Directory not empty"
- unzip fails with "cannot create ... Permission denied"
- unzip fails with "cannot create ... Error 50"
-
- Try rebooting the system, or there could be some kind of
- issue with the disk or disk partition being used.
- Sometimes it comes with a "Permission Denied" message.
-
End of OpenJDK README-builds.html document. Please come again!
+
diff --git a/common/autoconf/build-performance.m4 b/common/autoconf/build-performance.m4
index 0d1d8b92157..12075413070 100644
--- a/common/autoconf/build-performance.m4
+++ b/common/autoconf/build-performance.m4
@@ -47,10 +47,6 @@ AC_DEFUN([BPERF_CHECK_CORES],
FOUND_CORES=yes
fi
- # For c/c++ code we run twice as many concurrent build
- # jobs than we have cores, otherwise we will stall on io.
- CONCURRENT_BUILD_JOBS=`expr $NUM_CORES \* 2`
-
if test "x$FOUND_CORES" = xyes; then
AC_MSG_RESULT([$NUM_CORES])
else
@@ -98,32 +94,62 @@ AC_DEFUN([BPERF_CHECK_MEMORY_SIZE],
AC_DEFUN_ONCE([BPERF_SETUP_BUILD_CORES],
[
-# How many cores do we have on this build system?
-AC_ARG_WITH(num-cores, [AS_HELP_STRING([--with-num-cores],
+ # How many cores do we have on this build system?
+ AC_ARG_WITH(num-cores, [AS_HELP_STRING([--with-num-cores],
[number of cores in the build system, e.g. --with-num-cores=8 @<:@probed@:>@])])
-if test "x$with_num_cores" = x; then
+ if test "x$with_num_cores" = x; then
# The number of cores were not specified, try to probe them.
BPERF_CHECK_CORES
-else
+ else
NUM_CORES=$with_num_cores
- CONCURRENT_BUILD_JOBS=`expr $NUM_CORES \* 2`
-fi
-AC_SUBST(NUM_CORES)
-AC_SUBST(CONCURRENT_BUILD_JOBS)
+ fi
+ AC_SUBST(NUM_CORES)
])
AC_DEFUN_ONCE([BPERF_SETUP_BUILD_MEMORY],
[
-# How much memory do we have on this build system?
-AC_ARG_WITH(memory-size, [AS_HELP_STRING([--with-memory-size],
+ # How much memory do we have on this build system?
+ AC_ARG_WITH(memory-size, [AS_HELP_STRING([--with-memory-size],
[memory (in MB) available in the build system, e.g. --with-memory-size=1024 @<:@probed@:>@])])
-if test "x$with_memory_size" = x; then
+ if test "x$with_memory_size" = x; then
# The memory size was not specified, try to probe it.
BPERF_CHECK_MEMORY_SIZE
-else
+ else
MEMORY_SIZE=$with_memory_size
-fi
-AC_SUBST(MEMORY_SIZE)
+ fi
+ AC_SUBST(MEMORY_SIZE)
+])
+
+AC_DEFUN_ONCE([BPERF_SETUP_BUILD_JOBS],
+[
+ # Provide a decent default number of parallel jobs for make depending on
+ # number of cores, amount of memory and machine architecture.
+ AC_ARG_WITH(jobs, [AS_HELP_STRING([--with-jobs],
+ [number of parallel jobs to let make run @<:@calculated based on cores and memory@:>@])])
+ if test "x$with_jobs" = x; then
+ # Number of jobs was not specified, calculate.
+ AC_MSG_CHECKING([for appropriate number of jobs to run in parallel])
+ # Approximate memory in GB, rounding up a bit.
+ memory_gb=`expr $MEMORY_SIZE / 1100`
+ # Pick the lowest of memory in gb and number of cores.
+ if test "$memory_gb" -lt "$NUM_CORES"; then
+ JOBS="$memory_gb"
+ else
+ JOBS="$NUM_CORES"
+ # On bigger machines, leave some room for other processes to run
+ if test "$JOBS" -gt "4"; then
+ JOBS=`expr $JOBS '*' 90 / 100`
+ fi
+ fi
+ # Cap number of jobs to 16
+ if test "$JOBS" -gt "16"; then
+ JOBS=16
+ fi
+ AC_MSG_RESULT([$JOBS])
+ else
+ JOBS=$with_jobs
+ fi
+ AC_SUBST(JOBS)
])
AC_DEFUN([BPERF_SETUP_CCACHE],
diff --git a/common/autoconf/configure.ac b/common/autoconf/configure.ac
index 0bb0faf0d2f..da9996f74d9 100644
--- a/common/autoconf/configure.ac
+++ b/common/autoconf/configure.ac
@@ -204,6 +204,7 @@ JDKOPT_SETUP_BUILD_TWEAKS
BPERF_SETUP_BUILD_CORES
BPERF_SETUP_BUILD_MEMORY
+BPERF_SETUP_BUILD_JOBS
# Setup smart javac (after cores and memory have been setup)
BPERF_SETUP_SMART_JAVAC
diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh
index 741160eab1d..31764abe4e0 100644
--- a/common/autoconf/generated-configure.sh
+++ b/common/autoconf/generated-configure.sh
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for OpenJDK jdk8.
+# Generated by GNU Autoconf 2.67 for OpenJDK jdk8.
#
# Report bugs to .
#
@@ -91,7 +91,6 @@ fi
IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator.
-as_myself=
case $0 in #((
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -217,18 +216,11 @@ IFS=$as_save_IFS
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
- # Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
export CONFIG_SHELL
- case $- in # ((((
- *v*x* | *x*v* ) as_opts=-vx ;;
- *v* ) as_opts=-v ;;
- *x* ) as_opts=-x ;;
- * ) as_opts= ;;
- esac
- exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
fi
if test x$as_have_required = xno; then :
@@ -609,8 +601,8 @@ SJAVAC_SERVER_DIR
ENABLE_SJAVAC
SJAVAC_SERVER_CORES
SJAVAC_SERVER_JAVA
+JOBS
MEMORY_SIZE
-CONCURRENT_BUILD_JOBS
NUM_CORES
SALIB_NAME
HOTSPOT_MAKE_ARGS
@@ -649,7 +641,7 @@ CXXFLAGS_JDKEXE
CXXFLAGS_JDKLIB
CFLAGS_JDKEXE
CFLAGS_JDKLIB
-MACOSX_REQUIRED_VERSION
+MACOSX_VERSION_MIN
PACKAGE_PATH
LEGACY_EXTRA_LDFLAGS
LEGACY_EXTRA_CXXFLAGS
@@ -1010,6 +1002,7 @@ with_zlib
with_stdc__lib
with_num_cores
with_memory_size
+with_jobs
with_sjavac_server_java
with_sjavac_server_cores
enable_sjavac
@@ -1442,7 +1435,7 @@ Try \`$0 --help' for more information"
$as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
$as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
- : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
;;
esac
@@ -1768,6 +1761,8 @@ Optional Packages:
--with-num-cores=8 [probed]
--with-memory-size memory (in MB) available in the build system, e.g.
--with-memory-size=1024 [probed]
+ --with-jobs number of parallel jobs to let make run [calculated
+ based on cores and memory]
--with-sjavac-server-java
use this java binary for running the sjavac
background server [Boot JDK java]
@@ -1867,7 +1862,7 @@ test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
OpenJDK configure jdk8
-generated by GNU Autoconf 2.68
+generated by GNU Autoconf 2.67
Copyright (C) 2010 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
@@ -1913,7 +1908,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
as_fn_set_status $ac_retval
} # ac_fn_c_try_compile
@@ -1951,7 +1946,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
as_fn_set_status $ac_retval
} # ac_fn_cxx_try_compile
@@ -1989,7 +1984,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
as_fn_set_status $ac_retval
} # ac_fn_objc_try_compile
@@ -2026,7 +2021,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
as_fn_set_status $ac_retval
} # ac_fn_c_try_cpp
@@ -2063,7 +2058,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
as_fn_set_status $ac_retval
} # ac_fn_cxx_try_cpp
@@ -2076,10 +2071,10 @@ fi
ac_fn_cxx_check_header_mongrel ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
+ if eval "test \"\${$3+set}\"" = set; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
+if eval "test \"\${$3+set}\"" = set; then :
$as_echo_n "(cached) " >&6
fi
eval ac_res=\$$3
@@ -2146,7 +2141,7 @@ $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
+if eval "test \"\${$3+set}\"" = set; then :
$as_echo_n "(cached) " >&6
else
eval "$3=\$ac_header_compiler"
@@ -2155,7 +2150,7 @@ eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
} # ac_fn_cxx_check_header_mongrel
@@ -2196,7 +2191,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=$ac_status
fi
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
as_fn_set_status $ac_retval
} # ac_fn_cxx_try_run
@@ -2210,7 +2205,7 @@ ac_fn_cxx_check_header_compile ()
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
+if eval "test \"\${$3+set}\"" = set; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -2228,7 +2223,7 @@ fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
} # ac_fn_cxx_check_header_compile
@@ -2405,7 +2400,7 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
rm -f conftest.val
fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
as_fn_set_status $ac_retval
} # ac_fn_cxx_compute_int
@@ -2451,7 +2446,7 @@ fi
# interfere with the next link command; also delete a directory that is
# left behind by Apple's compiler. We do this before executing the actions.
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
as_fn_set_status $ac_retval
} # ac_fn_cxx_try_link
@@ -2464,7 +2459,7 @@ ac_fn_cxx_check_func ()
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
+if eval "test \"\${$3+set}\"" = set; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -2519,7 +2514,7 @@ fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
} # ac_fn_cxx_check_func
@@ -2532,7 +2527,7 @@ ac_fn_c_check_header_compile ()
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
+if eval "test \"\${$3+set}\"" = set; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -2550,7 +2545,7 @@ fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
} # ac_fn_c_check_header_compile
cat >config.log <<_ACEOF
@@ -2558,7 +2553,7 @@ This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by OpenJDK $as_me jdk8, which was
-generated by GNU Autoconf 2.68. Invocation command line was
+generated by GNU Autoconf 2.67. Invocation command line was
$ $0 $@
@@ -2816,7 +2811,7 @@ $as_echo "$as_me: loading site script $ac_site_file" >&6;}
|| { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5; }
+See \`config.log' for more details" "$LINENO" 5 ; }
fi
done
@@ -3337,6 +3332,8 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
#
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -3732,7 +3729,7 @@ fi
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1361218904
+DATE_WHEN_GENERATED=1362411827
###############################################################################
#
@@ -3770,7 +3767,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_BASENAME+:} false; then :
+if test "${ac_cv_path_BASENAME+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $BASENAME in
@@ -3829,7 +3826,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_BASH+:} false; then :
+if test "${ac_cv_path_BASH+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $BASH in
@@ -3888,7 +3885,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_CAT+:} false; then :
+if test "${ac_cv_path_CAT+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $CAT in
@@ -3947,7 +3944,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_CHMOD+:} false; then :
+if test "${ac_cv_path_CHMOD+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $CHMOD in
@@ -4006,7 +4003,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_CMP+:} false; then :
+if test "${ac_cv_path_CMP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $CMP in
@@ -4065,7 +4062,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_COMM+:} false; then :
+if test "${ac_cv_path_COMM+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $COMM in
@@ -4124,7 +4121,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_CP+:} false; then :
+if test "${ac_cv_path_CP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $CP in
@@ -4183,7 +4180,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_CPIO+:} false; then :
+if test "${ac_cv_path_CPIO+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $CPIO in
@@ -4242,7 +4239,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_CUT+:} false; then :
+if test "${ac_cv_path_CUT+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $CUT in
@@ -4301,7 +4298,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_DATE+:} false; then :
+if test "${ac_cv_path_DATE+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $DATE in
@@ -4360,7 +4357,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_DIFF+:} false; then :
+if test "${ac_cv_path_DIFF+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $DIFF in
@@ -4419,7 +4416,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_DIRNAME+:} false; then :
+if test "${ac_cv_path_DIRNAME+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $DIRNAME in
@@ -4478,7 +4475,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ECHO+:} false; then :
+if test "${ac_cv_path_ECHO+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $ECHO in
@@ -4537,7 +4534,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_EXPR+:} false; then :
+if test "${ac_cv_path_EXPR+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $EXPR in
@@ -4596,7 +4593,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_FILE+:} false; then :
+if test "${ac_cv_path_FILE+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $FILE in
@@ -4655,7 +4652,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_FIND+:} false; then :
+if test "${ac_cv_path_FIND+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $FIND in
@@ -4714,7 +4711,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_HEAD+:} false; then :
+if test "${ac_cv_path_HEAD+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $HEAD in
@@ -4773,7 +4770,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_LN+:} false; then :
+if test "${ac_cv_path_LN+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $LN in
@@ -4832,7 +4829,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_LS+:} false; then :
+if test "${ac_cv_path_LS+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $LS in
@@ -4891,7 +4888,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MKDIR+:} false; then :
+if test "${ac_cv_path_MKDIR+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $MKDIR in
@@ -4950,7 +4947,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MKTEMP+:} false; then :
+if test "${ac_cv_path_MKTEMP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $MKTEMP in
@@ -5009,7 +5006,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MV+:} false; then :
+if test "${ac_cv_path_MV+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $MV in
@@ -5068,7 +5065,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_PRINTF+:} false; then :
+if test "${ac_cv_path_PRINTF+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $PRINTF in
@@ -5127,7 +5124,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_THEPWDCMD+:} false; then :
+if test "${ac_cv_path_THEPWDCMD+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $THEPWDCMD in
@@ -5186,7 +5183,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_RM+:} false; then :
+if test "${ac_cv_path_RM+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $RM in
@@ -5245,7 +5242,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_SH+:} false; then :
+if test "${ac_cv_path_SH+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $SH in
@@ -5304,7 +5301,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_SORT+:} false; then :
+if test "${ac_cv_path_SORT+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $SORT in
@@ -5363,7 +5360,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_TAIL+:} false; then :
+if test "${ac_cv_path_TAIL+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $TAIL in
@@ -5422,7 +5419,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_TAR+:} false; then :
+if test "${ac_cv_path_TAR+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $TAR in
@@ -5481,7 +5478,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_TEE+:} false; then :
+if test "${ac_cv_path_TEE+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $TEE in
@@ -5540,7 +5537,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_TOUCH+:} false; then :
+if test "${ac_cv_path_TOUCH+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $TOUCH in
@@ -5599,7 +5596,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_TR+:} false; then :
+if test "${ac_cv_path_TR+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $TR in
@@ -5658,7 +5655,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_UNAME+:} false; then :
+if test "${ac_cv_path_UNAME+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $UNAME in
@@ -5717,7 +5714,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_UNIQ+:} false; then :
+if test "${ac_cv_path_UNIQ+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $UNIQ in
@@ -5776,7 +5773,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_WC+:} false; then :
+if test "${ac_cv_path_WC+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $WC in
@@ -5835,7 +5832,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_WHICH+:} false; then :
+if test "${ac_cv_path_WHICH+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $WHICH in
@@ -5894,7 +5891,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_XARGS+:} false; then :
+if test "${ac_cv_path_XARGS+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $XARGS in
@@ -5954,7 +5951,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AWK+:} false; then :
+if test "${ac_cv_prog_AWK+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$AWK"; then
@@ -6004,7 +6001,7 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
+if test "${ac_cv_path_GREP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -z "$GREP"; then
@@ -6079,7 +6076,7 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
+if test "${ac_cv_path_EGREP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
@@ -6158,7 +6155,7 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
$as_echo_n "checking for fgrep... " >&6; }
-if ${ac_cv_path_FGREP+:} false; then :
+if test "${ac_cv_path_FGREP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
@@ -6237,7 +6234,7 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if ${ac_cv_path_SED+:} false; then :
+if test "${ac_cv_path_SED+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
@@ -6323,7 +6320,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_NAWK+:} false; then :
+if test "${ac_cv_path_NAWK+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $NAWK in
@@ -6383,7 +6380,7 @@ RM="$RM -f"
set dummy cygpath; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_CYGPATH+:} false; then :
+if test "${ac_cv_path_CYGPATH+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $CYGPATH in
@@ -6423,7 +6420,7 @@ fi
set dummy readlink; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_READLINK+:} false; then :
+if test "${ac_cv_path_READLINK+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $READLINK in
@@ -6463,7 +6460,7 @@ fi
set dummy df; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_DF+:} false; then :
+if test "${ac_cv_path_DF+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $DF in
@@ -6503,7 +6500,7 @@ fi
set dummy SetFile; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_SETFILE+:} false; then :
+if test "${ac_cv_path_SETFILE+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $SETFILE in
@@ -6549,7 +6546,7 @@ $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
+if test "${ac_cv_build+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_build_alias=$build_alias
@@ -6565,7 +6562,7 @@ fi
$as_echo "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;;
esac
build=$ac_cv_build
ac_save_IFS=$IFS; IFS='-'
@@ -6583,7 +6580,7 @@ case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
+if test "${ac_cv_host+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test "x$host_alias" = x; then
@@ -6598,7 +6595,7 @@ fi
$as_echo "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;;
esac
host=$ac_cv_host
ac_save_IFS=$IFS; IFS='-'
@@ -6616,7 +6613,7 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
$as_echo_n "checking target system type... " >&6; }
-if ${ac_cv_target+:} false; then :
+if test "${ac_cv_target+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test "x$target_alias" = x; then
@@ -6631,7 +6628,7 @@ fi
$as_echo "$ac_cv_target" >&6; }
case $ac_cv_target in
*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5 ;;
esac
target=$ac_cv_target
ac_save_IFS=$IFS; IFS='-'
@@ -8097,7 +8094,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_PKGHANDLER+:} false; then :
+if test "${ac_cv_prog_PKGHANDLER+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$PKGHANDLER"; then
@@ -8462,7 +8459,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_CHECK_GMAKE+:} false; then :
+if test "${ac_cv_path_CHECK_GMAKE+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $CHECK_GMAKE in
@@ -8816,7 +8813,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_CHECK_MAKE+:} false; then :
+if test "${ac_cv_path_CHECK_MAKE+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $CHECK_MAKE in
@@ -9175,7 +9172,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_CHECK_TOOLSDIR_GMAKE+:} false; then :
+if test "${ac_cv_path_CHECK_TOOLSDIR_GMAKE+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $CHECK_TOOLSDIR_GMAKE in
@@ -9528,7 +9525,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_CHECK_TOOLSDIR_MAKE+:} false; then :
+if test "${ac_cv_path_CHECK_TOOLSDIR_MAKE+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $CHECK_TOOLSDIR_MAKE in
@@ -9924,7 +9921,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_UNZIP+:} false; then :
+if test "${ac_cv_path_UNZIP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $UNZIP in
@@ -9983,7 +9980,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ZIP+:} false; then :
+if test "${ac_cv_path_ZIP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $ZIP in
@@ -10042,7 +10039,7 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;}
set dummy ldd; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_LDD+:} false; then :
+if test "${ac_cv_path_LDD+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $LDD in
@@ -10088,7 +10085,7 @@ fi
set dummy otool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_OTOOL+:} false; then :
+if test "${ac_cv_path_OTOOL+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $OTOOL in
@@ -10133,7 +10130,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_READELF+:} false; then :
+if test "${ac_cv_path_READELF+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $READELF in
@@ -10176,7 +10173,7 @@ done
set dummy hg; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_HG+:} false; then :
+if test "${ac_cv_path_HG+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $HG in
@@ -10216,7 +10213,7 @@ fi
set dummy stat; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_STAT+:} false; then :
+if test "${ac_cv_path_STAT+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $STAT in
@@ -10256,7 +10253,7 @@ fi
set dummy time; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_TIME+:} false; then :
+if test "${ac_cv_path_TIME+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $TIME in
@@ -10301,7 +10298,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_COMM+:} false; then :
+if test "${ac_cv_path_COMM+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $COMM in
@@ -10365,7 +10362,7 @@ if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_PKG_CONFIG+:} false; then :
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $PKG_CONFIG in
@@ -10408,7 +10405,7 @@ if test -z "$ac_cv_path_PKG_CONFIG"; then
set dummy pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $ac_pt_PKG_CONFIG in
@@ -10581,7 +10578,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_BDEPS_UNZIP+:} false; then :
+if test "${ac_cv_prog_BDEPS_UNZIP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$BDEPS_UNZIP"; then
@@ -10627,7 +10624,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_BDEPS_FTP+:} false; then :
+if test "${ac_cv_prog_BDEPS_FTP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$BDEPS_FTP"; then
@@ -11894,7 +11891,7 @@ $as_echo "$BOOT_JDK_VERSION" >&6; }
set dummy javac; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_JAVAC_CHECK+:} false; then :
+if test "${ac_cv_path_JAVAC_CHECK+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $JAVAC_CHECK in
@@ -11934,7 +11931,7 @@ fi
set dummy java; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_JAVA_CHECK+:} false; then :
+if test "${ac_cv_path_JAVA_CHECK+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $JAVA_CHECK in
@@ -15993,7 +15990,7 @@ if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
set dummy link; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_CYGWIN_LINK+:} false; then :
+if test "${ac_cv_path_CYGWIN_LINK+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $CYGWIN_LINK in
@@ -16982,7 +16979,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_BUILD_CC+:} false; then :
+if test "${ac_cv_path_BUILD_CC+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $BUILD_CC in
@@ -17293,7 +17290,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_BUILD_CXX+:} false; then :
+if test "${ac_cv_path_BUILD_CXX+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $BUILD_CXX in
@@ -17602,7 +17599,7 @@ $as_echo "$as_me: Rewriting BUILD_CXX to \"$new_complete\"" >&6;}
set dummy ld; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_BUILD_LD+:} false; then :
+if test "${ac_cv_path_BUILD_LD+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $BUILD_LD in
@@ -18114,7 +18111,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_TOOLS_DIR_CC+:} false; then :
+if test "${ac_cv_path_TOOLS_DIR_CC+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $TOOLS_DIR_CC in
@@ -18166,7 +18163,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_POTENTIAL_CC+:} false; then :
+if test "${ac_cv_path_POTENTIAL_CC+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $POTENTIAL_CC in
@@ -18579,7 +18576,7 @@ $as_echo "yes, trying to find proper $COMPILER_NAME compiler" >&6; }
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_PROPER_COMPILER_CC+:} false; then :
+if test "${ac_cv_prog_PROPER_COMPILER_CC+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$PROPER_COMPILER_CC"; then
@@ -18623,7 +18620,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_PROPER_COMPILER_CC+:} false; then :
+if test "${ac_cv_prog_ac_ct_PROPER_COMPILER_CC+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_PROPER_COMPILER_CC"; then
@@ -19073,7 +19070,7 @@ if test -n "$ac_tool_prefix"; then
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
+if test "${ac_cv_prog_CC+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
@@ -19117,7 +19114,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_CC"; then
@@ -19170,7 +19167,7 @@ fi
test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
+See \`config.log' for more details" "$LINENO" 5 ; }
# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
@@ -19285,7 +19282,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5; }
+See \`config.log' for more details" "$LINENO" 5 ; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
@@ -19328,7 +19325,7 @@ else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5; }
+See \`config.log' for more details" "$LINENO" 5 ; }
fi
rm -f conftest conftest$ac_cv_exeext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
@@ -19387,7 +19384,7 @@ $as_echo "$ac_try_echo"; } >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5; }
+See \`config.log' for more details" "$LINENO" 5 ; }
fi
fi
fi
@@ -19398,7 +19395,7 @@ rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
+if test "${ac_cv_objext+set}" = set; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -19439,7 +19436,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5; }
+See \`config.log' for more details" "$LINENO" 5 ; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
@@ -19449,7 +19446,7 @@ OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
+if test "${ac_cv_c_compiler_gnu+set}" = set; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -19486,7 +19483,7 @@ ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
+if test "${ac_cv_prog_cc_g+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_save_c_werror_flag=$ac_c_werror_flag
@@ -19564,7 +19561,7 @@ else
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
+if test "${ac_cv_prog_cc_c89+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_cv_prog_cc_c89=no
@@ -19683,7 +19680,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_TOOLS_DIR_CXX+:} false; then :
+if test "${ac_cv_path_TOOLS_DIR_CXX+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $TOOLS_DIR_CXX in
@@ -19735,7 +19732,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_POTENTIAL_CXX+:} false; then :
+if test "${ac_cv_path_POTENTIAL_CXX+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $POTENTIAL_CXX in
@@ -20148,7 +20145,7 @@ $as_echo "yes, trying to find proper $COMPILER_NAME compiler" >&6; }
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_PROPER_COMPILER_CXX+:} false; then :
+if test "${ac_cv_prog_PROPER_COMPILER_CXX+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$PROPER_COMPILER_CXX"; then
@@ -20192,7 +20189,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_PROPER_COMPILER_CXX+:} false; then :
+if test "${ac_cv_prog_ac_ct_PROPER_COMPILER_CXX+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_PROPER_COMPILER_CXX"; then
@@ -20646,7 +20643,7 @@ if test -z "$CXX"; then
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CXX+:} false; then :
+if test "${ac_cv_prog_CXX+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CXX"; then
@@ -20690,7 +20687,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_CXX"; then
@@ -20768,7 +20765,7 @@ done
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if ${ac_cv_cxx_compiler_gnu+:} false; then :
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -20805,7 +20802,7 @@ ac_test_CXXFLAGS=${CXXFLAGS+set}
ac_save_CXXFLAGS=$CXXFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if ${ac_cv_prog_cxx_g+:} false; then :
+if test "${ac_cv_prog_cxx_g+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_save_cxx_werror_flag=$ac_cxx_werror_flag
@@ -20903,7 +20900,7 @@ if test -n "$ac_tool_prefix"; then
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OBJC+:} false; then :
+if test "${ac_cv_prog_OBJC+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$OBJC"; then
@@ -20947,7 +20944,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OBJC+:} false; then :
+if test "${ac_cv_prog_ac_ct_OBJC+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_OBJC"; then
@@ -21023,7 +21020,7 @@ done
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Objective C compiler" >&5
$as_echo_n "checking whether we are using the GNU Objective C compiler... " >&6; }
-if ${ac_cv_objc_compiler_gnu+:} false; then :
+if test "${ac_cv_objc_compiler_gnu+set}" = set; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -21060,7 +21057,7 @@ ac_test_OBJCFLAGS=${OBJCFLAGS+set}
ac_save_OBJCFLAGS=$OBJCFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $OBJC accepts -g" >&5
$as_echo_n "checking whether $OBJC accepts -g... " >&6; }
-if ${ac_cv_prog_objc_g+:} false; then :
+if test "${ac_cv_prog_objc_g+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_save_objc_werror_flag=$ac_objc_werror_flag
@@ -21436,7 +21433,7 @@ if test "x$OPENJDK_TARGET_OS" != xwindows; then
set dummy ${ac_tool_prefix}ar; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AR+:} false; then :
+if test "${ac_cv_prog_AR+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$AR"; then
@@ -21476,7 +21473,7 @@ if test -z "$ac_cv_prog_AR"; then
set dummy ar; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_AR+:} false; then :
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_AR"; then
@@ -21818,7 +21815,7 @@ if test "x$OPENJDK_TARGET_OS" = xwindows; then :
set dummy link; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_WINLD+:} false; then :
+if test "${ac_cv_prog_WINLD+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$WINLD"; then
@@ -22157,7 +22154,7 @@ $as_echo "yes" >&6; }
set dummy mt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MT+:} false; then :
+if test "${ac_cv_prog_MT+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$MT"; then
@@ -22478,7 +22475,7 @@ $as_echo "$as_me: Rewriting MT to \"$new_complete\"" >&6;}
set dummy rc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RC+:} false; then :
+if test "${ac_cv_prog_RC+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$RC"; then
@@ -22869,7 +22866,7 @@ fi
set dummy lib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_WINAR+:} false; then :
+if test "${ac_cv_prog_WINAR+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$WINAR"; then
@@ -23175,7 +23172,7 @@ $as_echo "$as_me: Rewriting WINAR to \"$new_complete\"" >&6;}
set dummy dumpbin; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DUMPBIN+:} false; then :
+if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$DUMPBIN"; then
@@ -23494,7 +23491,7 @@ if test -n "$CPP" && test -d "$CPP"; then
CPP=
fi
if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
+ if test "${ac_cv_prog_CPP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
# Double quotes because CPP needs to be expanded
@@ -23610,7 +23607,7 @@ else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
+See \`config.log' for more details" "$LINENO" 5 ; }
fi
ac_ext=cpp
@@ -23894,7 +23891,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
if test -z "$CXXCPP"; then
- if ${ac_cv_prog_CXXCPP+:} false; then :
+ if test "${ac_cv_prog_CXXCPP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
# Double quotes because CXXCPP needs to be expanded
@@ -24010,7 +24007,7 @@ else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
+See \`config.log' for more details" "$LINENO" 5 ; }
fi
ac_ext=cpp
@@ -24312,7 +24309,7 @@ if test "x$OPENJDK_TARGET_OS" = xsolaris; then
set dummy as; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_AS+:} false; then :
+if test "${ac_cv_path_AS+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $AS in
@@ -24626,7 +24623,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_NM+:} false; then :
+if test "${ac_cv_path_NM+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $NM in
@@ -24935,7 +24932,7 @@ $as_echo "$as_me: Rewriting NM to \"$new_complete\"" >&6;}
set dummy strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_STRIP+:} false; then :
+if test "${ac_cv_path_STRIP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $STRIP in
@@ -25241,7 +25238,7 @@ $as_echo "$as_me: Rewriting STRIP to \"$new_complete\"" >&6;}
set dummy mcs; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MCS+:} false; then :
+if test "${ac_cv_path_MCS+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $MCS in
@@ -25549,7 +25546,7 @@ elif test "x$OPENJDK_TARGET_OS" != xwindows; then
set dummy ${ac_tool_prefix}nm; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_NM+:} false; then :
+if test "${ac_cv_prog_NM+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$NM"; then
@@ -25589,7 +25586,7 @@ if test -z "$ac_cv_prog_NM"; then
set dummy nm; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_NM+:} false; then :
+if test "${ac_cv_prog_ac_ct_NM+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_NM"; then
@@ -25907,7 +25904,7 @@ $as_echo "$as_me: Rewriting NM to \"$new_complete\"" >&6;}
set dummy ${ac_tool_prefix}strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_STRIP+:} false; then :
+if test "${ac_cv_prog_STRIP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$STRIP"; then
@@ -25947,7 +25944,7 @@ if test -z "$ac_cv_prog_STRIP"; then
set dummy strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_STRIP"; then
@@ -26272,7 +26269,7 @@ if test "x$OPENJDK_TARGET_OS" = xsolaris || test "x$OPENJDK_TARGET_OS" = xlinux;
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OBJCOPY+:} false; then :
+if test "${ac_cv_prog_OBJCOPY+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$OBJCOPY"; then
@@ -26316,7 +26313,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OBJCOPY+:} false; then :
+if test "${ac_cv_prog_ac_ct_OBJCOPY+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_OBJCOPY"; then
@@ -26643,7 +26640,7 @@ if test -n "$ac_tool_prefix"; then
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OBJDUMP+:} false; then :
+if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$OBJDUMP"; then
@@ -26687,7 +26684,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_OBJDUMP"; then
@@ -27011,7 +27008,7 @@ if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then
set dummy lipo; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_LIPO+:} false; then :
+if test "${ac_cv_path_LIPO+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $LIPO in
@@ -27326,7 +27323,7 @@ PATH="$OLD_PATH"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
+if test "${ac_cv_header_stdc+set}" = set; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -27502,7 +27499,7 @@ fi
for ac_header in stdio.h
do :
ac_fn_cxx_check_header_mongrel "$LINENO" "stdio.h" "ac_cv_header_stdio_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdio_h" = xyes; then :
+if test "x$ac_cv_header_stdio_h" = x""yes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_STDIO_H 1
_ACEOF
@@ -27531,7 +27528,7 @@ done
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int *" >&5
$as_echo_n "checking size of int *... " >&6; }
-if ${ac_cv_sizeof_int_p+:} false; then :
+if test "${ac_cv_sizeof_int_p+set}" = set; then :
$as_echo_n "(cached) " >&6
else
if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (int *))" "ac_cv_sizeof_int_p" "$ac_includes_default"; then :
@@ -27541,7 +27538,7 @@ else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (int *)
-See \`config.log' for more details" "$LINENO" 5; }
+See \`config.log' for more details" "$LINENO" 5 ; }
else
ac_cv_sizeof_int_p=0
fi
@@ -27588,7 +27585,7 @@ $as_echo "$OPENJDK_TARGET_CPU_BITS bits" >&6; }
#
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
-if ${ac_cv_c_bigendian+:} false; then :
+if test "${ac_cv_c_bigendian+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_cv_c_bigendian=unknown
@@ -28242,10 +28239,17 @@ if test "x$OPENJDK_TARGET_OS" = xsolaris; then
fi
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMACOSX -D_ALLBSD_SOURCE"
- # Adding these macros will make it an error to link to mac APIs newer than OS version 10.7
- MACOSX_REQUIRED_VERSION=1070
+ # Setting these parameters makes it an error to link to macosx APIs that are
+ # newer than the given OS version and makes the linked binaries compatible even
+ # if built on a newer version of the OS.
+ # The expected format is X.Y.Z
+ MACOSX_VERSION_MIN=10.7.0
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(MACOSX_REQUIRED_VERSION) -DMAC_OS_X_VERSION_MIN_REQUIRED=\$(MACOSX_REQUIRED_VERSION)"
+ # The macro takes the version with no dots, ex: 1070
+ # Let the flags variables get resolved in make for easier override on make
+ # command line.
+ CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
+ LDFLAGS_JDK="$LDFLAGS_JDK -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
fi
if test "x$OPENJDK_TARGET_OS" = xbsd; then
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DBSD -D_ALLBSD_SOURCE"
@@ -28592,8 +28596,8 @@ if test "x$with_x" = xno; then
have_x=disabled
else
case $x_includes,$x_libraries in #(
- *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #(
- *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then :
+ *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5 ;; #(
+ *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then :
$as_echo_n "(cached) " >&6
else
# One or both of the vars are not set, and there is no cached value.
@@ -28870,7 +28874,7 @@ if ac_fn_cxx_try_link "$LINENO"; then :
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5
$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; }
-if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then :
+if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -28904,14 +28908,14 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; }
-if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then :
+if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
fi
if test $ac_cv_lib_dnet_dnet_ntoa = no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5
$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; }
-if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then :
+if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -28945,7 +28949,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; }
-if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then :
+if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
fi
@@ -28964,14 +28968,14 @@ rm -f core conftest.err conftest.$ac_objext \
# The functions gethostbyname, getservbyname, and inet_addr are
# in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
ac_fn_cxx_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
-if test "x$ac_cv_func_gethostbyname" = xyes; then :
+if test "x$ac_cv_func_gethostbyname" = x""yes; then :
fi
if test $ac_cv_func_gethostbyname = no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
$as_echo_n "checking for gethostbyname in -lnsl... " >&6; }
-if ${ac_cv_lib_nsl_gethostbyname+:} false; then :
+if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -29005,14 +29009,14 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5
$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
-if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then :
+if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
fi
if test $ac_cv_lib_nsl_gethostbyname = no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5
$as_echo_n "checking for gethostbyname in -lbsd... " >&6; }
-if ${ac_cv_lib_bsd_gethostbyname+:} false; then :
+if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -29046,7 +29050,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5
$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; }
-if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then :
+if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
fi
@@ -29061,14 +29065,14 @@ fi
# must be given before -lnsl if both are needed. We assume that
# if connect needs -lnsl, so does gethostbyname.
ac_fn_cxx_check_func "$LINENO" "connect" "ac_cv_func_connect"
-if test "x$ac_cv_func_connect" = xyes; then :
+if test "x$ac_cv_func_connect" = x""yes; then :
fi
if test $ac_cv_func_connect = no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5
$as_echo_n "checking for connect in -lsocket... " >&6; }
-if ${ac_cv_lib_socket_connect+:} false; then :
+if test "${ac_cv_lib_socket_connect+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -29102,7 +29106,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5
$as_echo "$ac_cv_lib_socket_connect" >&6; }
-if test "x$ac_cv_lib_socket_connect" = xyes; then :
+if test "x$ac_cv_lib_socket_connect" = x""yes; then :
X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
fi
@@ -29110,14 +29114,14 @@ fi
# Guillermo Gomez says -lposix is necessary on A/UX.
ac_fn_cxx_check_func "$LINENO" "remove" "ac_cv_func_remove"
-if test "x$ac_cv_func_remove" = xyes; then :
+if test "x$ac_cv_func_remove" = x""yes; then :
fi
if test $ac_cv_func_remove = no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5
$as_echo_n "checking for remove in -lposix... " >&6; }
-if ${ac_cv_lib_posix_remove+:} false; then :
+if test "${ac_cv_lib_posix_remove+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -29151,7 +29155,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5
$as_echo "$ac_cv_lib_posix_remove" >&6; }
-if test "x$ac_cv_lib_posix_remove" = xyes; then :
+if test "x$ac_cv_lib_posix_remove" = x""yes; then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
fi
@@ -29159,14 +29163,14 @@ fi
# BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
ac_fn_cxx_check_func "$LINENO" "shmat" "ac_cv_func_shmat"
-if test "x$ac_cv_func_shmat" = xyes; then :
+if test "x$ac_cv_func_shmat" = x""yes; then :
fi
if test $ac_cv_func_shmat = no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5
$as_echo_n "checking for shmat in -lipc... " >&6; }
-if ${ac_cv_lib_ipc_shmat+:} false; then :
+if test "${ac_cv_lib_ipc_shmat+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -29200,7 +29204,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5
$as_echo "$ac_cv_lib_ipc_shmat" >&6; }
-if test "x$ac_cv_lib_ipc_shmat" = xyes; then :
+if test "x$ac_cv_lib_ipc_shmat" = x""yes; then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
fi
@@ -29218,7 +29222,7 @@ fi
# John Interrante, Karl Berry
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5
$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; }
-if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then :
+if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -29252,7 +29256,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; }
-if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then :
+if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then :
X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
fi
@@ -30265,7 +30269,7 @@ $as_echo "$FREETYPE2_FOUND" >&6; }
LDFLAGS="$FREETYPE2_LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FT_Init_FreeType in -lfreetype" >&5
$as_echo_n "checking for FT_Init_FreeType in -lfreetype... " >&6; }
-if ${ac_cv_lib_freetype_FT_Init_FreeType+:} false; then :
+if test "${ac_cv_lib_freetype_FT_Init_FreeType+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -30299,7 +30303,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freetype_FT_Init_FreeType" >&5
$as_echo "$ac_cv_lib_freetype_FT_Init_FreeType" >&6; }
-if test "x$ac_cv_lib_freetype_FT_Init_FreeType" = xyes; then :
+if test "x$ac_cv_lib_freetype_FT_Init_FreeType" = x""yes; then :
FREETYPE2_FOUND=true
else
as_fn_error $? "Could not find freetype2! $HELP_MSG " "$LINENO" 5
@@ -30587,7 +30591,7 @@ fi
for ac_header in alsa/asoundlib.h
do :
ac_fn_cxx_check_header_mongrel "$LINENO" "alsa/asoundlib.h" "ac_cv_header_alsa_asoundlib_h" "$ac_includes_default"
-if test "x$ac_cv_header_alsa_asoundlib_h" = xyes; then :
+if test "x$ac_cv_header_alsa_asoundlib_h" = x""yes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_ALSA_ASOUNDLIB_H 1
_ACEOF
@@ -30646,7 +30650,7 @@ fi
USE_EXTERNAL_LIBJPEG=true
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -ljpeg" >&5
$as_echo_n "checking for main in -ljpeg... " >&6; }
-if ${ac_cv_lib_jpeg_main+:} false; then :
+if test "${ac_cv_lib_jpeg_main+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -30674,7 +30678,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_main" >&5
$as_echo "$ac_cv_lib_jpeg_main" >&6; }
-if test "x$ac_cv_lib_jpeg_main" = xyes; then :
+if test "x$ac_cv_lib_jpeg_main" = x""yes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBJPEG 1
_ACEOF
@@ -30698,7 +30702,7 @@ fi
USE_EXTERNAL_LIBJPEG=true
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lgif" >&5
$as_echo_n "checking for main in -lgif... " >&6; }
-if ${ac_cv_lib_gif_main+:} false; then :
+if test "${ac_cv_lib_gif_main+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -30726,7 +30730,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gif_main" >&5
$as_echo "$ac_cv_lib_gif_main" >&6; }
-if test "x$ac_cv_lib_gif_main" = xyes; then :
+if test "x$ac_cv_lib_gif_main" = x""yes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBGIF 1
_ACEOF
@@ -30756,7 +30760,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compress in -lz" >&5
$as_echo_n "checking for compress in -lz... " >&6; }
-if ${ac_cv_lib_z_compress+:} false; then :
+if test "${ac_cv_lib_z_compress+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -30790,7 +30794,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_compress" >&5
$as_echo "$ac_cv_lib_z_compress" >&6; }
-if test "x$ac_cv_lib_z_compress" = xyes; then :
+if test "x$ac_cv_lib_z_compress" = x""yes; then :
ZLIB_FOUND=yes
else
ZLIB_FOUND=no
@@ -30883,7 +30887,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5
$as_echo_n "checking for cos in -lm... " >&6; }
-if ${ac_cv_lib_m_cos+:} false; then :
+if test "${ac_cv_lib_m_cos+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -30917,7 +30921,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5
$as_echo "$ac_cv_lib_m_cos" >&6; }
-if test "x$ac_cv_lib_m_cos" = xyes; then :
+if test "x$ac_cv_lib_m_cos" = x""yes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBM 1
_ACEOF
@@ -30941,7 +30945,7 @@ save_LIBS="$LIBS"
LIBS=""
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -30975,7 +30979,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBDL 1
_ACEOF
@@ -31226,14 +31230,14 @@ fi
###############################################################################
-# How many cores do we have on this build system?
+ # How many cores do we have on this build system?
# Check whether --with-num-cores was given.
if test "${with_num_cores+set}" = set; then :
withval=$with_num_cores;
fi
-if test "x$with_num_cores" = x; then
+ if test "x$with_num_cores" = x; then
# The number of cores were not specified, try to probe them.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for number of cores" >&5
@@ -31259,10 +31263,6 @@ $as_echo_n "checking for number of cores... " >&6; }
FOUND_CORES=yes
fi
- # For c/c++ code we run twice as many concurrent build
- # jobs than we have cores, otherwise we will stall on io.
- CONCURRENT_BUILD_JOBS=`expr $NUM_CORES \* 2`
-
if test "x$FOUND_CORES" = xyes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $NUM_CORES" >&5
$as_echo "$NUM_CORES" >&6; }
@@ -31274,22 +31274,20 @@ $as_echo "$as_me: WARNING: This will disable all parallelism from build!" >&2;}
fi
-else
+ else
NUM_CORES=$with_num_cores
- CONCURRENT_BUILD_JOBS=`expr $NUM_CORES \* 2`
-fi
+ fi
-
-# How much memory do we have on this build system?
+ # How much memory do we have on this build system?
# Check whether --with-memory-size was given.
if test "${with_memory_size+set}" = set; then :
withval=$with_memory_size;
fi
-if test "x$with_memory_size" = x; then
+ if test "x$with_memory_size" = x; then
# The memory size was not specified, try to probe it.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for memory size" >&5
@@ -31329,10 +31327,46 @@ $as_echo "could not detect memory size, defaulting to 1024 MB" >&6; }
$as_echo "$as_me: WARNING: This might seriously impact build performance!" >&2;}
fi
-else
+ else
MEMORY_SIZE=$with_memory_size
+ fi
+
+
+
+ # Provide a decent default number of parallel jobs for make depending on
+ # number of cores, amount of memory and machine architecture.
+
+# Check whether --with-jobs was given.
+if test "${with_jobs+set}" = set; then :
+ withval=$with_jobs;
fi
+ if test "x$with_jobs" = x; then
+ # Number of jobs was not specified, calculate.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for appropriate number of jobs to run in parallel" >&5
+$as_echo_n "checking for appropriate number of jobs to run in parallel... " >&6; }
+ # Approximate memory in GB, rounding up a bit.
+ memory_gb=`expr $MEMORY_SIZE / 1100`
+ # Pick the lowest of memory in gb and number of cores.
+ if test "$memory_gb" -lt "$NUM_CORES"; then
+ JOBS="$memory_gb"
+ else
+ JOBS="$NUM_CORES"
+ # On bigger machines, leave some room for other processes to run
+ if test "$JOBS" -gt "4"; then
+ JOBS=`expr $JOBS '*' 90 / 100`
+ fi
+ fi
+ # Cap number of jobs to 16
+ if test "$JOBS" -gt "16"; then
+ JOBS=16
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JOBS" >&5
+$as_echo "$JOBS" >&6; }
+ else
+ JOBS=$with_jobs
+ fi
+
# Setup smart javac (after cores and memory have been setup)
@@ -31619,7 +31653,7 @@ fi
set dummy ccache; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_CCACHE+:} false; then :
+if test "${ac_cv_path_CCACHE+set}" = set; then :
$as_echo_n "(cached) " >&6
else
case $CCACHE in
@@ -31880,21 +31914,10 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
- if test "x$cache_file" != "x/dev/null"; then
+ test "x$cache_file" != "x/dev/null" &&
{ $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
$as_echo "$as_me: updating cache $cache_file" >&6;}
- if test ! -f "$cache_file" || test -h "$cache_file"; then
- cat confcache >"$cache_file"
- else
- case $cache_file in #(
- */* | ?:*)
- mv -f confcache "$cache_file"$$ &&
- mv -f "$cache_file"$$ "$cache_file" ;; #(
- *)
- mv -f confcache "$cache_file" ;;
- esac
- fi
- fi
+ cat confcache >$cache_file
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
@@ -31926,7 +31949,7 @@ LTLIBOBJS=$ac_ltlibobjs
-: "${CONFIG_STATUS=./config.status}"
+: ${CONFIG_STATUS=./config.status}
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
@@ -32027,7 +32050,6 @@ fi
IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator.
-as_myself=
case $0 in #((
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -32335,7 +32357,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# values after options handling.
ac_log="
This file was extended by OpenJDK $as_me jdk8, which was
-generated by GNU Autoconf 2.68. Invocation command line was
+generated by GNU Autoconf 2.67. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -32398,7 +32420,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
OpenJDK config.status jdk8
-configured by $0, generated by GNU Autoconf 2.68,
+configured by $0, generated by GNU Autoconf 2.67,
with options \\"\$ac_cs_config\\"
Copyright (C) 2010 Free Software Foundation, Inc.
@@ -32527,7 +32549,7 @@ do
"$OUTPUT_ROOT/spec.sh") CONFIG_FILES="$CONFIG_FILES $OUTPUT_ROOT/spec.sh:$AUTOCONF_DIR/spec.sh.in" ;;
"$OUTPUT_ROOT/Makefile") CONFIG_FILES="$CONFIG_FILES $OUTPUT_ROOT/Makefile:$AUTOCONF_DIR/Makefile.in" ;;
- *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;;
esac
done
@@ -32549,10 +32571,9 @@ fi
# after its creation but before its name has been assigned to `$tmp'.
$debug ||
{
- tmp= ac_tmp=
+ tmp=
trap 'exit_status=$?
- : "${ac_tmp:=$tmp}"
- { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
' 0
trap 'as_fn_exit 1' 1 2 13 15
}
@@ -32560,13 +32581,12 @@ $debug ||
{
tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
- test -d "$tmp"
+ test -n "$tmp" && test -d "$tmp"
} ||
{
tmp=./conf$$-$RANDOM
(umask 077 && mkdir "$tmp")
} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
-ac_tmp=$tmp
# Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES.
@@ -32588,7 +32608,7 @@ else
ac_cs_awk_cr=$ac_cr
fi
-echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+echo 'BEGIN {' >"$tmp/subs1.awk" &&
_ACEOF
@@ -32616,7 +32636,7 @@ done
rm -f conf$$subs.sh
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
_ACEOF
sed -n '
h
@@ -32664,7 +32684,7 @@ t delim
rm -f conf$$subs.awk
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACAWK
-cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+cat >>"\$tmp/subs1.awk" <<_ACAWK &&
for (key in S) S_is_set[key] = 1
FS = ""
@@ -32696,7 +32716,7 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
else
cat
-fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
|| as_fn_error $? "could not setup config files machinery" "$LINENO" 5
_ACEOF
@@ -32730,7 +32750,7 @@ fi # test -n "$CONFIG_FILES"
# No need to generate them if there are no CONFIG_HEADERS.
# This happens for instance with `./config.status Makefile'.
if test -n "$CONFIG_HEADERS"; then
-cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+cat >"$tmp/defines.awk" <<\_ACAWK ||
BEGIN {
_ACEOF
@@ -32742,8 +32762,8 @@ _ACEOF
# handling of long lines.
ac_delim='%!_!# '
for ac_last_try in false false :; do
- ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
- if test -z "$ac_tt"; then
+ ac_t=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_t"; then
break
elif $ac_last_try; then
as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
@@ -32844,7 +32864,7 @@ do
esac
case $ac_mode$ac_tag in
:[FHL]*:*);;
- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;;
:[FH]-) ac_tag=-:-;;
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
esac
@@ -32863,7 +32883,7 @@ do
for ac_f
do
case $ac_f in
- -) ac_f="$ac_tmp/stdin";;
+ -) ac_f="$tmp/stdin";;
*) # Look for the file first in the build tree, then in the source tree
# (if the path is not absolute). The absolute path cannot be DOS-style,
# because $ac_f cannot contain `:'.
@@ -32872,7 +32892,7 @@ do
[\\/$]*) false;;
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
esac ||
- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;;
esac
case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
@@ -32898,8 +32918,8 @@ $as_echo "$as_me: creating $ac_file" >&6;}
esac
case $ac_tag in
- *:-:* | *:-) cat >"$ac_tmp/stdin" \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ *:-:* | *:-) cat >"$tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
esac
;;
esac
@@ -33024,22 +33044,21 @@ s&@abs_builddir@&$ac_abs_builddir&;t t
s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
$ac_datarootdir_hack
"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
- >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
- { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
- "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
- rm -f "$ac_tmp/stdin"
+ rm -f "$tmp/stdin"
case $ac_file in
- -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
- *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ -) cat "$tmp/out" && rm -f "$tmp/out";;
+ *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
esac \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
;;
@@ -33050,20 +33069,20 @@ which seems to be undefined. Please make sure it is defined" >&2;}
if test x"$ac_file" != x-; then
{
$as_echo "/* $configure_input */" \
- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
- } >"$ac_tmp/config.h" \
+ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
+ } >"$tmp/config.h" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
- if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
$as_echo "$as_me: $ac_file is unchanged" >&6;}
else
rm -f "$ac_file"
- mv "$ac_tmp/config.h" "$ac_file" \
+ mv "$tmp/config.h" "$ac_file" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
fi
else
$as_echo "/* $configure_input */" \
- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
|| as_fn_error $? "could not create -" "$LINENO" 5
fi
;;
@@ -33159,7 +33178,7 @@ printf "* C++ Compiler: $CXX_VENDOR version $CXX_VERSION (at $CXX)\n"
printf "\n"
printf "Build performance summary:\n"
-printf "* Cores to use: $NUM_CORES\n"
+printf "* Cores to use: $JOBS\n"
printf "* Memory limit: $MEMORY_SIZE MB\n"
printf "* ccache status: $CCACHE_STATUS\n"
printf "\n"
diff --git a/common/autoconf/help.m4 b/common/autoconf/help.m4
index 12ff371dd20..cf4a43e2dd1 100644
--- a/common/autoconf/help.m4
+++ b/common/autoconf/help.m4
@@ -174,7 +174,7 @@ printf "* C++ Compiler: $CXX_VENDOR version $CXX_VERSION (at $CXX)\n"
printf "\n"
printf "Build performance summary:\n"
-printf "* Cores to use: $NUM_CORES\n"
+printf "* Cores to use: $JOBS\n"
printf "* Memory limit: $MEMORY_SIZE MB\n"
printf "* ccache status: $CCACHE_STATUS\n"
printf "\n"
diff --git a/common/autoconf/hotspot-spec.gmk.in b/common/autoconf/hotspot-spec.gmk.in
index afc887a5ec9..5b120e73335 100644
--- a/common/autoconf/hotspot-spec.gmk.in
+++ b/common/autoconf/hotspot-spec.gmk.in
@@ -80,7 +80,7 @@ ALT_EXPORT_PATH=$(HOTSPOT_DIST)
HOTSPOT_MAKE_ARGS:=@HOTSPOT_MAKE_ARGS@ @STATIC_CXX_SETTING@
# This is used from the libjvm build for C/C++ code.
-HOTSPOT_BUILD_JOBS:=@CONCURRENT_BUILD_JOBS@
+HOTSPOT_BUILD_JOBS:=$(JOBS)
# Control wether Hotspot runs Queens test after building
TEST_IN_BUILD=@TEST_IN_BUILD@
diff --git a/common/autoconf/spec.gmk.in b/common/autoconf/spec.gmk.in
index ec47d0364fd..358ad783833 100644
--- a/common/autoconf/spec.gmk.in
+++ b/common/autoconf/spec.gmk.in
@@ -260,6 +260,9 @@ ENABLE_SJAVAC:=@ENABLE_SJAVAC@
# the sjavac server log files.
SJAVAC_SERVER_DIR:=@SJAVAC_SERVER_DIR@
+# Number of parallel jobs to use for compilation
+JOBS?=@JOBS@
+
# The OpenJDK makefiles should be changed to using the standard
# configure output ..._CFLAGS and ..._LIBS. In the meantime we
# extract the information here.
@@ -283,7 +286,7 @@ X_LIBS:=@X_LIBS@
OPENWIN_HOME:=@OPENWIN_HOME@
# The lowest required version of macosx to enforce compatiblity for
-MACOSX_REQUIRED_VERSION=@MACOSX_REQUIRED_VERSION@
+MACOSX_VERSION_MIN=@MACOSX_VERSION_MIN@
# There are two types: CC or CL
# CC is gcc and others behaving reasonably similar.
diff --git a/common/autoconf/toolchain.m4 b/common/autoconf/toolchain.m4
index 740b0c48093..569da99c1c0 100644
--- a/common/autoconf/toolchain.m4
+++ b/common/autoconf/toolchain.m4
@@ -876,10 +876,17 @@ if test "x$OPENJDK_TARGET_OS" = xsolaris; then
fi
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMACOSX -D_ALLBSD_SOURCE"
- # Adding these macros will make it an error to link to mac APIs newer than OS version 10.7
- MACOSX_REQUIRED_VERSION=1070
- AC_SUBST(MACOSX_REQUIRED_VERSION)
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(MACOSX_REQUIRED_VERSION) -DMAC_OS_X_VERSION_MIN_REQUIRED=\$(MACOSX_REQUIRED_VERSION)"
+ # Setting these parameters makes it an error to link to macosx APIs that are
+ # newer than the given OS version and makes the linked binaries compatible even
+ # if built on a newer version of the OS.
+ # The expected format is X.Y.Z
+ MACOSX_VERSION_MIN=10.7.0
+ AC_SUBST(MACOSX_VERSION_MIN)
+ # The macro takes the version with no dots, ex: 1070
+ # Let the flags variables get resolved in make for easier override on make
+ # command line.
+ CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
+ LDFLAGS_JDK="$LDFLAGS_JDK -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
fi
if test "x$OPENJDK_TARGET_OS" = xbsd; then
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DBSD -D_ALLBSD_SOURCE"
diff --git a/common/makefiles/JavaCompilation.gmk b/common/makefiles/JavaCompilation.gmk
index 27257183ac6..bc13da5357b 100644
--- a/common/makefiles/JavaCompilation.gmk
+++ b/common/makefiles/JavaCompilation.gmk
@@ -501,7 +501,7 @@ define SetupJavaCompilation
$(ECHO) Compiling $1
($$($1_JVM) $$($1_SJAVAC) \
$$($1_REMOTE) \
- -j $(NUM_CORES) \
+ -j $(JOBS) \
--permit-unidentified-artifacts \
--permit-sources-without-package \
--compare-found-sources $$($1_BIN)/_the.batch.tmp \
diff --git a/common/makefiles/Main.gmk b/common/makefiles/Main.gmk
index 1fce2e25dc6..76a6faabfee 100644
--- a/common/makefiles/Main.gmk
+++ b/common/makefiles/Main.gmk
@@ -58,9 +58,6 @@ $(eval $(call ResetAllTimers))
# Setup number of jobs to use. -jN is unfortunately not available for us to parse from the command line,
# hence this workaround.
-ifeq ($(JOBS),)
- JOBS=$(NUM_CORES)
-endif
MAKE_ARGS:=$(MAKE_ARGS) -j$(JOBS)
### Main targets
diff --git a/corba/.hgtags b/corba/.hgtags
index 9267b551b70..c1ece0dcce9 100644
--- a/corba/.hgtags
+++ b/corba/.hgtags
@@ -200,3 +200,4 @@ d4e68ce17795601017ac2f952baad7272942c36e jdk8-b75
58be6ca3c0603882a1ec478724e337aac85e0da0 jdk8-b76
35684a40c5845782324dbcc9ac8969528020ff61 jdk8-b77
27d6368ae8ba570c31c2f0e696d39c99fa2f4538 jdk8-b78
+e41fb1aa0329767b2737303c994e38bede1baa07 jdk8-b79
diff --git a/hotspot/.hgtags b/hotspot/.hgtags
index 0a4d502faa4..f4baba41cfc 100644
--- a/hotspot/.hgtags
+++ b/hotspot/.hgtags
@@ -318,3 +318,5 @@ cdb46031e7184d37301288f5719121a63c7054b5 jdk8-b77
9f19f4a7d48a4ebe7f616b6068971ea5f8b075fa hs25-b19
d5e12e7d2f719144d84903d9151455661c47b476 jdk8-b78
555ec35a250783110aa070dbc8a8603f6cabe41f hs25-b20
+6691814929b606fe0e7954fd6e485dd876505c83 jdk8-b79
+df5396524152118535c36da5801d828b560d19a2 hs25-b21
diff --git a/hotspot/agent/make/Makefile b/hotspot/agent/make/Makefile
index a30a9998286..e00bbf2b36f 100644
--- a/hotspot/agent/make/Makefile
+++ b/hotspot/agent/make/Makefile
@@ -19,7 +19,7 @@
# 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.
-#
+#
#
# This guards against adding broken .java files to the directory
@@ -42,8 +42,6 @@ PKGLIST = \
sun.jvm.hotspot \
sun.jvm.hotspot.asm \
sun.jvm.hotspot.asm.sparc \
-sun.jvm.hotspot.bugspot \
-sun.jvm.hotspot.bugspot.tree \
sun.jvm.hotspot.c1 \
sun.jvm.hotspot.ci \
sun.jvm.hotspot.code \
@@ -84,7 +82,6 @@ sun.jvm.hotspot.gc_implementation.shared \
sun.jvm.hotspot.gc_interface \
sun.jvm.hotspot.interpreter \
sun.jvm.hotspot.jdi \
-sun.jvm.hotspot.livejvm \
sun.jvm.hotspot.memory \
sun.jvm.hotspot.opto \
sun.jvm.hotspot.oops \
@@ -130,8 +127,6 @@ FILELIST = \
sun/jvm/hotspot/*.java \
sun/jvm/hotspot/asm/*.java \
sun/jvm/hotspot/asm/sparc/*.java \
-sun/jvm/hotspot/bugspot/*.java \
-sun/jvm/hotspot/bugspot/tree/*.java \
sun/jvm/hotspot/c1/*.java \
sun/jvm/hotspot/ci/*.java \
sun/jvm/hotspot/code/*.java \
@@ -168,7 +163,6 @@ sun/jvm/hotspot/gc_implementation/parallelScavenge/*.java \
sun/jvm/hotspot/gc_implementation/shared/*.java \
sun/jvm/hotspot/interpreter/*.java \
sun/jvm/hotspot/jdi/*.java \
-sun/jvm/hotspot/livejvm/*.java \
sun/jvm/hotspot/memory/*.java \
sun/jvm/hotspot/oops/*.java \
sun/jvm/hotspot/opto/*.java \
@@ -205,7 +199,7 @@ sun/jvm/hotspot/utilities/*.java \
sun/jvm/hotspot/utilities/memo/*.java \
sun/jvm/hotspot/utilities/soql/*.java \
com/sun/java/swing/action/*.java \
-com/sun/java/swing/ui/*.java
+com/sun/java/swing/ui/*.java
#END FILELIST
ifneq "x$(ALT_BOOTDIR)" "x"
@@ -231,7 +225,7 @@ BUILD_DIR = ../build
OUTPUT_DIR = $(BUILD_DIR)/classes
DOC_DIR = $(BUILD_DIR)/doc
-# gnumake 3.78.1 does not accept the *s,
+# gnumake 3.78.1 does not accept the *s,
# so use the shell to expand them
ALLFILES := $(patsubst %,$(SRC_DIR)/%,$(FILELIST))
ALLFILES := $(shell /bin/ls $(ALLFILES))
@@ -303,7 +297,7 @@ sizes: $(ALLFILES)
cscope: $(ALLFILES)
rm -f java.files
echo $(ALLFILES) > java.files
- cscope -b -i java.files -f java.out
+ cscope -b -i java.files -f java.out
rm -f java.files
.PHONY: sa.jar
diff --git a/hotspot/agent/make/bugspot.bat b/hotspot/agent/make/bugspot.bat
deleted file mode 100644
index 4c81c0a477b..00000000000
--- a/hotspot/agent/make/bugspot.bat
+++ /dev/null
@@ -1,25 +0,0 @@
-REM
-REM Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
-REM DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-REM
-REM This code is free software; you can redistribute it and/or modify it
-REM under the terms of the GNU General Public License version 2 only, as
-REM published by the Free Software Foundation.
-REM
-REM This code is distributed in the hope that it will be useful, but WITHOUT
-REM ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-REM FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-REM version 2 for more details (a copy is included in the LICENSE file that
-REM accompanied this code).
-REM
-REM You should have received a copy of the GNU General Public License version
-REM 2 along with this work; if not, write to the Free Software Foundation,
-REM Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-REM
-REM Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-REM or visit www.oracle.com if you need additional information or have any
-REM questions.
-REM
-REM
-
-java -showversion -cp ..\build\classes;..\src\share\lib\js.jar;.\sa.jar;lib\js.jar sun.jvm.hotspot.bugspot.Main
diff --git a/hotspot/agent/make/marks_notes.html b/hotspot/agent/make/marks_notes.html
index 96b82356146..76fd46c8036 100644
--- a/hotspot/agent/make/marks_notes.html
+++ b/hotspot/agent/make/marks_notes.html
@@ -26,14 +26,12 @@
java -cp classes sun.jvm.hotspot.HSDB
-
java -cp classes sun.jvm.hotspot.bugspot.Main
Feedback
Refactoring of package hierarchy. All user interface components should be in
- the ui package. Perhaps: sun.jvm.hotspot.ui.hsdb.Main for the HSDB and
- sun.jvm.hotspot.ui.bugspot.Main for BugSpot.
+ the ui package. Perhaps: sun.jvm.hotspot.ui.hsdb.Main for the HSDB.
The src\share\vm\agent area seems like a workspace so it should be organized like
one. In particular, I'd like to suggest the following directory layout:
@@ -47,7 +45,7 @@
- Seems like there is a lot of redundant functionality. Between the HSDB and BugSpot. Perhaps
+ Seems like there is a lot of redundant functionality. Perhaps
this can be consolidated with a javax.swing.Actions architecture.
Tasklist
@@ -55,11 +53,7 @@
Stack memory pane:
It's one of the more useful JVM debugging tools in the SA. However, it
- doesn't support any interaction with the text; the Memory Panel in BugSpot
- was written afterward (with help from Shannon) and implements proper
- selection, scrolling, and drag-and-drop, but no annotations. I'm not sure how
- to integrate the annotations with the JTable that's being used for the memory
- view; if you have suggestions here please let me know.
+ doesn't support any interaction with the text.
Integrations with the NetBeans architecture (plug in). See the
Netbeans Open APIs homepage
diff --git a/hotspot/agent/src/os/win32/windbg/sawindbg.cpp b/hotspot/agent/src/os/win32/windbg/sawindbg.cpp
index 2ee4a2a02f1..5dd64f9e5ae 100644
--- a/hotspot/agent/src/os/win32/windbg/sawindbg.cpp
+++ b/hotspot/agent/src/os/win32/windbg/sawindbg.cpp
@@ -372,8 +372,7 @@ static bool attachToProcess(JNIEnv* env, jobject obj, jint pid) {
We are attaching to a process in 'read-only' mode. i.e., we do not want to
put breakpoints, suspend/resume threads etc. For read-only JDI and HSDB kind of
- usage this should suffice. We are not intending to use this for full-fledged
- ProcessControl implementation to be used with BugSpotAgent.
+ usage this should suffice.
Please refer to DEBUG_ATTACH_NONINVASIVE mode source comments from dbgeng.h.
In this mode, debug engine does not call DebugActiveProrcess. i.e., we are not
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/asm/amd64/AMD64FloatRegister.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/asm/amd64/AMD64FloatRegister.java
deleted file mode 100644
index 937a2c4efe7..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/asm/amd64/AMD64FloatRegister.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2003, 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 sun.jvm.hotspot.asm.amd64;
-
-import sun.jvm.hotspot.asm.Register;
-import sun.jvm.hotspot.utilities.Assert;
-
-public class AMD64FloatRegister extends Register {
-
- public AMD64FloatRegister(int number) {
- super(number);
- }
-
- public int getNumber() {
- return number;
- }
-
- public int getNumberOfRegisters() {
- return AMD64FloatRegisters.getNumRegisters();
- }
-
- public boolean isFloat() {
- return true;
- }
-
- public boolean isFramePointer() {
- return false;
- }
-
- public boolean isStackPointer() {
- return false;
- }
-
- public boolean isValid() {
- return number >= 0 && number < AMD64FloatRegisters.getNumRegisters();
- }
-
- public String toString() {
- return AMD64FloatRegisters.getRegisterName(number);
- }
-
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpot.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpot.java
deleted file mode 100644
index 2ff5308b158..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpot.java
+++ /dev/null
@@ -1,1536 +0,0 @@
-/*
- * Copyright (c) 2001, 2012, 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 sun.jvm.hotspot.bugspot;
-
-import java.awt.*;
-import java.awt.event.*;
-import java.io.*;
-import java.net.*;
-import java.util.*;
-import javax.swing.*;
-import javax.swing.filechooser.*;
-import sun.jvm.hotspot.debugger.*;
-import sun.jvm.hotspot.debugger.cdbg.*;
-import sun.jvm.hotspot.debugger.posix.*;
-import sun.jvm.hotspot.debugger.windbg.*;
-import sun.jvm.hotspot.livejvm.*;
-import sun.jvm.hotspot.memory.*;
-import sun.jvm.hotspot.oops.*;
-import sun.jvm.hotspot.runtime.*;
-import sun.jvm.hotspot.ui.*;
-import sun.jvm.hotspot.utilities.*;
-
-/** The BugSpot component. This is embeddable in an application by
- virtue of its being a JComponent. It (currently) requires the use
- of a menu bar which can be fetched via getMenuBar(). This is
- intended ultimately to replace HSDB. */
-
-public class BugSpot extends JPanel {
- public BugSpot() {
- super();
- Runtime.getRuntime().addShutdownHook(new java.lang.Thread() {
- public void run() {
- detachDebugger();
- }
- });
- }
-
- /** Turn on or off MDI (Multiple Document Interface) mode. When MDI
- is enabled, the BugSpot component contains a JDesktopPane and all
- windows are JInternalFrames. When disabled, only the menu bar is
- relevant. */
- public void setMDIMode(boolean onOrOff) {
- mdiMode = onOrOff;
- }
-
- /** Indicates whether MDI mode is enabled. */
- public boolean getMDIMode() {
- return mdiMode;
- }
-
- /** Build user interface widgets. This must be called before adding
- the BugSpot component to its parent. */
- public void build() {
- setLayout(new BorderLayout());
-
- menuBar = new JMenuBar();
-
- attachMenuItems = new java.util.ArrayList();
- detachMenuItems = new java.util.ArrayList();
- debugMenuItems = new java.util.ArrayList();
- suspendDebugMenuItems = new java.util.ArrayList();
- resumeDebugMenuItems = new java.util.ArrayList();
-
- //
- // File menu
- //
-
- JMenu menu = createMenu("File", 'F', 0);
- JMenuItem item;
- item = createMenuItem("Open source file...",
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- openSourceFile();
- }
- },
- KeyEvent.VK_O, InputEvent.CTRL_MASK,
- 'O', 0);
- menu.add(item);
- detachMenuItems.add(item);
-
- menu.addSeparator();
-
- item = createMenuItem("Attach to process...",
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- showAttachDialog();
- }
- },
- 'A', 0);
- menu.add(item);
- attachMenuItems.add(item);
-
- item = createMenuItem("Detach",
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- detach();
- }
- },
- 'D', 0);
- menu.add(item);
- detachMenuItems.add(item);
-
- // Disable detach menu items at first
- setMenuItemsEnabled(detachMenuItems, false);
-
- menu.addSeparator();
-
- menu.add(createMenuItem("Exit",
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- detach();
- System.exit(0);
- }
- },
- 'x', 1));
-
- menuBar.add(menu);
-
- //
- // Debug menu
- //
-
- debugMenu = createMenu("Debug", 'D', 0);
- item = createMenuItem("Go",
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if (!attached) return;
- if (!isSuspended()) return;
- resume();
- }
- },
- KeyEvent.VK_F5, 0,
- 'G', 0);
- debugMenu.add(item);
- resumeDebugMenuItems.add(item);
-
- item = createMenuItem("Break",
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if (!attached) {
- System.err.println("Not attached");
- return;
- }
- if (isSuspended()) {
- System.err.println("Already suspended");
- return;
- }
- suspend();
- }
- },
- 'B', 0);
- debugMenu.add(item);
- suspendDebugMenuItems.add(item);
-
- debugMenu.addSeparator();
-
- item = createMenuItem("Threads...",
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- showThreadsDialog();
- }
- },
- 'T', 0);
- debugMenu.add(item);
- debugMenuItems.add(item);
- // FIXME: belongs under "View -> Debug Windows"
- item = createMenuItem("Memory",
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- showMemoryDialog();
- }
- },
- 'M', 0);
- debugMenu.add(item);
- debugMenuItems.add(item);
-
- debugMenu.setEnabled(false);
- menuBar.add(debugMenu);
-
- if (mdiMode) {
- desktop = new JDesktopPane();
- add(desktop, BorderLayout.CENTER);
- }
-
- fixedWidthFont = GraphicsUtilities.lookupFont("Courier");
-
- debugEventTimer = new javax.swing.Timer(100, new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- pollForDebugEvent();
- }
- });
- }
-
- public JMenuBar getMenuBar() {
- return menuBar;
- }
-
- public void showAttachDialog() {
- setMenuItemsEnabled(attachMenuItems, false);
- final FrameWrapper attachDialog = newFrame("Attach to process");
- attachDialog.getContentPane().setLayout(new BorderLayout());
- attachDialog.setClosable(true);
- attachDialog.setResizable(true);
-
- JPanel panel = new JPanel();
- panel.setLayout(new BorderLayout());
- panel.setBorder(GraphicsUtilities.newBorder(5));
- attachDialog.setBackground(panel.getBackground());
-
- JPanel listPanel = new JPanel();
- listPanel.setLayout(new BorderLayout());
- final ProcessListPanel plist = new ProcessListPanel(getLocalDebugger());
- panel.add(plist, BorderLayout.CENTER);
- JCheckBox check = new JCheckBox("Update list continuously");
- check.addItemListener(new ItemListener() {
- public void itemStateChanged(ItemEvent e) {
- if (e.getStateChange() == ItemEvent.SELECTED) {
- plist.start();
- } else {
- plist.stop();
- }
- }
- });
- listPanel.add(plist, BorderLayout.CENTER);
- listPanel.add(check, BorderLayout.SOUTH);
- panel.add(listPanel, BorderLayout.CENTER);
- attachDialog.getContentPane().add(panel, BorderLayout.CENTER);
- attachDialog.setClosingActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- plist.stop();
- setMenuItemsEnabled(attachMenuItems, true);
- }
- });
-
- ActionListener attacher = new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- plist.stop();
- attachDialog.setVisible(false);
- removeFrame(attachDialog);
- ProcessInfo info = plist.getSelectedProcess();
- if (info != null) {
- attach(info.getPid());
- }
- }
- };
-
- Box hbox = Box.createHorizontalBox();
- hbox.add(Box.createGlue());
- JButton button = new JButton("OK");
- button.addActionListener(attacher);
- hbox.add(button);
- hbox.add(Box.createHorizontalStrut(20));
- button = new JButton("Cancel");
- button.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- plist.stop();
- attachDialog.setVisible(false);
- removeFrame(attachDialog);
- setMenuItemsEnabled(attachMenuItems, true);
- }
- });
- hbox.add(button);
- hbox.add(Box.createGlue());
- panel = new JPanel();
- panel.setBorder(GraphicsUtilities.newBorder(5));
- panel.add(hbox);
-
- attachDialog.getContentPane().add(panel, BorderLayout.SOUTH);
-
- addFrame(attachDialog);
- attachDialog.pack();
- attachDialog.setSize(400, 300);
- GraphicsUtilities.centerInContainer(attachDialog.getComponent(),
- getParentDimension(attachDialog.getComponent()));
- attachDialog.setVisible(true);
- }
-
- public void showThreadsDialog() {
- final FrameWrapper threadsDialog = newFrame("Threads");
- threadsDialog.getContentPane().setLayout(new BorderLayout());
- threadsDialog.setClosable(true);
- threadsDialog.setResizable(true);
-
- ThreadListPanel threads = new ThreadListPanel(getCDebugger(), getAgent().isJavaMode());
- threads.addListener(new ThreadListPanel.Listener() {
- public void setFocus(ThreadProxy thread, JavaThread jthread) {
- setCurrentThread(thread);
- // FIXME: print this to GUI, bring some windows to foreground
- System.err.println("Focus changed to thread " + thread);
- }
- });
- threads.setBorder(GraphicsUtilities.newBorder(5));
- threadsDialog.getContentPane().add(threads);
- addFrame(threadsDialog);
- threadsDialog.pack();
- GraphicsUtilities.reshapeToAspectRatio(threadsDialog.getComponent(),
- 3.0f,
- 0.9f,
- getParentDimension(threadsDialog.getComponent()));
- GraphicsUtilities.centerInContainer(threadsDialog.getComponent(),
- getParentDimension(threadsDialog.getComponent()));
- threadsDialog.setVisible(true);
- }
-
- public void showMemoryDialog() {
- final FrameWrapper memoryDialog = newFrame("Memory");
- memoryDialog.getContentPane().setLayout(new BorderLayout());
- memoryDialog.setClosable(true);
- memoryDialog.setResizable(true);
-
- memoryDialog.getContentPane().add(new MemoryViewer(getDebugger(),
- (getDebugger().getMachineDescription().getAddressSize() == 8)),
- BorderLayout.CENTER);
- addFrame(memoryDialog);
- memoryDialog.pack();
- GraphicsUtilities.reshapeToAspectRatio(memoryDialog.getComponent(),
- 1.0f,
- 0.7f,
- getParentDimension(memoryDialog.getComponent()));
- GraphicsUtilities.centerInContainer(memoryDialog.getComponent(),
- getParentDimension(memoryDialog.getComponent()));
- memoryDialog.setVisible(true);
- }
-
- /** Changes the editor factory this debugger uses to display source
- code. Specified factory may be null, in which case the default
- factory is used. */
- public void setEditorFactory(EditorFactory fact) {
- if (fact != null) {
- editorFact = fact;
- } else {
- editorFact = new DefaultEditorFactory();
- }
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- private WorkerThread workerThread;
- private boolean mdiMode;
- private JVMDebugger localDebugger;
- private BugSpotAgent agent = new BugSpotAgent();
- private JMenuBar menuBar;
- /** List */
- private java.util.List attachMenuItems;
- private java.util.List detachMenuItems;
- private java.util.List debugMenuItems;
- private java.util.List suspendDebugMenuItems;
- private java.util.List resumeDebugMenuItems;
- private FrameWrapper stackFrame;
- private VariablePanel localsPanel;
- private StackTracePanel stackTracePanel;
- private FrameWrapper registerFrame;
- private RegisterPanel registerPanel;
- // Used for mixed-language stack traces
- private Map threadToJavaThreadMap;
-
- private JMenu debugMenu;
-
- // MDI mode only: desktop pane
- private JDesktopPane desktop;
-
- // Attach/detach state
- private boolean attached;
-
- // Suspension (combined Java/C++) state
- private boolean suspended;
-
- // Fixed-width font
- private Font fixedWidthFont;
-
- // Breakpoint setting
- // Maps Strings to List/**/
- private Map sourceFileToLineNumberInfoMap;
- // Maps Strings (file names) to Sets of Integers (line numbers)
- private Map fileToBreakpointMap;
-
- // Debug events
- private javax.swing.Timer debugEventTimer;
-
- // Java debug events
- private boolean javaEventPending;
-
- static class BreakpointResult {
- private boolean success;
- private boolean set;
- private int lineNo;
- private String why;
-
- /** For positive results */
- BreakpointResult(boolean success, boolean set, int lineNo) {
- this(success, set, lineNo, null);
- }
-
- /** For negative results */
- BreakpointResult(boolean success, boolean set, int lineNo, String why) {
- this.success = success;
- this.set = set;
- this.lineNo = lineNo;
- this.why = why;
- }
-
- public boolean succeeded() {
- return success;
- }
-
- public boolean set() {
- return set;
- }
-
- /** Line at which the breakpoint was actually set; only valid if
- succeeded() returns true */
- public int getLine() {
- return lineNo;
- }
-
- public String getWhy() {
- return why;
- }
- }
-
-
- // Editors for source code. File name-to-Editor mapping.
- private Map editors;
- private EditorFactory editorFact = new DefaultEditorFactory();
- private EditorCommands editorComm = new EditorCommands() {
- public void windowClosed(Editor editor) {
- editors.remove(editor.getSourceFileName());
- }
-
- public void toggleBreakpointAtLine(Editor editor, int lineNumber) {
- // FIXME: handle "lazy" breakpoints where the source file has
- // been opened with some other mechanism (File -> Open) and we
- // don't have debug information pointing to that file yet
- // FIXME: NOT FINISHED
-
- BreakpointResult res =
- handleBreakpointToggle(editor, lineNumber);
- if (res.succeeded()) {
- if (res.set()) {
- editor.showBreakpointAtLine(res.getLine());
- } else {
- editor.clearBreakpointAtLine(res.getLine());
- }
- } else {
- String why = res.getWhy();
- if (why == null) {
- why = "";
- } else {
- why = ": " + why;
- }
- showMessageDialog("Unable to toggle breakpoint" + why,
- "Unable to toggle breakpoint",
- JOptionPane.WARNING_MESSAGE);
- }
- }
- };
-
- private void attach(final int pid) {
- try {
- getAgent().attach(pid);
- setMenuItemsEnabled(detachMenuItems, true);
- setMenuItemsEnabled(suspendDebugMenuItems, false);
- setMenuItemsEnabled(resumeDebugMenuItems, true);
- debugMenu.setEnabled(true);
- attached = true;
- suspended = true;
-
- if (getAgent().isJavaMode()) {
- System.err.println("Java HotSpot(TM) virtual machine detected.");
- } else {
- System.err.println("(No Java(TM) virtual machine detected)");
- }
-
- // Set up editor map
- editors = new HashMap();
-
- // Initialize breakpoints
- fileToBreakpointMap = new HashMap();
-
- // Create combined stack trace and local variable panel
- JPanel framePanel = new JPanel();
- framePanel.setLayout(new BorderLayout());
- framePanel.setBorder(GraphicsUtilities.newBorder(5));
- localsPanel = new VariablePanel();
- JTabbedPane tab = new JTabbedPane();
- tab.addTab("Locals", localsPanel);
- tab.setTabPlacement(JTabbedPane.BOTTOM);
- framePanel.add(tab, BorderLayout.CENTER);
- JPanel stackPanel = new JPanel();
- stackPanel.setLayout(new BoxLayout(stackPanel, BoxLayout.X_AXIS));
- stackPanel.add(new JLabel("Context:"));
- stackPanel.add(Box.createHorizontalStrut(5));
- stackTracePanel = new StackTracePanel();
- stackTracePanel.addListener(new StackTracePanel.Listener() {
- public void frameChanged(CFrame fr, JavaVFrame jfr) {
- setCurrentFrame(fr, jfr);
- }
- });
- stackPanel.add(stackTracePanel);
- framePanel.add(stackPanel, BorderLayout.NORTH);
- stackFrame = newFrame("Stack");
- stackFrame.getContentPane().setLayout(new BorderLayout());
- stackFrame.getContentPane().add(framePanel, BorderLayout.CENTER);
- stackFrame.setResizable(true);
- stackFrame.setClosable(false);
- addFrame(stackFrame);
- stackFrame.setSize(400, 200);
- GraphicsUtilities.moveToInContainer(stackFrame.getComponent(), 0.0f, 1.0f, 0, 20);
- stackFrame.setVisible(true);
-
- // Create register panel
- registerPanel = new RegisterPanel();
- registerPanel.setFont(fixedWidthFont);
- registerFrame = newFrame("Registers");
- registerFrame.getContentPane().setLayout(new BorderLayout());
- registerFrame.getContentPane().add(registerPanel, BorderLayout.CENTER);
- addFrame(registerFrame);
- registerFrame.setResizable(true);
- registerFrame.setClosable(false);
- registerFrame.setSize(225, 200);
- GraphicsUtilities.moveToInContainer(registerFrame.getComponent(),
- 1.0f, 0.0f, 0, 0);
- registerFrame.setVisible(true);
-
- resetCurrentThread();
- } catch (DebuggerException e) {
- final String errMsg = formatMessage(e.getMessage(), 80);
- setMenuItemsEnabled(attachMenuItems, true);
- showMessageDialog("Unable to connect to process ID " + pid + ":\n\n" + errMsg,
- "Unable to Connect",
- JOptionPane.WARNING_MESSAGE);
- getAgent().detach();
- }
- }
-
- private synchronized void detachDebugger() {
- if (!attached) {
- return;
- }
- if (isSuspended()) {
- resume(); // Necessary for JVMDI resumption
- }
- getAgent().detach();
- // FIXME: clear out breakpoints (both Java and C/C++) from target
- // process
- sourceFileToLineNumberInfoMap = null;
- fileToBreakpointMap = null;
- threadToJavaThreadMap = null;
- editors = null;
- attached = false;
- }
-
- private synchronized void detach() {
- detachDebugger();
- setMenuItemsEnabled(attachMenuItems, true);
- setMenuItemsEnabled(detachMenuItems, false);
- debugMenu.setEnabled(false);
- if (mdiMode) {
- // FIXME: is this sufficient, or will I have to do anything else
- // to the components to kill them off? What about WorkerThreads?
- desktop.removeAll();
- desktop.invalidate();
- desktop.validate();
- desktop.repaint();
- }
- // FIXME: keep track of all windows and close them even in non-MDI
- // mode
- debugEventTimer.stop();
- }
-
- // Returns a Debugger for processes on the local machine. This is
- // only used to fetch the process list.
- private Debugger getLocalDebugger() {
- if (localDebugger == null) {
- String os = PlatformInfo.getOS();
- String cpu = PlatformInfo.getCPU();
-
- if (os.equals("win32")) {
- if (!cpu.equals("x86")) {
- throw new DebuggerException("Unsupported CPU \"" + cpu + "\" for Windows");
- }
-
- localDebugger = new WindbgDebuggerLocal(new MachineDescriptionIntelX86(), true);
- } else if (os.equals("linux")) {
- if (!cpu.equals("x86")) {
- throw new DebuggerException("Unsupported CPU \"" + cpu + "\" for Linux");
- }
-
- // FIXME: figure out how to specify path to debugger module
- throw new RuntimeException("FIXME: figure out how to specify path to debugger module");
- // localDebugger = new PosixDebuggerLocal(new MachineDescriptionIntelX86(), true);
- } else {
- // FIXME: port to Solaris
- throw new DebuggerException("Unsupported OS \"" + os + "\"");
- }
-
- // FIXME: we require that the primitive type sizes be configured
- // in order to use basic functionality in class Address such as
- // the fetching of floating-point values. There are a lot of
- // assumptions in the current code that Java floats and doubles
- // are of equivalent size to C values. The configurability of the
- // primitive type sizes hasn't seemed necessary and in this kind
- // of debugging scenario (namely, debugging arbitrary C++
- // processes) it appears difficult to support that kind of
- // flexibility.
- localDebugger.configureJavaPrimitiveTypeSizes(1, 1, 2, 8, 4, 4, 8, 2);
- }
-
- return localDebugger;
- }
-
- private BugSpotAgent getAgent() {
- return agent;
- }
-
- private Debugger getDebugger() {
- return getAgent().getDebugger();
- }
-
- private CDebugger getCDebugger() {
- return getAgent().getCDebugger();
- }
-
- private void resetCurrentThread() {
- setCurrentThread((ThreadProxy) getCDebugger().getThreadList().get(0));
- }
-
- private void setCurrentThread(ThreadProxy t) {
- // Create stack trace
- // FIXME: add ability to intermix C/Java frames
- java.util.List trace = new ArrayList();
- CFrame fr = getCDebugger().topFrameForThread(t);
- while (fr != null) {
- trace.add(new StackTraceEntry(fr, getCDebugger()));
- try {
- fr = fr.sender(t);
- } catch (AddressException e) {
- e.printStackTrace();
- showMessageDialog("Error while walking stack; stack trace will be truncated\n(see console for details)",
- "Error walking stack",
- JOptionPane.WARNING_MESSAGE);
- fr = null;
- }
- }
- JavaThread jthread = javaThreadForProxy(t);
- if (jthread != null) {
- // Java mode, and we have a Java thread.
- // Find all Java frames on the stack. We currently do this in a
- // manner which involves minimal interaction between the Java
- // and C/C++ debugging systems: any C frame which has a PC in an
- // unknown location (i.e., not in any DSO) is assumed to be a
- // Java frame. We merge stack segments of unknown frames with
- // segments of Java frames beginning with native methods.
- java.util.List javaTrace = new ArrayList();
- VFrame vf = jthread.getLastJavaVFrameDbg();
- while (vf != null) {
- if (vf.isJavaFrame()) {
- javaTrace.add(new StackTraceEntry((JavaVFrame) vf));
- vf = vf.sender();
- }
- }
- // Merge stack traces
- java.util.List mergedTrace = new ArrayList();
- int c = 0;
- int j = 0;
- while (c < trace.size()) {
- StackTraceEntry entry = (StackTraceEntry) trace.get(c);
- if (entry.isUnknownCFrame()) {
- boolean gotJavaFrame = false;
- while (j < javaTrace.size()) {
- StackTraceEntry javaEntry = (StackTraceEntry) javaTrace.get(j);
- JavaVFrame jvf = javaEntry.getJavaFrame();
- Method m = jvf.getMethod();
- if (!m.isNative() || !gotJavaFrame) {
- gotJavaFrame = true;
- mergedTrace.add(javaEntry);
- ++j;
- } else {
- break; // Reached native method; have intervening C frames
- }
- }
- if (gotJavaFrame) {
- // Skip this sequence of unknown frames, as we've
- // successfully identified it as Java frames
- while (c < trace.size() && entry.isUnknownCFrame()) {
- ++c;
- if (c < trace.size()) {
- entry = (StackTraceEntry) trace.get(c);
- }
- }
- continue;
- }
- }
- // If we get here, we either have an unknown frame we didn't
- // know how to categorize or we have a known C frame. Add it
- // to the trace.
- mergedTrace.add(entry);
- ++c;
- }
- trace = mergedTrace;
- }
- stackTracePanel.setTrace(trace);
-
- registerPanel.update(t);
- }
-
- private void setCurrentFrame(CFrame fr, JavaVFrame jfr) {
- localsPanel.clear();
-
- if (fr != null) {
- localsPanel.update(fr);
-
- // FIXME: load source file if we can find it, otherwise display disassembly
- LoadObject lo = getCDebugger().loadObjectContainingPC(fr.pc());
- if (lo != null) {
- CDebugInfoDataBase db = lo.getDebugInfoDataBase();
- if (db != null) {
- LineNumberInfo info = db.lineNumberForPC(fr.pc());
- if (info != null) {
- System.err.println("PC " + fr.pc() + ": Source file \"" +
- info.getSourceFileName() +
- "\", line number " +
- info.getLineNumber() +
- ", PC range [" +
- info.getStartPC() +
- ", " +
- info.getEndPC() +
- ")");
- // OK, here we go...
- showLineNumber(null, info.getSourceFileName(), info.getLineNumber());
- } else {
- System.err.println("(No line number information for PC " + fr.pc() + ")");
- // Dump line number information for database
- db.iterate(new LineNumberVisitor() {
- public void doLineNumber(LineNumberInfo info) {
- System.err.println(" Source file \"" +
- info.getSourceFileName() +
- "\", line number " +
- info.getLineNumber() +
- ", PC range [" +
- info.getStartPC() +
- ", " +
- info.getEndPC() +
- ")");
- }
- });
- }
- }
- }
- } else {
- if (Assert.ASSERTS_ENABLED) {
- Assert.that(jfr != null, "Must have either C or Java frame");
- }
- localsPanel.update(jfr);
- // See whether we can locate source file and line number
- // FIXME: infer pathmap entries from user's locating of this
- // source file
- // FIXME: figure out what to do for native methods. Possible to
- // go to line number for the native method declaration?
- Method m = jfr.getMethod();
- Symbol sfn = ((InstanceKlass) m.getMethodHolder()).getSourceFileName();
- if (sfn != null) {
- int bci = jfr.getBCI();
- int lineNo = m.getLineNumberFromBCI(bci);
- if (lineNo >= 0) {
- // FIXME: show disassembly otherwise
- showLineNumber(packageName(m.getMethodHolder().getName().asString()),
- sfn.asString(), lineNo);
- }
- }
- }
- }
-
- private String packageName(String str) {
- int idx = str.lastIndexOf('/');
- if (idx < 0) {
- return "";
- }
- return str.substring(0, idx).replace('/', '.');
- }
-
- private JavaThread javaThreadForProxy(ThreadProxy t) {
- if (!getAgent().isJavaMode()) {
- return null;
- }
- if (threadToJavaThreadMap == null) {
- threadToJavaThreadMap = new HashMap();
- Threads threads = VM.getVM().getThreads();
- for (JavaThread thr = threads.first(); thr != null; thr = thr.next()) {
- threadToJavaThreadMap.put(thr.getThreadProxy(), thr);
- }
- }
- return (JavaThread) threadToJavaThreadMap.get(t);
- }
-
- private static JMenu createMenu(String name, char mnemonic, int mnemonicPos) {
- JMenu menu = new JMenu(name);
- menu.setMnemonic(mnemonic);
- menu.setDisplayedMnemonicIndex(mnemonicPos);
- return menu;
- }
-
- private static JMenuItem createMenuItem(String name, ActionListener l) {
- JMenuItem item = new JMenuItem(name);
- item.addActionListener(l);
- return item;
- }
-
- private static JMenuItem createMenuItemInternal(String name, ActionListener l, int accelerator, int modifiers) {
- JMenuItem item = createMenuItem(name, l);
- item.setAccelerator(KeyStroke.getKeyStroke(accelerator, modifiers));
- return item;
- }
-
- private static JMenuItem createMenuItem(String name, ActionListener l, int accelerator) {
- return createMenuItemInternal(name, l, accelerator, 0);
- }
-
- private static JMenuItem createMenuItem(String name, ActionListener l, char mnemonic, int mnemonicPos) {
- JMenuItem item = createMenuItem(name, l);
- item.setMnemonic(mnemonic);
- item.setDisplayedMnemonicIndex(mnemonicPos);
- return item;
- }
-
- private static JMenuItem createMenuItem(String name,
- ActionListener l,
- int accelerator,
- int acceleratorMods,
- char mnemonic,
- int mnemonicPos) {
- JMenuItem item = createMenuItemInternal(name, l, accelerator, acceleratorMods);
- item.setMnemonic(mnemonic);
- item.setDisplayedMnemonicIndex(mnemonicPos);
- return item;
- }
-
- /** Punctuates the given string with \n's where necessary to not
- exceed the given number of characters per line. Strips
- extraneous whitespace. */
- private static String formatMessage(String message, int charsPerLine) {
- StringBuffer buf = new StringBuffer(message.length());
- StringTokenizer tokenizer = new StringTokenizer(message);
- int curLineLength = 0;
- while (tokenizer.hasMoreTokens()) {
- String tok = tokenizer.nextToken();
- if (curLineLength + tok.length() > charsPerLine) {
- buf.append('\n');
- curLineLength = 0;
- } else {
- if (curLineLength != 0) {
- buf.append(' ');
- ++curLineLength;
- }
- }
- buf.append(tok);
- curLineLength += tok.length();
- }
- return buf.toString();
- }
-
- private void setMenuItemsEnabled(java.util.List items, boolean enabled) {
- for (Iterator iter = items.iterator(); iter.hasNext(); ) {
- ((JMenuItem) iter.next()).setEnabled(enabled);
- }
- }
-
- private void showMessageDialog(final String message, final String title, final int jOptionPaneKind) {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- if (mdiMode) {
- JOptionPane.showInternalMessageDialog(desktop, message, title, jOptionPaneKind);
- } else {
- JOptionPane.showMessageDialog(null, message, title, jOptionPaneKind);
- }
- }
- });
- }
-
- private FrameWrapper newFrame(String title) {
- if (mdiMode) {
- return new JInternalFrameWrapper(new JInternalFrame(title));
- } else {
- return new JFrameWrapper(new JFrame(title));
- }
- }
-
- private void addFrame(FrameWrapper frame) {
- if (mdiMode) {
- desktop.add(frame.getComponent());
- }
- }
-
- private void removeFrame(FrameWrapper frame) {
- if (mdiMode) {
- desktop.remove(frame.getComponent());
- desktop.invalidate();
- desktop.validate();
- desktop.repaint();
- }
- // FIXME: do something when not in MDI mode
- }
-
- private Dimension getParentDimension(Component c) {
- if (mdiMode) {
- return desktop.getSize();
- } else {
- return Toolkit.getDefaultToolkit().getScreenSize();
- }
- }
-
- // Default editor implementation
- class DefaultEditor implements Editor {
- private DefaultEditorFactory factory;
- private FrameWrapper editorFrame;
- private String filename;
- private SourceCodePanel code;
- private boolean shown;
- private Object userData;
-
- public DefaultEditor(DefaultEditorFactory fact, String filename, final EditorCommands comm) {
- this.filename = filename;
- this.factory = fact;
- editorFrame = newFrame(filename);
- code = new SourceCodePanel();
- // FIXME: when font changes, change font in editors as well
- code.setFont(fixedWidthFont);
- editorFrame.getContentPane().add(code);
- editorFrame.setClosable(true);
- editorFrame.setResizable(true);
- editorFrame.setClosingActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- comm.windowClosed(DefaultEditor.this);
- removeFrame(editorFrame);
- editorFrame.dispose();
- factory.editorClosed(DefaultEditor.this);
- }
- });
- editorFrame.setActivatedActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- factory.makeEditorCurrent(DefaultEditor.this);
- code.requestFocus();
- }
- });
- code.setEditorCommands(comm, this);
- }
-
- public boolean openFile() { return code.openFile(filename); }
- public String getSourceFileName() { return filename; }
- public int getCurrentLineNumber() { return code.getCurrentLineNumber(); }
- public void showLineNumber(int lineNo) {
- if (!shown) {
- addFrame(editorFrame);
- GraphicsUtilities.reshapeToAspectRatio(editorFrame.getComponent(),
- 1.0f,
- 0.85f,
- getParentDimension(editorFrame.getComponent()));
- editorFrame.setVisible(true);
- shown = true;
- }
- code.showLineNumber(lineNo);
- editorFrame.toFront();
- }
- public void highlightLineNumber(int lineNo) { code.highlightLineNumber(lineNo); }
- public void showBreakpointAtLine(int lineNo) { code.showBreakpointAtLine(lineNo); }
- public boolean hasBreakpointAtLine(int lineNo) { return code.hasBreakpointAtLine(lineNo); }
- public void clearBreakpointAtLine(int lineNo) { code.clearBreakpointAtLine(lineNo); }
- public void clearBreakpoints() { code.clearBreakpoints(); }
- public void setUserData(Object o) { userData = o; }
- public Object getUserData() { return userData; }
- public void toFront() { editorFrame.toFront();
- factory.makeEditorCurrent(this); }
- }
-
- class DefaultEditorFactory implements EditorFactory {
- private LinkedList/**/ editors = new LinkedList();
-
- public Editor openFile(String filename, EditorCommands commands) {
- DefaultEditor editor = new DefaultEditor(this, filename, editorComm);
- if (!editor.openFile()) {
- return null;
- }
- return editor;
- }
-
- public Editor getCurrentEditor() {
- if (editors.isEmpty()) {
- return null;
- }
- return (Editor) editors.getFirst();
- }
-
- void editorClosed(Editor editor) {
- editors.remove(editor);
- }
-
- void makeEditorCurrent(Editor editor) {
- editors.remove(editor);
- editors.addFirst(editor);
- }
- }
-
- // Helper class for loading .java files; show only those with
- // correct file name which are also in the correct package
- static class JavaFileFilter extends javax.swing.filechooser.FileFilter {
- private String packageName;
- private String fileName;
-
- JavaFileFilter(String packageName, String fileName) {
- this.packageName = packageName;
- this.fileName = fileName;
- }
-
- public boolean accept(File f) {
- if (f.isDirectory()) {
- return true;
- }
- // This rejects most files
- if (!f.getName().equals(fileName)) {
- return false;
- }
- // Ensure selected file is in the correct package
- PackageScanner scanner = new PackageScanner();
- String pkg = scanner.scan(f);
- if (!pkg.equals(packageName)) {
- return false;
- }
- return true;
- }
-
- public String getDescription() { return "Java source files"; }
- }
-
- // Auxiliary information used only for Java source files
- static class JavaUserData {
- private String packageName; // External format
- private String sourceFileName;
-
- /** Source file name is equivalent to that found in the .java
- file; i.e., not a full path */
- JavaUserData(String packageName, String sourceFileName) {
- this.packageName = packageName;
- this.sourceFileName = sourceFileName;
- }
-
- String packageName() { return packageName; }
- String sourceFileName() { return sourceFileName; }
- }
-
- // Opens a source file. This makes it available for the setting of
- // lazy breakpoints.
- private void openSourceFile() {
- JFileChooser chooser = new JFileChooser();
- chooser.setDialogTitle("Open source code file");
- chooser.setMultiSelectionEnabled(false);
- if (chooser.showOpenDialog(null) != JFileChooser.APPROVE_OPTION) {
- return;
- }
- File chosen = chooser.getSelectedFile();
- if (chosen == null) {
- return;
- }
-
- // See whether we have a Java source file. If so, derive a package
- // name for it.
- String path = chosen.getPath();
- String name = null;
- JavaUserData data = null;
- if (path.endsWith(".java")) {
- PackageScanner scanner = new PackageScanner();
- String pkg = scanner.scan(chosen);
- // Now knowing both the package name and file name, we can put
- // this in the editor map and use it for setting breakpoints
- // later
- String fileName = chosen.getName();
- name = pkg + "." + fileName;
- data = new JavaUserData(pkg, fileName);
- } else {
- // FIXME: need pathmap mechanism
- name = path;
- }
- Editor editor = (Editor) editors.get(name);
- if (editor == null) {
- editor = editorFact.openFile(path, editorComm);
- if (editor == null) {
- showMessageDialog("Unable to open file \"" + path + "\" -- unexpected error.",
- "Unable to open file",
- JOptionPane.WARNING_MESSAGE);
- return;
- }
- editors.put(name, editor);
- if (data != null) {
- editor.setUserData(data);
- }
- } else {
- editor.toFront();
- }
- editor.showLineNumber(1);
- // Show breakpoints as well if we have any for this file
- Set set = (Set) fileToBreakpointMap.get(editor.getSourceFileName());
- if (set != null) {
- for (Iterator iter = set.iterator(); iter.hasNext(); ) {
- editor.showBreakpointAtLine(((Integer) iter.next()).intValue());
- }
- }
- }
-
- // Package name may be null, in which case the file is assumed to be
- // a C source file. Otherwise it is assumed to be a Java source file
- // and certain filtering rules will be applied.
- private void showLineNumber(String packageName, String fileName, int lineNumber) {
- String name;
- if (packageName == null) {
- name = fileName;
- } else {
- name = packageName + "." + fileName;
- }
- Editor editor = (Editor) editors.get(name);
- if (editor == null) {
- // See whether file exists
- File file = new File(fileName);
- String realFileName = fileName;
- if (!file.exists()) {
- // User must specify path to file
- JFileChooser chooser = new JFileChooser();
- chooser.setDialogTitle("Please locate " + fileName);
- chooser.setMultiSelectionEnabled(false);
- if (packageName != null) {
- chooser.setFileFilter(new JavaFileFilter(packageName, fileName));
- }
- int res = chooser.showOpenDialog(null);
- if (res != JFileChooser.APPROVE_OPTION) {
- // FIXME: show disassembly instead
- return;
- }
- // FIXME: would like to infer more from the selection; i.e.,
- // a pathmap leading up to this file
- File chosen = chooser.getSelectedFile();
- if (chosen == null) {
- return;
- }
- realFileName = chosen.getPath();
- }
- // Now instruct editor factory to open file
- editor = editorFact.openFile(realFileName, editorComm);
- if (editor == null) {
- showMessageDialog("Unable to open file \"" + realFileName + "\" -- unexpected error.",
- "Unable to open file",
- JOptionPane.WARNING_MESSAGE);
- return;
- }
- // Got an editor; put it in map
- editors.put(name, editor);
- // If Java source file, add additional information for later
- if (packageName != null) {
- editor.setUserData(new JavaUserData(packageName, fileName));
- }
- }
- // Got editor; show line
- editor.showLineNumber(lineNumber);
- editor.highlightLineNumber(lineNumber);
- // Show breakpoints as well if we have any for this file
- Set set = (Set) fileToBreakpointMap.get(editor.getSourceFileName());
- if (set != null) {
- for (Iterator iter = set.iterator(); iter.hasNext(); ) {
- editor.showBreakpointAtLine(((Integer) iter.next()).intValue());
- }
- }
- }
-
- //
- // Suspend/resume
- //
-
- private boolean isSuspended() {
- return suspended;
- }
-
- private synchronized void suspend() {
- setMenuItemsEnabled(resumeDebugMenuItems, true);
- setMenuItemsEnabled(suspendDebugMenuItems, false);
- BugSpotAgent agent = getAgent();
- if (agent.canInteractWithJava() && !agent.isJavaSuspended()) {
- agent.suspendJava();
- }
- agent.suspend();
- // FIXME: call VM.getVM().fireVMSuspended()
- resetCurrentThread();
- debugEventTimer.stop();
- suspended = true;
- }
-
- private synchronized void resume() {
- // Note: we don't wipe out the cached state like the
- // sourceFileToLineNumberInfoMap since it is too expensive to
- // recompute. Instead we recompute it if any DLLs are loaded or
- // unloaded.
- threadToJavaThreadMap = null;
- setMenuItemsEnabled(resumeDebugMenuItems, false);
- setMenuItemsEnabled(suspendDebugMenuItems, true);
- registerPanel.clear();
- // FIXME: call VM.getVM().fireVMResumed()
- BugSpotAgent agent = getAgent();
- agent.resume();
- if (agent.canInteractWithJava()) {
- if (agent.isJavaSuspended()) {
- agent.resumeJava();
- }
- if (javaEventPending) {
- javaEventPending = false;
- // Clear it out before resuming polling for events
- agent.javaEventContinue();
- }
- }
- agent.enableJavaInteraction();
- suspended = false;
- debugEventTimer.start();
- }
-
- //
- // Breakpoints
- //
-
- private synchronized BreakpointResult handleBreakpointToggle(Editor editor, int lineNumber) {
- // Currently we only use user data in editors to indicate Java
- // source files. If this changes then this code will need to
- // change.
- JavaUserData data = (JavaUserData) editor.getUserData();
- String filename = editor.getSourceFileName();
- if (data == null) {
- // C/C++ code
- // FIXME: as noted above in EditorCommands.toggleBreakpointAtLine,
- // this needs more work to handle "lazy" breakpoints in files
- // which we don't know about in the debug information yet
- CDebugger dbg = getCDebugger();
- ProcessControl prctl = dbg.getProcessControl();
- if (prctl == null) {
- return new BreakpointResult(false, false, 0, "Process control not enabled");
- }
- boolean mustSuspendAndResume = (!prctl.isSuspended());
- try {
- if (mustSuspendAndResume) {
- prctl.suspend();
- }
- // Search debug info for all DSOs
- LineNumberInfo info = getLineNumberInfo(filename, lineNumber);
- if (info != null) {
- Set bpset = (Set) fileToBreakpointMap.get(filename);
- if (bpset == null) {
- bpset = new HashSet();
- fileToBreakpointMap.put(filename, bpset);
- }
- Integer key = new Integer(info.getLineNumber());
- if (bpset.contains(key)) {
- // Clear breakpoint at this line's PC
- prctl.clearBreakpoint(info.getStartPC());
- bpset.remove(key);
- return new BreakpointResult(true, false, info.getLineNumber());
- } else {
- // Set breakpoint at this line's PC
- System.err.println("Setting breakpoint at PC " + info.getStartPC());
- prctl.setBreakpoint(info.getStartPC());
- bpset.add(key);
- return new BreakpointResult(true, true, info.getLineNumber());
- }
- } else {
- return new BreakpointResult(false, false, 0, "No debug information for this source file and line");
- }
- } finally {
- if (mustSuspendAndResume) {
- prctl.resume();
- }
- }
- } else {
- BugSpotAgent agent = getAgent();
- if (!agent.canInteractWithJava()) {
- String why;
- if (agent.isJavaInteractionDisabled()) {
- why = "Can not toggle Java breakpoints while stopped because\nof C/C++ debug events (breakpoints, single-stepping)";
- } else {
- why = "Could not talk to SA's JVMDI module to enable Java\nprogramming language breakpoints (run with -Xdebug -Xrunsa)";
- }
- return new BreakpointResult(false, false, 0, why);
- }
- Set bpset = (Set) fileToBreakpointMap.get(filename);
- if (bpset == null) {
- bpset = new HashSet();
- fileToBreakpointMap.put(filename, bpset);
- }
- boolean mustResumeAndSuspend = isSuspended();
- try {
- if (mustResumeAndSuspend) {
- agent.resume();
- }
- ServiceabilityAgentJVMDIModule.BreakpointToggleResult res =
- getAgent().toggleJavaBreakpoint(data.sourceFileName(),
- data.packageName(),
- lineNumber);
- if (res.getSuccess()) {
- Integer key = new Integer(res.getLineNumber());
- boolean addRemRes = false;
- if (res.getWasSet()) {
- addRemRes = bpset.add(key);
- System.err.println("Setting breakpoint at " + res.getMethodName() + res.getMethodSignature() +
- ", bci " + res.getBCI() + ", line " + res.getLineNumber());
- } else {
- addRemRes = bpset.remove(key);
- System.err.println("Clearing breakpoint at " + res.getMethodName() + res.getMethodSignature() +
- ", bci " + res.getBCI() + ", line " + res.getLineNumber());
- }
- if (Assert.ASSERTS_ENABLED) {
- Assert.that(addRemRes, "Inconsistent Java breakpoint state with respect to target process");
- }
- return new BreakpointResult(true, res.getWasSet(), res.getLineNumber());
- } else {
- return new BreakpointResult(false, false, 0, res.getErrMsg());
- }
- } finally {
- if (mustResumeAndSuspend) {
- agent.suspend();
- resetCurrentThread();
- }
- }
- }
- }
-
- // Must call only when suspended
- private LineNumberInfo getLineNumberInfo(String filename, int lineNumber) {
- Map map = getSourceFileToLineNumberInfoMap();
- java.util.List infos = (java.util.List) map.get(filename);
- if (infos == null) {
- return null;
- }
- // Binary search for line number
- return searchLineNumbers(infos, lineNumber, 0, infos.size());
- }
-
- // Must call only when suspended
- private Map getSourceFileToLineNumberInfoMap() {
- if (sourceFileToLineNumberInfoMap == null) {
- // Build from debug info
- java.util.List loadObjects = getCDebugger().getLoadObjectList();
- final Map map = new HashMap();
- for (Iterator iter = loadObjects.iterator(); iter.hasNext(); ) {
- LoadObject lo = (LoadObject) iter.next();
- CDebugInfoDataBase db = lo.getDebugInfoDataBase();
- if (db != null) {
- db.iterate(new LineNumberVisitor() {
- public void doLineNumber(LineNumberInfo info) {
- String name = info.getSourceFileName();
- if (name != null) {
- java.util.List val = (java.util.List) map.get(name);
- if (val == null) {
- val = new ArrayList();
- map.put(name, val);
- }
- val.add(info);
- }
- }
- });
- }
- }
- // Sort all lists
- for (Iterator iter = map.values().iterator(); iter.hasNext(); ) {
- java.util.List list = (java.util.List) iter.next();
- Collections.sort(list, new Comparator() {
- public int compare(Object o1, Object o2) {
- LineNumberInfo l1 = (LineNumberInfo) o1;
- LineNumberInfo l2 = (LineNumberInfo) o2;
- int n1 = l1.getLineNumber();
- int n2 = l2.getLineNumber();
- if (n1 < n2) return -1;
- if (n1 == n2) return 0;
- return 1;
- }
- });
- }
- sourceFileToLineNumberInfoMap = map;
- }
- return sourceFileToLineNumberInfoMap;
- }
-
- private LineNumberInfo searchLineNumbers(java.util.List infoList, int lineNo, int lowIdx, int highIdx) {
- if (highIdx < lowIdx) return null;
- if (lowIdx == highIdx) {
- // Base case: see whether start PC is less than or equal to addr
- if (checkLineNumber(infoList, lineNo, lowIdx)) {
- return (LineNumberInfo) infoList.get(lowIdx);
- } else {
- return null;
- }
- } else if (lowIdx == highIdx - 1) {
- if (checkLineNumber(infoList, lineNo, lowIdx)) {
- return (LineNumberInfo) infoList.get(lowIdx);
- } else if (checkLineNumber(infoList, lineNo, highIdx)) {
- return (LineNumberInfo) infoList.get(highIdx);
- } else {
- return null;
- }
- }
- int midIdx = (lowIdx + highIdx) >> 1;
- LineNumberInfo info = (LineNumberInfo) infoList.get(midIdx);
- if (lineNo < info.getLineNumber()) {
- // Always move search down
- return searchLineNumbers(infoList, lineNo, lowIdx, midIdx);
- } else if (lineNo == info.getLineNumber()) {
- return info;
- } else {
- // Move search up
- return searchLineNumbers(infoList, lineNo, midIdx, highIdx);
- }
- }
-
- private boolean checkLineNumber(java.util.List infoList, int lineNo, int idx) {
- LineNumberInfo info = (LineNumberInfo) infoList.get(idx);
- return (info.getLineNumber() >= lineNo);
- }
-
- //
- // Debug events
- //
-
- private synchronized void pollForDebugEvent() {
- ProcessControl prctl = getCDebugger().getProcessControl();
- if (prctl == null) {
- return;
- }
- DebugEvent ev = prctl.debugEventPoll();
- if (ev != null) {
- DebugEvent.Type t = ev.getType();
- if (t == DebugEvent.Type.LOADOBJECT_LOAD ||
- t == DebugEvent.Type.LOADOBJECT_UNLOAD) {
- // Conservatively clear cached debug info state
- sourceFileToLineNumberInfoMap = null;
- // FIXME: would be very useful to have "stop on load/unload"
- // events
- // FIXME: must do work at these events to implement lazy
- // breakpoints
- prctl.debugEventContinue();
- } else if (t == DebugEvent.Type.BREAKPOINT) {
- // Note: Visual C++ only notifies on breakpoints it doesn't
- // know about
-
- // FIXME: put back test
- // if (!prctl.isBreakpointSet(ev.getPC())) {
- showMessageDialog("Breakpoint reached at PC " + ev.getPC(),
- "Breakpoint reached",
- JOptionPane.INFORMATION_MESSAGE);
- // }
- agent.disableJavaInteraction();
- suspend();
- prctl.debugEventContinue();
- } else if (t == DebugEvent.Type.SINGLE_STEP) {
- agent.disableJavaInteraction();
- suspend();
- prctl.debugEventContinue();
- } else if (t == DebugEvent.Type.ACCESS_VIOLATION) {
- showMessageDialog("Access violation attempting to " +
- (ev.getWasWrite() ? "write" : "read") +
- " address " + ev.getAddress() +
- " at PC " + ev.getPC(),
- "Access Violation",
- JOptionPane.WARNING_MESSAGE);
- agent.disableJavaInteraction();
- suspend();
- prctl.debugEventContinue();
- } else {
- String info = "Unknown debug event encountered";
- if (ev.getUnknownEventDetail() != null) {
- info = info + ": " + ev.getUnknownEventDetail();
- }
- showMessageDialog(info, "Unknown debug event", JOptionPane.INFORMATION_MESSAGE);
- suspend();
- prctl.debugEventContinue();
- }
- return;
- }
-
- // No C++ debug event; poll for Java debug event
- if (getAgent().canInteractWithJava()) {
- if (!javaEventPending) {
- if (getAgent().javaEventPending()) {
- suspend();
- // This does a lot of work and we want to have the page
- // cache available to us as it runs
- sun.jvm.hotspot.livejvm.Event jev = getAgent().javaEventPoll();
- if (jev != null) {
- javaEventPending = true;
- if (jev.getType() == sun.jvm.hotspot.livejvm.Event.Type.BREAKPOINT) {
- BreakpointEvent bpev = (BreakpointEvent) jev;
- showMessageDialog("Breakpoint reached in method\n" +
- bpev.methodID().method().externalNameAndSignature() +
- ",\nbci " + bpev.location(),
- "Breakpoint reached",
- JOptionPane.INFORMATION_MESSAGE);
- } else if (jev.getType() == sun.jvm.hotspot.livejvm.Event.Type.EXCEPTION) {
- ExceptionEvent exev = (ExceptionEvent) jev;
- showMessageDialog(exev.exception().getKlass().getName().asString() +
- "\nthrown in method\n" +
- exev.methodID().method().externalNameAndSignature() +
- "\nat BCI " + exev.location(),
- "Exception thrown",
- JOptionPane.INFORMATION_MESSAGE);
- } else {
- Assert.that(false, "Should not reach here");
- }
- }
- }
- }
- }
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpotAgent.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpotAgent.java
deleted file mode 100644
index b2b279524f4..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpotAgent.java
+++ /dev/null
@@ -1,799 +0,0 @@
-/*
- * Copyright (c) 2002, 2012, 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 sun.jvm.hotspot.bugspot;
-
-import java.io.PrintStream;
-import java.net.*;
-import java.rmi.*;
-import sun.jvm.hotspot.*;
-import sun.jvm.hotspot.debugger.*;
-import sun.jvm.hotspot.debugger.bsd.*;
-import sun.jvm.hotspot.debugger.proc.*;
-import sun.jvm.hotspot.debugger.cdbg.*;
-import sun.jvm.hotspot.debugger.windbg.*;
-import sun.jvm.hotspot.debugger.linux.*;
-import sun.jvm.hotspot.debugger.sparc.*;
-import sun.jvm.hotspot.debugger.remote.*;
-import sun.jvm.hotspot.livejvm.*;
-import sun.jvm.hotspot.memory.*;
-import sun.jvm.hotspot.oops.*;
-import sun.jvm.hotspot.runtime.*;
-import sun.jvm.hotspot.types.*;
-import sun.jvm.hotspot.utilities.*;
-
-/**
This class wraps the basic functionality for connecting to the
- * target process or debug server. It makes it simple to start up the
- * debugging system.
- *
- *
This agent (as compared to the HotSpotAgent) can connect to
- * and interact with arbitrary processes. If the target process
- * happens to be a HotSpot JVM, the Java debugging features of the
- * Serviceability Agent are enabled. Further, if the Serviceability
- * Agent's JVMDI module is loaded into the target VM, interaction
- * with the live Java program is possible, specifically the catching
- * of exceptions and setting of breakpoints.
- *
- *
The BugSpot debugger requires that the underlying Debugger
- * support C/C++ debugging via the CDebugger interface.
- *
- *
FIXME: especially with the addition of remote debugging, this
- * has turned into a mess; needs rethinking.
*/
-
-public class BugSpotAgent {
-
- private JVMDebugger debugger;
- private MachineDescription machDesc;
- private TypeDataBase db;
-
- private String os;
- private String cpu;
- private String fileSep;
-
- // The system can work in several ways:
- // - Attaching to local process
- // - Attaching to local core file
- // - Connecting to remote debug server
- // - Starting debug server for process
- // - Starting debug server for core file
-
- // These are options for the "client" side of things
- private static final int PROCESS_MODE = 0;
- private static final int CORE_FILE_MODE = 1;
- private static final int REMOTE_MODE = 2;
- private int startupMode;
-
- // This indicates whether we are really starting a server or not
- private boolean isServer;
-
- // All possible required information for connecting
- private int pid;
- private String executableName;
- private String coreFileName;
- private String debugServerID;
-
- // All needed information for server side
- private String serverID;
-
- // Indicates whether we are attached to a HotSpot JVM or not
- private boolean javaMode;
-
- // Indicates whether we have process control over a live HotSpot JVM
- // or not; non-null if so.
- private ServiceabilityAgentJVMDIModule jvmdi;
- // While handling C breakpoints interactivity with the Java program
- // is forbidden. Too many invariants are broken while the target is
- // stopped at a C breakpoint to risk making JVMDI calls.
- private boolean javaInteractionDisabled;
-
- private String[] jvmLibNames;
- private String[] saLibNames;
-
- // FIXME: make these configurable, i.e., via a dotfile; also
- // consider searching within the JDK from which this Java executable
- // comes to find them
- private static final String defaultDbxPathPrefix = "/net/jano.eng/export/disk05/hotspot/sa";
- private static final String defaultDbxSvcAgentDSOPathPrefix = "/net/jano.eng/export/disk05/hotspot/sa";
-
- private static final boolean DEBUG;
- static {
- DEBUG = System.getProperty("sun.jvm.hotspot.bugspot.BugSpotAgent.DEBUG")
- != null;
- }
-
- static void debugPrintln(String str) {
- if (DEBUG) {
- System.err.println(str);
- }
- }
-
- static void showUsage() {
- System.out.println(" You can also pass these -D options to java to specify where to find dbx and the \n" +
- " Serviceability Agent plugin for dbx:");
- System.out.println(" -DdbxPathName=\n" +
- " Default is derived from dbxPathPrefix");
- System.out.println(" or");
- System.out.println(" -DdbxPathPrefix=\n" +
- " where xxx is the path name of a dir structure that contains:\n" +
- " //bin/dbx\n" +
- " The default is " + defaultDbxPathPrefix);
- System.out.println(" and");
- System.out.println(" -DdbxSvcAgentDSOPathName=\n" +
- " Default is determined from dbxSvcAgentDSOPathPrefix");
- System.out.println(" or");
- System.out.println(" -DdbxSvcAgentDSOPathPrefix=\n" +
- " where xxx is the pathname of a dir structure that contains:\n" +
- " //bin/lib/libsvc_agent_dbx.so\n" +
- " The default is " + defaultDbxSvcAgentDSOPathPrefix);
- }
-
- public BugSpotAgent() {
- // for non-server add shutdown hook to clean-up debugger in case
- // of forced exit. For remote server, shutdown hook is added by
- // DebugServer.
- Runtime.getRuntime().addShutdownHook(new java.lang.Thread(
- new Runnable() {
- public void run() {
- synchronized (BugSpotAgent.this) {
- if (!isServer) {
- detach();
- }
- }
- }
- }));
- }
-
- //--------------------------------------------------------------------------------
- // Accessors (once the system is set up)
- //
-
- public synchronized Debugger getDebugger() {
- return debugger;
- }
-
- public synchronized CDebugger getCDebugger() {
- return getDebugger().getCDebugger();
- }
-
- public synchronized ProcessControl getProcessControl() {
- return getCDebugger().getProcessControl();
- }
-
- public synchronized TypeDataBase getTypeDataBase() {
- return db;
- }
-
- /** Indicates whether the target process is suspended
- completely. Equivalent to getProcessControl().isSuspended(). */
- public synchronized boolean isSuspended() throws DebuggerException {
- return getProcessControl().isSuspended();
- }
-
- /** Suspends the target process completely. Equivalent to
- getProcessControl().suspend(). */
- public synchronized void suspend() throws DebuggerException {
- getProcessControl().suspend();
- }
-
- /** Resumes the target process completely. Equivalent to
- getProcessControl().suspend(). */
- public synchronized void resume() throws DebuggerException {
- getProcessControl().resume();
- }
-
- /** Indicates whether we are attached to a Java HotSpot virtual
- machine */
- public synchronized boolean isJavaMode() {
- return javaMode;
- }
-
- /** Temporarily disables interaction with the target process via
- JVMDI. This is done while the target process is stopped at a C
- breakpoint. Can be called even if the JVMDI agent has not been
- initialized. */
- public synchronized void disableJavaInteraction() {
- javaInteractionDisabled = true;
- }
-
- /** Re-enables interaction with the target process via JVMDI. This
- is done while the target process is continued past a C
- braekpoint. Can be called even if the JVMDI agent has not been
- initialized. */
- public synchronized void enableJavaInteraction() {
- javaInteractionDisabled = false;
- }
-
- /** Indicates whether Java interaction has been disabled */
- public synchronized boolean isJavaInteractionDisabled() {
- return javaInteractionDisabled;
- }
-
- /** Indicates whether we can talk to the Serviceability Agent's
- JVMDI module to be able to set breakpoints */
- public synchronized boolean canInteractWithJava() {
- return (jvmdi != null) && !javaInteractionDisabled;
- }
-
- /** Suspends all Java threads in the target process. Can only be
- called if we are attached to a HotSpot JVM and can connect to
- the SA's JVMDI module. Must not be called when the target
- process has been suspended with suspend(). */
- public synchronized void suspendJava() throws DebuggerException {
- if (!canInteractWithJava()) {
- throw new DebuggerException("Could not connect to SA's JVMDI module");
- }
- if (jvmdi.isSuspended()) {
- throw new DebuggerException("Target process already suspended via JVMDI");
- }
- jvmdi.suspend();
- }
-
- /** Resumes all Java threads in the target process. Can only be
- called if we are attached to a HotSpot JVM and can connect to
- the SA's JVMDI module. Must not be called when the target
- process has been suspended with suspend(). */
- public synchronized void resumeJava() throws DebuggerException {
- if (!canInteractWithJava()) {
- throw new DebuggerException("Could not connect to SA's JVMDI module");
- }
- if (!jvmdi.isSuspended()) {
- throw new DebuggerException("Target process already resumed via JVMDI");
- }
- jvmdi.resume();
- }
-
- /** Indicates whether the target process has been suspended at the
- Java language level via the SA's JVMDI module */
- public synchronized boolean isJavaSuspended() throws DebuggerException {
- return jvmdi.isSuspended();
- }
-
- /** Toggle a Java breakpoint at the given location. */
- public synchronized ServiceabilityAgentJVMDIModule.BreakpointToggleResult
- toggleJavaBreakpoint(String srcFileName,
- String pkgName,
- int lineNo) {
- if (!canInteractWithJava()) {
- throw new DebuggerException("Could not connect to SA's JVMDI module; can not toggle Java breakpoints");
- }
- return jvmdi.toggleBreakpoint(srcFileName, pkgName, lineNo);
- }
-
- /** Access to JVMDI module's eventPending */
- public synchronized boolean javaEventPending() throws DebuggerException {
- if (!canInteractWithJava()) {
- throw new DebuggerException("Could not connect to SA's JVMDI module; can not poll for Java debug events");
- }
- return jvmdi.eventPending();
- }
-
- /** Access to JVMDI module's eventPoll */
- public synchronized Event javaEventPoll() throws DebuggerException {
- if (!canInteractWithJava()) {
- throw new DebuggerException("Could not connect to SA's JVMDI module; can not poll for Java debug events");
- }
- return jvmdi.eventPoll();
- }
-
- /** Access to JVMDI module's eventContinue */
- public synchronized void javaEventContinue() throws DebuggerException {
- if (!canInteractWithJava()) {
- throw new DebuggerException("Could not connect to SA's JVMDI module; can not continue past Java debug events");
- }
- jvmdi.eventContinue();
- }
-
-
- // FIXME: add other accessors. For example, suspension and
- // resumption should be done through this interface, as well as
- // interaction with the live Java process such as breakpoint setting.
- // Probably should not expose the ServiceabilityAgentJVMDIModule
- // from this interface.
-
- //--------------------------------------------------------------------------------
- // Client-side operations
- //
-
- /** This attaches to a process running on the local machine. */
- public synchronized void attach(int processID)
- throws DebuggerException {
- if (debugger != null) {
- throw new DebuggerException("Already attached");
- }
- pid = processID;
- startupMode = PROCESS_MODE;
- isServer = false;
- go();
- }
-
- /** This opens a core file on the local machine */
- public synchronized void attach(String executableName, String coreFileName)
- throws DebuggerException {
- if (debugger != null) {
- throw new DebuggerException("Already attached");
- }
- if ((executableName == null) || (coreFileName == null)) {
- throw new DebuggerException("Both the core file name and executable name must be specified");
- }
- this.executableName = executableName;
- this.coreFileName = coreFileName;
- startupMode = CORE_FILE_MODE;
- isServer = false;
- go();
- }
-
- /** This attaches to a "debug server" on a remote machine; this
- remote server has already attached to a process or opened a
- core file and is waiting for RMI calls on the Debugger object to
- come in. */
- public synchronized void attach(String remoteServerID)
- throws DebuggerException {
- if (debugger != null) {
- throw new DebuggerException("Already attached to a process");
- }
- if (remoteServerID == null) {
- throw new DebuggerException("Debug server id must be specified");
- }
-
- debugServerID = remoteServerID;
- startupMode = REMOTE_MODE;
- isServer = false;
- go();
- }
-
- /** This should only be called by the user on the client machine,
- not the server machine */
- public synchronized boolean detach() throws DebuggerException {
- if (isServer) {
- throw new DebuggerException("Should not call detach() for server configuration");
- }
- return detachInternal();
- }
-
- //--------------------------------------------------------------------------------
- // Server-side operations
- //
-
- /** This attaches to a process running on the local machine and
- starts a debug server, allowing remote machines to connect and
- examine this process. uniqueID is used to uniquely identify the
- debuggee */
- public synchronized void startServer(int processID, String uniqueID)
- throws DebuggerException {
- if (debugger != null) {
- throw new DebuggerException("Already attached");
- }
- pid = processID;
- startupMode = PROCESS_MODE;
- isServer = true;
- serverID = uniqueID;
- go();
- }
-
- /** This attaches to a process running on the local machine and
- starts a debug server, allowing remote machines to connect and
- examine this process. */
- public synchronized void startServer(int processID)
- throws DebuggerException {
- startServer(processID, null);
- }
-
- /** This opens a core file on the local machine and starts a debug
- server, allowing remote machines to connect and examine this
- core file. uniqueID is used to uniquely identify the
- debuggee */
- public synchronized void startServer(String executableName, String coreFileName,
- String uniqueID)
- throws DebuggerException {
- if (debugger != null) {
- throw new DebuggerException("Already attached");
- }
- if ((executableName == null) || (coreFileName == null)) {
- throw new DebuggerException("Both the core file name and Java executable name must be specified");
- }
- this.executableName = executableName;
- this.coreFileName = coreFileName;
- startupMode = CORE_FILE_MODE;
- isServer = true;
- serverID = uniqueID;
- go();
- }
-
- /** This opens a core file on the local machine and starts a debug
- server, allowing remote machines to connect and examine this
- core file.*/
- public synchronized void startServer(String executableName, String coreFileName)
- throws DebuggerException {
- startServer(executableName, coreFileName, null);
- }
-
- /** This may only be called on the server side after startServer()
- has been called */
- public synchronized boolean shutdownServer() throws DebuggerException {
- if (!isServer) {
- throw new DebuggerException("Should not call shutdownServer() for client configuration");
- }
- return detachInternal();
- }
-
-
- //--------------------------------------------------------------------------------
- // Internals only below this point
- //
-
- private boolean detachInternal() {
- if (debugger == null) {
- return false;
- }
- if (canInteractWithJava()) {
- jvmdi.detach();
- jvmdi = null;
- }
- boolean retval = true;
- if (!isServer) {
- VM.shutdown();
- }
- // We must not call detach() if we are a client and are connected
- // to a remote debugger
- Debugger dbg = null;
- DebuggerException ex = null;
- if (isServer) {
- try {
- RMIHelper.unbind(serverID);
- }
- catch (DebuggerException de) {
- ex = de;
- }
- dbg = debugger;
- } else {
- if (startupMode != REMOTE_MODE) {
- dbg = debugger;
- }
- }
- if (dbg != null) {
- retval = dbg.detach();
- }
-
- debugger = null;
- machDesc = null;
- db = null;
- if (ex != null) {
- throw(ex);
- }
- return retval;
- }
-
- private void go() {
- setupDebugger();
- javaMode = setupVM();
- }
-
- private void setupDebugger() {
- if (startupMode != REMOTE_MODE) {
- //
- // Local mode (client attaching to local process or setting up
- // server, but not client attaching to server)
- //
-
- try {
- os = PlatformInfo.getOS();
- cpu = PlatformInfo.getCPU();
- }
- catch (UnsupportedPlatformException e) {
- throw new DebuggerException(e);
- }
- fileSep = System.getProperty("file.separator");
-
- if (os.equals("solaris")) {
- setupDebuggerSolaris();
- } else if (os.equals("win32")) {
- setupDebuggerWin32();
- } else if (os.equals("linux")) {
- setupDebuggerLinux();
- } else if (os.equals("bsd")) {
- setupDebuggerBsd();
- } else {
- // Add support for more operating systems here
- throw new DebuggerException("Operating system " + os + " not yet supported");
- }
- if (isServer) {
- RemoteDebuggerServer remote = null;
- try {
- remote = new RemoteDebuggerServer(debugger);
- }
- catch (RemoteException rem) {
- throw new DebuggerException(rem);
- }
- RMIHelper.rebind(serverID, remote);
- }
- } else {
- //
- // Remote mode (client attaching to server)
- //
-
- // Create and install a security manager
-
- // FIXME: currently commented out because we were having
- // security problems since we're "in the sun.* hierarchy" here.
- // Perhaps a permissive policy file would work around this. In
- // the long run, will probably have to move into com.sun.*.
-
- // if (System.getSecurityManager() == null) {
- // System.setSecurityManager(new RMISecurityManager());
- // }
-
- connectRemoteDebugger();
- }
- }
-
- private boolean setupVM() {
- // We need to instantiate a HotSpotTypeDataBase on both the client
- // and server machine. On the server it is only currently used to
- // configure the Java primitive type sizes (which we should
- // consider making constant). On the client it is used to
- // configure the VM.
-
- try {
- if (os.equals("solaris")) {
- db = new HotSpotTypeDataBase(machDesc, new HotSpotSolarisVtblAccess(debugger, jvmLibNames),
- debugger, jvmLibNames);
- } else if (os.equals("win32")) {
- db = new HotSpotTypeDataBase(machDesc, new Win32VtblAccess(debugger, jvmLibNames),
- debugger, jvmLibNames);
- } else if (os.equals("linux")) {
- db = new HotSpotTypeDataBase(machDesc, new LinuxVtblAccess(debugger, jvmLibNames),
- debugger, jvmLibNames);
- } else if (os.equals("bsd")) {
- db = new HotSpotTypeDataBase(machDesc, new BsdVtblAccess(debugger, jvmLibNames),
- debugger, jvmLibNames);
- } else {
- throw new DebuggerException("OS \"" + os + "\" not yet supported (no VtblAccess implemented yet)");
- }
- }
- catch (NoSuchSymbolException e) {
- e.printStackTrace();
- return false;
- }
-
- if (startupMode != REMOTE_MODE) {
- // Configure the debugger with the primitive type sizes just obtained from the VM
- debugger.configureJavaPrimitiveTypeSizes(db.getJBooleanType().getSize(),
- db.getJByteType().getSize(),
- db.getJCharType().getSize(),
- db.getJDoubleType().getSize(),
- db.getJFloatType().getSize(),
- db.getJIntType().getSize(),
- db.getJLongType().getSize(),
- db.getJShortType().getSize());
- }
-
- if (!isServer) {
- // Do not initialize the VM on the server (unnecessary, since it's
- // instantiated on the client)
- VM.initialize(db, debugger);
- }
-
- try {
- jvmdi = new ServiceabilityAgentJVMDIModule(debugger, saLibNames);
- if (jvmdi.canAttach()) {
- jvmdi.attach();
- jvmdi.setCommandTimeout(6000);
- debugPrintln("Attached to Serviceability Agent's JVMDI module.");
- // Jog VM to suspended point with JVMDI module
- resume();
- suspendJava();
- suspend();
- debugPrintln("Suspended all Java threads.");
- } else {
- debugPrintln("Could not locate SA's JVMDI module; skipping attachment");
- jvmdi = null;
- }
- } catch (Exception e) {
- e.printStackTrace();
- jvmdi = null;
- }
-
- return true;
- }
-
- //--------------------------------------------------------------------------------
- // OS-specific debugger setup/connect routines
- //
-
- //
- // Solaris
- //
-
- private void setupDebuggerSolaris() {
- setupJVMLibNamesSolaris();
- ProcDebuggerLocal dbg = new ProcDebuggerLocal(null, true);
- debugger = dbg;
- attachDebugger();
-
- // Set up CPU-dependent stuff
- if (cpu.equals("x86")) {
- machDesc = new MachineDescriptionIntelX86();
- } else if (cpu.equals("sparc")) {
- int addressSize = dbg.getRemoteProcessAddressSize();
- if (addressSize == -1) {
- throw new DebuggerException("Error occurred while trying to determine the remote process's address size");
- }
-
- if (addressSize == 32) {
- machDesc = new MachineDescriptionSPARC32Bit();
- } else if (addressSize == 64) {
- machDesc = new MachineDescriptionSPARC64Bit();
- } else {
- throw new DebuggerException("Address size " + addressSize + " is not supported on SPARC");
- }
- } else if (cpu.equals("amd64")) {
- machDesc = new MachineDescriptionAMD64();
- } else {
- throw new DebuggerException("Solaris only supported on sparc/sparcv9/x86/amd64");
- }
-
- dbg.setMachineDescription(machDesc);
- }
-
- private void connectRemoteDebugger() throws DebuggerException {
- RemoteDebugger remote =
- (RemoteDebugger) RMIHelper.lookup(debugServerID);
- debugger = new RemoteDebuggerClient(remote);
- machDesc = ((RemoteDebuggerClient) debugger).getMachineDescription();
- os = debugger.getOS();
- if (os.equals("solaris")) {
- setupJVMLibNamesSolaris();
- } else if (os.equals("win32")) {
- setupJVMLibNamesWin32();
- } else if (os.equals("linux")) {
- setupJVMLibNamesLinux();
- } else if (os.equals("bsd")) {
- setupJVMLibNamesBsd();
- } else {
- throw new RuntimeException("Unknown OS type");
- }
-
- cpu = debugger.getCPU();
- }
-
- private void setupJVMLibNamesSolaris() {
- jvmLibNames = new String[] { "libjvm.so", "libjvm_g.so", "gamma_g" };
- saLibNames = new String[] { "libsa.so", "libsa_g.so" };
- }
-
- //
- // Win32
- //
-
- private void setupDebuggerWin32() {
- setupJVMLibNamesWin32();
-
- if (cpu.equals("x86")) {
- machDesc = new MachineDescriptionIntelX86();
- } else if (cpu.equals("amd64")) {
- machDesc = new MachineDescriptionAMD64();
- } else if (cpu.equals("ia64")) {
- machDesc = new MachineDescriptionIA64();
- } else {
- throw new DebuggerException("Win32 supported under x86, amd64 and ia64 only");
- }
-
- // Note we do not use a cache for the local debugger in server
- // mode; it will be taken care of on the client side (once remote
- // debugging is implemented).
-
- debugger = new WindbgDebuggerLocal(machDesc, !isServer);
-
- attachDebugger();
- }
-
- private void setupJVMLibNamesWin32() {
- jvmLibNames = new String[] { "jvm.dll", "jvm_g.dll" };
- saLibNames = new String[] { "sa.dll", "sa_g.dll" };
- }
-
- //
- // Linux
- //
-
- private void setupDebuggerLinux() {
- setupJVMLibNamesLinux();
-
- if (cpu.equals("x86")) {
- machDesc = new MachineDescriptionIntelX86();
- } else if (cpu.equals("ia64")) {
- machDesc = new MachineDescriptionIA64();
- } else if (cpu.equals("amd64")) {
- machDesc = new MachineDescriptionAMD64();
- } else if (cpu.equals("sparc")) {
- if (LinuxDebuggerLocal.getAddressSize()==8) {
- machDesc = new MachineDescriptionSPARC64Bit();
- } else {
- machDesc = new MachineDescriptionSPARC32Bit();
- }
- } else {
- try {
- machDesc = (MachineDescription)
- Class.forName("sun.jvm.hotspot.debugger.MachineDescription" +
- cpu.toUpperCase()).newInstance();
- } catch (Exception e) {
- throw new DebuggerException("unsupported machine type");
- }
- }
-
-
- // Note we do not use a cache for the local debugger in server
- // mode; it will be taken care of on the client side (once remote
- // debugging is implemented).
-
- debugger = new LinuxDebuggerLocal(machDesc, !isServer);
- attachDebugger();
- }
-
- private void setupJVMLibNamesLinux() {
- // same as solaris
- setupJVMLibNamesSolaris();
- }
-
- //
- // BSD
- //
-
- private void setupDebuggerBsd() {
- setupJVMLibNamesBsd();
-
- if (cpu.equals("x86")) {
- machDesc = new MachineDescriptionIntelX86();
- } else if (cpu.equals("amd64") || (cpu.equals("x86_64"))) {
- machDesc = new MachineDescriptionAMD64();
- } else {
- throw new DebuggerException("Bsd only supported on x86/x86_64. Current arch: " + cpu);
- }
-
- // Note we do not use a cache for the local debugger in server
- // mode; it will be taken care of on the client side (once remote
- // debugging is implemented).
-
- debugger = new BsdDebuggerLocal(machDesc, !isServer);
- attachDebugger();
- }
-
- private void setupJVMLibNamesBsd() {
- // same as solaris
- setupJVMLibNamesSolaris();
- }
-
- /** Convenience routine which should be called by per-platform
- debugger setup. Should not be called when startupMode is
- REMOTE_MODE. */
- private void attachDebugger() {
- if (startupMode == PROCESS_MODE) {
- debugger.attach(pid);
- } else if (startupMode == CORE_FILE_MODE) {
- debugger.attach(executableName, coreFileName);
- } else {
- throw new DebuggerException("Should not call attach() for startupMode == " + startupMode);
- }
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/JavaLineNumberInfo.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/JavaLineNumberInfo.java
deleted file mode 100644
index ff5e8c42035..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/JavaLineNumberInfo.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2002, 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 sun.jvm.hotspot.bugspot;
-
-import sun.jvm.hotspot.oops.*;
-
-/** Wrapper class which describes line number information for Java
- class files. The line number table is converted into this
- representation on demand. These objects are then sorted by line
- number for fast lookup when setting breakpoints in a particular
- source file. */
-
-public class JavaLineNumberInfo {
- private InstanceKlass klass;
- private Method method;
- private int startBCI;
- private int lineNumber;
-
- public JavaLineNumberInfo(InstanceKlass klass,
- Method method,
- int startBCI,
- int lineNumber) {
- this.klass = klass;
- this.method = method;
- this.startBCI = startBCI;
- this.lineNumber = lineNumber;
- }
-
- public InstanceKlass getKlass() { return klass; }
- public Method getMethod() { return method; }
- public int getStartBCI() { return startBCI; }
- public int getLineNumber() { return lineNumber; }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/Main.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/Main.java
deleted file mode 100644
index 97272b93d1a..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/Main.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2001, 2008, 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 sun.jvm.hotspot.bugspot;
-
-import java.awt.*;
-import java.awt.event.*;
-import javax.swing.*;
-
-import sun.jvm.hotspot.ui.*;
-
-/** The main class for the BugSpot debugger. */
-
-public class Main {
- public static void main(String[] args) {
- JFrame frame = new JFrame("BugSpot");
- frame.setSize(800, 600);
- BugSpot db = new BugSpot();
- db.setMDIMode(true);
- db.build();
- frame.setJMenuBar(db.getMenuBar());
- frame.getContentPane().add(db);
- frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
-
- GraphicsUtilities.reshapeToAspectRatio(frame,
- 4.0f/3.0f, 0.85f, Toolkit.getDefaultToolkit().getScreenSize());
- GraphicsUtilities.centerInContainer(frame,
- Toolkit.getDefaultToolkit().getScreenSize());
- frame.setVisible(true);
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/PCFinder.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/PCFinder.java
deleted file mode 100644
index 5f886715238..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/PCFinder.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2001, 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 sun.jvm.hotspot.bugspot;
-
-import sun.jvm.hotspot.debugger.*;
-import sun.jvm.hotspot.debugger.cdbg.*;
-
-/** Helper class for locating a program counter. Indicates the
- confidence of the find. */
-
-public class PCFinder {
- public static final int LOW_CONFIDENCE = 1;
- public static final int HIGH_CONFIDENCE = 2;
-
- public static class Info {
- private String name;
- private long offset;
- private int confidence;
-
- public Info(String name, long offset, int confidence) {
- this.name = name;
- this.offset = offset;
- this.confidence = confidence;
- }
-
- /** May be null */
- public String getName() { return name; }
-
- /** If this is -1, a symbol could not be found, and the offset
- should not be shown */
- public long getOffset() { return offset; }
-
- /** PCFinder.LOW_CONFIDENCE or PCFinder.HIGH_CONFIDENCE */
- public int getConfidence() { return confidence; }
- }
-
- /** Passed loadobject may be null in which case the returned Info
- object has low confidence */
- public static Info findPC(Address pc, LoadObject lo, CDebugger dbg) {
- if (lo == null) {
- return new Info(null, -1, LOW_CONFIDENCE);
- }
-
- // First try debug info
- BlockSym sym = lo.debugInfoForPC(pc);
- while (sym != null) {
- if (sym.isFunction()) {
- // Highest confidence
- return new Info(sym.toString(), pc.minus(sym.getAddress()), HIGH_CONFIDENCE);
- }
- }
-
- // Now try looking up symbol in loadobject
-
- // FIXME: must add support for mapfiles on Win32 and try looking
- // up there first if possible. Should we hide that behind
- // LoadObject.closestSymbolToPC and have the ClosestSymbol return
- // confidence? I think so. On Solaris there is no notion of a
- // mapfile, and the confidence for closestSymbolToPC will be high
- // instead of low.
-
- int confidence = HIGH_CONFIDENCE;
-
- ClosestSymbol cs = lo.closestSymbolToPC(pc);
- if (cs != null) {
- // FIXME: currently low confidence (only on Win32)
- return new Info(cs.getName() + "()", cs.getOffset(), LOW_CONFIDENCE);
- }
-
- // Unknown location
- return new Info(dbg.getNameOfFile(lo.getName()).toUpperCase() +
- "! " + pc + "()", -1, HIGH_CONFIDENCE);
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/PackageScanner.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/PackageScanner.java
deleted file mode 100644
index edc0d38db14..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/PackageScanner.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2002, 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 sun.jvm.hotspot.bugspot;
-
-import java.io.*;
-
-/** Scans a .java file for the package that it is in. */
-
-public class PackageScanner {
-
- public PackageScanner() {
- }
-
- public String scan(String filename) {
- return scan(new File(filename));
- }
-
- /** Returns the String comprising the package name of the classes in
- this .java file. Returns the (non-null) empty string if any
- error occurs or if the classes are in the unnamed package. */
- public String scan(File file) {
- BufferedReader buf = null;
- String res = "";
- try {
- buf = new BufferedReader(new FileReader(file));
- StreamTokenizer tok = new StreamTokenizer(buf);
- tok.slashStarComments(true);
- tok.slashSlashComments(true);
- if (tok.nextToken() != StreamTokenizer.TT_WORD) {
- return res;
- }
- if (!tok.sval.equals("package")) {
- return res;
- }
- if (tok.nextToken() != StreamTokenizer.TT_WORD) {
- return res;
- }
- res = tok.sval;
- return res;
- } catch (FileNotFoundException e) {
- return res;
- } catch (IOException e) {
- return res;
- } finally {
- try {
- if (buf != null) {
- buf.close();
- }
- } catch (IOException e) {
- }
- }
- }
-
- public static void main(String[] args) {
- if (args.length != 1) {
- usage();
- }
-
- System.out.println(new PackageScanner().scan(args[0]));
- }
-
- private static void usage() {
- System.err.println("Usage: java PackageScanner <.java file name>");
- System.err.println("Prints package the .java file is in to stdout.");
- System.exit(1);
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/RegisterPanel.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/RegisterPanel.java
deleted file mode 100644
index f33d04b3ee2..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/RegisterPanel.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (c) 2001, 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 sun.jvm.hotspot.bugspot;
-
-import java.awt.*;
-import java.util.*;
-import javax.swing.*;
-import javax.swing.table.*;
-
-import sun.jvm.hotspot.debugger.*;
-
-/** Displays registers in a window. FIXME: this will need more work to
- understand and handle register windows. */
-
-public class RegisterPanel extends JPanel {
- private java.util.List/**/ registers;
- private AbstractTableModel dataModel;
- private boolean valid;
- private boolean editable;
- private String nullAddressString;
- private ThreadProxy curThread;
- private JTable table;
-
- static class RegisterInfo {
- private String name;
- private Address value;
-
- RegisterInfo(String name, Address value) {
- this.name = name;
- this.value = value;
- }
-
- String getName() { return name; }
- Address getValue() { return value; }
- }
-
- public RegisterPanel() {
- super();
-
- registers = new ArrayList();
-
- dataModel = new AbstractTableModel() {
- public int getColumnCount() { return 2; }
- public int getRowCount() { return registers.size(); }
- public String getColumnName(int col) {
- switch (col) {
- case 0:
- return "Register Name";
- case 1:
- return "Register Value";
- default:
- throw new RuntimeException("Index " + col + " out of bounds");
- }
- }
- public Object getValueAt(int row, int col) {
- RegisterInfo info = (RegisterInfo) registers.get(row);
-
- switch (col) {
- case 0:
- return info.getName();
- case 1:
- if (valid) {
- Address val = info.getValue();
- if (val != null) {
- return val;
- } else {
- return nullAddressString;
- }
- } else {
- return "-";
- }
- default:
- throw new RuntimeException("Index (" + col + ", " + row + ") out of bounds");
- }
- }
- public boolean isCellEditable(int row, int col) {
- if (col == 0) return false;
- if (!valid) return false;
- if (curThread == null) return false;
- if (!curThread.canSetContext()) return false;
-
- // FIXME: add listener to watch for register changes
- // return true;
- return false;
- }
- };
-
- // Build user interface
- setLayout(new BorderLayout());
- table = new JTable(dataModel);
- table.setCellSelectionEnabled(true);
- table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
- table.setDragEnabled(true);
- JTableHeader header = table.getTableHeader();
- header.setReorderingAllowed(false);
- JScrollPane scrollPane = new JScrollPane(table);
- add(scrollPane, BorderLayout.CENTER);
- }
-
-
- /** Updates the register panel with the register set from the
- specified thread. Call this when the process has been suspended
- and the current thread has been set. FIXME: this interface will
- need to change to support register windows. */
- public void update(ThreadProxy curThread) {
- this.curThread = curThread;
- ThreadContext context = curThread.getContext();
- editable = curThread.canSetContext();
- registers.clear();
- for (int i = 0; i < context.getNumRegisters(); i++) {
- String name = context.getRegisterName(i);
- Address addr = context.getRegisterAsAddress(i);
- if ((nullAddressString == null) && (addr != null)) {
- String addrStr = addr.toString();
- StringBuffer buf = new StringBuffer();
- buf.append("0x");
- int len = addrStr.length() - 2;
- for (int j = 0; j < len; j++) {
- buf.append("0");
- }
- nullAddressString = buf.toString();
- }
- registers.add(new RegisterInfo(name, addr));
- }
- valid = true;
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- dataModel.fireTableDataChanged();
- }
- });
- }
-
- /** Clears the registers' values. Call this when the processs has
- been resumed. */
- public void clear() {
- valid = false;
- nullAddressString = null;
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- dataModel.fireTableDataChanged();
- }
- });
- }
-
- public void setFont(Font font) {
- super.setFont(font);
- if (table != null) {
- table.setFont(font);
- }
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/StackTraceEntry.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/StackTraceEntry.java
deleted file mode 100644
index 951f896d2b1..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/StackTraceEntry.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2001, 2002, 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 sun.jvm.hotspot.bugspot;
-
-import sun.jvm.hotspot.debugger.cdbg.*;
-import sun.jvm.hotspot.oops.*;
-import sun.jvm.hotspot.runtime.*;
-
-/** This class describes a frame in a stack trace. It abstracts over
- C/C++ and Java frames. */
-
-public class StackTraceEntry {
- private CFrame cFrame;
- private CDebugger dbg;
- private JavaVFrame javaFrame;
- private String value; // What is displayed in a stack trace
- // For merging C and Java stack traces.
- // For more precise stack traces, should probably have a way to
- // convert a CFrame to a sun.jvm.hotspot.runtime.Frame. For now,
- // doing similar algorithm to jdbx (which does not have intimate
- // knowledge of the VM).
- private boolean isUnknownCFrame;
-
- public StackTraceEntry(CFrame cFrame, CDebugger dbg) {
- this.cFrame = cFrame;
- this.dbg = dbg;
- computeValue();
- }
-
- public StackTraceEntry(JavaVFrame javaFrame) {
- this.javaFrame = javaFrame;
- computeValue();
- }
-
- public boolean isCFrame() { return (cFrame != null); }
- public boolean isJavaFrame() { return (javaFrame != null); }
- public CFrame getCFrame() { return cFrame; }
- public JavaVFrame getJavaFrame() { return javaFrame; }
- public boolean isUnknownCFrame() { return isUnknownCFrame; }
- public String toString() {
- return value;
- }
-
- private void computeValue() {
- isUnknownCFrame = true;
- value = "";
- if (cFrame != null) {
- PCFinder.Info info = PCFinder.findPC(cFrame.pc(), cFrame.loadObjectForPC(), dbg);
- if (info.getName() != null) {
- value = "(C) " + info.getName();
- isUnknownCFrame = false;
- if (info.getConfidence() == PCFinder.LOW_CONFIDENCE) {
- value = value + " (?)";
- }
- if (info.getOffset() >= 0) {
- value = value + " + 0x" + Long.toHexString(info.getOffset());
- }
- }
- } else if (javaFrame != null) {
- isUnknownCFrame = false;
- Method m = javaFrame.getMethod();
- value = "(J) " + m.externalNameAndSignature();
- }
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/StackTracePanel.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/StackTracePanel.java
deleted file mode 100644
index 76751ca786a..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/StackTracePanel.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2001, 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 sun.jvm.hotspot.bugspot;
-
-import java.awt.*;
-import java.awt.event.*;
-import java.util.*;
-import javax.swing.*;
-import sun.jvm.hotspot.debugger.cdbg.*;
-import sun.jvm.hotspot.runtime.*;
-import sun.jvm.hotspot.ui.*;
-
-/** This panel contains a ListBox with all of the stack frames in a
- given thread. When a given entry is selected, an event is
- fired. */
-
-public class StackTracePanel extends JPanel {
- public interface Listener {
- public void frameChanged(CFrame fr, JavaVFrame jfr);
- }
-
- class Model extends AbstractListModel implements ComboBoxModel {
- private Object selectedItem;
- public Object getElementAt(int index) {
- if (trace == null) return null;
- return trace.get(index);
- }
- public int getSize() {
- if (trace == null) return 0;
- return trace.size();
- }
- public Object getSelectedItem() {
- return selectedItem;
- }
- public void setSelectedItem(Object item) {
- selectedItem = item;
- }
- public void dataChanged() {
- fireContentsChanged(this, 0, trace.size());
- }
- }
-
- private java.util.List trace;
- private Model model;
- private JComboBox list;
- private java.util.List listeners;
-
- public StackTracePanel() {
- super();
-
- model = new Model();
-
- // Build user interface
- setLayout(new BorderLayout());
- setBorder(GraphicsUtilities.newBorder(5));
- list = new JComboBox(model);
- list.setPrototypeDisplayValue("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ");
- add(list, BorderLayout.CENTER);
-
- // Add selection listener
- list.addItemListener(new ItemListener() {
- public void itemStateChanged(ItemEvent e) {
- if (e.getStateChange() == ItemEvent.SELECTED) {
- fireFrameChanged();
- }
- }
- });
- }
-
- /** Takes a List of StackTraceEntry objects */
- public void setTrace(java.util.List trace) {
- this.trace = trace;
- model.dataChanged();
- list.setSelectedIndex(0);
- fireFrameChanged();
- }
-
- public void addListener(Listener listener) {
- if (listeners == null) {
- listeners = new ArrayList();
- }
- listeners.add(listener);
- }
-
- protected void fireFrameChanged() {
- if (listeners != null) {
- StackTraceEntry entry = (StackTraceEntry) trace.get(list.getSelectedIndex());
- for (Iterator iter = listeners.iterator(); iter.hasNext(); ) {
- ((Listener) iter.next()).frameChanged(entry.getCFrame(), entry.getJavaFrame());
- }
- }
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/ThreadListPanel.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/ThreadListPanel.java
deleted file mode 100644
index f8a0d56c4d6..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/ThreadListPanel.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright (c) 2001, 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 sun.jvm.hotspot.bugspot;
-
-import java.awt.*;
-import java.awt.event.*;
-import java.util.*;
-import javax.swing.*;
-import javax.swing.table.*;
-
-import sun.jvm.hotspot.debugger.*;
-import sun.jvm.hotspot.debugger.cdbg.*;
-import sun.jvm.hotspot.runtime.*;
-import sun.jvm.hotspot.ui.*;
-
-// NOTE: this class was not placed in sun.jvm.hotspot.ui to prevent
-// mixing components designed for C and C++ debugging with the ones
-// that work with the core serviceability agent functionality (which
-// does not require that the CDebugger interface be implemented).
-
-/** The ThreadListPanel is used for C and C++ debugging and can
- visualize all threads in the target process. The caller passes in
- a CDebugger attached to the target process and can request that
- JavaThreads' associations with these underlying threads be
- displayed; this option is only valid when attached to a HotSpot
- JVM and when the {@link sun.jvm.hotspot.runtime.VM} has been
- initialized. */
-
-public class ThreadListPanel extends JPanel {
- /** Listener which can be added to receive "Set Focus" events */
- public static interface Listener {
- /** ThreadProxy will always be provided; JavaThread will only be
- present if displayJavaThreads was specified in the constructor
- for the panel and the thread was a JavaThread. */
- public void setFocus(ThreadProxy thread, JavaThread jthread);
- }
-
- static class ThreadInfo {
- private ThreadProxy thread;
- // Distinguish between PC == null and no top frame
- private boolean gotPC;
- private Address pc;
- private String location;
- private JavaThread javaThread;
- private String javaThreadName;
-
- public ThreadInfo(ThreadProxy thread, CDebugger dbg, JavaThread jthread) {
- this.thread = thread;
- this.location = "";
- CFrame fr = dbg.topFrameForThread(thread);
- if (fr != null) {
- gotPC = true;
- pc = fr.pc();
- PCFinder.Info info = PCFinder.findPC(pc, fr.loadObjectForPC(), dbg);
- if (info.getName() != null) {
- location = info.getName();
- if (info.getConfidence() == PCFinder.LOW_CONFIDENCE) {
- location = location + " (?)";
- }
- if (info.getOffset() < 0) {
- location = location + " + 0x" + Long.toHexString(info.getOffset());
- }
- }
- }
- if (jthread != null) {
- javaThread = jthread;
- javaThreadName = jthread.getThreadName();
- }
- }
-
- public ThreadProxy getThread() { return thread; }
- public boolean hasPC() { return gotPC; }
- public Address getPC() { return pc; }
- public String getLocation() { return location; }
- public boolean isJavaThread() { return (javaThread != null); }
- public JavaThread getJavaThread() { return javaThread; }
- public String getJavaThreadName() { return javaThreadName; }
- }
-
- // List
- private java.util.List threadList;
- private JTable table;
- private AbstractTableModel dataModel;
- // List
- private java.util.List listeners;
-
- /** Takes a CDebugger from which the thread list is queried.
- displayJavaThreads must only be set to true if the debugger is
- attached to a HotSpot JVM and if the VM has already been
- initialized. */
- public ThreadListPanel(CDebugger dbg, final boolean displayJavaThreads) {
- super();
-
- Map threadToJavaThreadMap = null;
- if (displayJavaThreads) {
- // Collect Java threads from virtual machine and insert them in
- // table for later querying
- threadToJavaThreadMap = new HashMap();
- Threads threads = VM.getVM().getThreads();
- for (JavaThread thr = threads.first(); thr != null; thr = thr.next()) {
- threadToJavaThreadMap.put(thr.getThreadProxy(), thr);
- }
- }
-
- java.util.List/**/ threads = dbg.getThreadList();
- threadList = new ArrayList(threads.size());
- for (Iterator iter = threads.iterator(); iter.hasNext(); ) {
- ThreadProxy thr = (ThreadProxy) iter.next();
- JavaThread jthr = null;
- if (displayJavaThreads) {
- jthr = (JavaThread) threadToJavaThreadMap.get(thr);
- }
- threadList.add(new ThreadInfo(thr, dbg, jthr));
- }
-
- // Thread ID, current PC, current symbol, Java Thread, [Java thread name]
- dataModel = new AbstractTableModel() {
- public int getColumnCount() { return (displayJavaThreads ? 5 : 3); }
- public int getRowCount() { return threadList.size(); }
- public String getColumnName(int col) {
- switch (col) {
- case 0:
- return "Thread ID";
- case 1:
- return "PC";
- case 2:
- return "Location";
- case 3:
- return "Java?";
- case 4:
- return "Java Thread Name";
- default:
- throw new RuntimeException("Index " + col + " out of bounds");
- }
- }
- public Object getValueAt(int row, int col) {
- ThreadInfo info = (ThreadInfo) threadList.get(row);
-
- switch (col) {
- case 0:
- return info.getThread();
- case 1:
- {
- if (info.hasPC()) {
- return info.getPC();
- }
- return "";
- }
- case 2:
- return info.getLocation();
- case 3:
- if (info.isJavaThread()) {
- return "Yes";
- } else {
- return "";
- }
- case 4:
- if (info.isJavaThread()) {
- return info.getJavaThreadName();
- } else {
- return "";
- }
- default:
- throw new RuntimeException("Index (" + col + ", " + row + ") out of bounds");
- }
- }
- };
-
- // Build user interface
- setLayout(new BorderLayout());
- table = new JTable(dataModel);
- table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- JTableHeader header = table.getTableHeader();
- header.setReorderingAllowed(false);
- table.setRowSelectionAllowed(true);
- table.setColumnSelectionAllowed(false);
- JScrollPane scrollPane = new JScrollPane(table);
- add(scrollPane, BorderLayout.CENTER);
- if (threadList.size() > 0) {
- table.setRowSelectionInterval(0, 0);
- }
-
- JButton button = new JButton("Set Focus");
- button.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- int i = table.getSelectedRow();
- if (i < 0) {
- return;
- }
- ThreadInfo info = (ThreadInfo) threadList.get(i);
- for (Iterator iter = listeners.iterator(); iter.hasNext(); ) {
- ((Listener) iter.next()).setFocus(info.getThread(), info.getJavaThread());
- }
- }
- });
- JPanel focusPanel = new JPanel();
- focusPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
- focusPanel.setLayout(new BoxLayout(focusPanel, BoxLayout.Y_AXIS));
- focusPanel.add(Box.createGlue());
- focusPanel.add(button);
- focusPanel.add(Box.createGlue());
- add(focusPanel, BorderLayout.EAST);
-
- // FIXME: make listener model for the debugger so if the user
- // specifies a mapfile for or path to a given DSO later we can
- // update our state
- }
-
- public void addListener(Listener l) {
- if (listeners == null) {
- listeners = new ArrayList();
- }
- listeners.add(l);
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/VariablePanel.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/VariablePanel.java
deleted file mode 100644
index 4155e6eb673..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/VariablePanel.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright (c) 2001, 2002, 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 sun.jvm.hotspot.bugspot;
-
-import java.awt.*;
-import javax.swing.*;
-import java.util.*;
-import sun.jvm.hotspot.debugger.*;
-import sun.jvm.hotspot.debugger.cdbg.*;
-import sun.jvm.hotspot.bugspot.tree.*;
-import sun.jvm.hotspot.oops.*;
-import sun.jvm.hotspot.runtime.*;
-import sun.jvm.hotspot.ui.tree.*;
-import sun.jvm.hotspot.ui.treetable.*;
-
-/** Manages display of a set of local variables in a frame, or the
- contents of the "this" pointer */
-
-public class VariablePanel extends JPanel {
- private JTreeTable treeTable;
- private SimpleTreeTableModel model;
- private SimpleTreeGroupNode root;
-
- public VariablePanel() {
- super();
-
- model = new SimpleTreeTableModel();
- model.setValuesEditable(false);
- root = new SimpleTreeGroupNode();
- model.setRoot(root);
- treeTable = new JTreeTable(model);
- treeTable.setRootVisible(false);
- treeTable.setShowsRootHandles(true);
- treeTable.setShowsIcons(false);
- treeTable.setTreeEditable(false);
- treeTable.getTableHeader().setReorderingAllowed(false);
- treeTable.setCellSelectionEnabled(true);
- treeTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
- treeTable.setDragEnabled(true);
- JScrollPane sp = new JScrollPane(treeTable);
- sp.getViewport().setBackground(Color.white);
-
- setLayout(new BorderLayout());
- add(sp, BorderLayout.CENTER);
- }
-
- /** Clear the contents of this VariablePanel */
- public void clear() {
- root.removeAllChildren();
- model.fireTreeStructureChanged();
- }
-
- /** Update the contents of this VariablePanel from the given CFrame */
- public void update(CFrame fr) {
- // Collect locals
- CCollector coll = new CCollector();
- fr.iterateLocals(coll);
- update(coll);
- }
-
- /** Update the contents of this VariablePanel from the given JavaVFrame */
- public void update(JavaVFrame jfr) {
- Method m = jfr.getMethod();
- if (!m.hasLocalVariableTable()) {
- return;
- }
- int bci = jfr.getBCI();
- // Get local variable table
- LocalVariableTableElement[] locals = m.getLocalVariableTable();
- // Get locals as StackValueCollection
- StackValueCollection coll = jfr.getLocals();
- root.removeAllChildren();
- // See which locals are live
- for (int i = 0; i < locals.length; i++) {
- LocalVariableTableElement local = locals[i];
- if (local.getStartBCI() <= bci && bci < local.getStartBCI() + local.getLength()) {
- // Valid; add it
- SimpleTreeNode node = null;
- Symbol name = null;
- try {
- name = m.getConstants().getSymbolAt(local.getNameCPIndex());
- if (name == null) {
- System.err.println("Null name at slot " +
- local.getNameCPIndex() +
- " for local variable at slot " +
- local.getSlot());
- continue;
- }
- } catch (Exception e) {
- System.err.println("Unable to fetch name at slot " +
- local.getNameCPIndex() +
- " for local variable at slot " +
- local.getSlot());
- e.printStackTrace();
- continue;
- }
- sun.jvm.hotspot.oops.NamedFieldIdentifier f =
- new sun.jvm.hotspot.oops.NamedFieldIdentifier(name.asString());
- Symbol descriptor = null;
- try {
- descriptor = m.getConstants().getSymbolAt(local.getDescriptorCPIndex());
- } catch (Exception e) {
- System.err.println("Unable to fetch descriptor at slot " +
- local.getDescriptorCPIndex() +
- " for local variable " + f.getName() +
- " at slot " + local.getSlot());
- e.printStackTrace();
- continue;
- }
-
- if (descriptor != null) {
- switch (descriptor.getByteAt(0)) {
- case 'F': {
- node = new sun.jvm.hotspot.ui.tree.FloatTreeNodeAdapter(coll.floatAt(local.getSlot()), f, true);
- break;
- }
- case 'D': {
- node = new sun.jvm.hotspot.ui.tree.DoubleTreeNodeAdapter(coll.doubleAt(local.getSlot()), f, true);
- break;
- }
- case 'C': {
- node = new sun.jvm.hotspot.ui.tree.CharTreeNodeAdapter((char) coll.intAt(local.getSlot()), f, true);
- break;
- }
- case 'B':
- case 'S':
- case 'I': {
- node = new sun.jvm.hotspot.ui.tree.LongTreeNodeAdapter(coll.intAt(local.getSlot()), f, true);
- break;
- }
- case 'Z': {
- node = new sun.jvm.hotspot.ui.tree.BooleanTreeNodeAdapter(
- ((coll.intAt(local.getSlot()) != 0) ? true : false), f, true
- );
- break;
- }
- case 'J': {
- node = new sun.jvm.hotspot.ui.tree.LongTreeNodeAdapter(coll.longAt(local.getSlot()), f, true);
- break;
- }
- default: {
- try {
- node = new sun.jvm.hotspot.ui.tree.OopTreeNodeAdapter(
- VM.getVM().getObjectHeap().newOop(coll.oopHandleAt(local.getSlot())), f, true
- );
- } catch (AddressException e) {
- node = new sun.jvm.hotspot.ui.tree.FieldTreeNodeAdapter(f, true) {
- public int getChildCount() { return 0; }
- public SimpleTreeNode getChild(int i) { return null; }
- public boolean isLeaf() { return false; }
- public int getIndexOfChild(SimpleTreeNode child) { return 0; }
- public String getValue() {
- return "";
- }
- };
- }
- break;
- }
- }
- if (node != null) {
- root.addChild(node);
- }
- }
- }
- }
-
- model.fireTreeStructureChanged();
- }
-
- /** Update the contents of this VariablePanel from the given "this"
- pointer of the given type */
- public void update(Address thisAddr, Type type) {
- // Collect fields
- CCollector coll = new CCollector();
- type.iterateObject(thisAddr, coll);
- update(coll);
- }
-
- private void update(CCollector coll) {
- root.removeAllChildren();
- for (int i = 0; i < coll.getNumChildren(); i++) {
- root.addChild(coll.getChild(i));
- }
- model.fireTreeStructureChanged();
- }
-
- static class CCollector extends DefaultObjectVisitor {
- private java.util.List children;
-
- public CCollector() {
- children = new ArrayList();
- }
-
- public int getNumChildren() {
- return children.size();
- }
-
- public SimpleTreeNode getChild(int i) {
- return (SimpleTreeNode) children.get(i);
- }
-
- public void doBit(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, long val) {
- children.add(new sun.jvm.hotspot.bugspot.tree.LongTreeNodeAdapter(val, f, true));
- }
- public void doInt(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, long val) {
- children.add(new sun.jvm.hotspot.bugspot.tree.LongTreeNodeAdapter(val, f, true));
- }
- public void doEnum(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, long val, String enumName) {
- children.add(new sun.jvm.hotspot.bugspot.tree.EnumTreeNodeAdapter(enumName, val, f, true));
- }
- public void doFloat(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, float val) {
- children.add(new sun.jvm.hotspot.bugspot.tree.FloatTreeNodeAdapter(val, f, true));
- }
- public void doDouble(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, double val) {
- children.add(new sun.jvm.hotspot.bugspot.tree.DoubleTreeNodeAdapter(val, f, true));
- }
- public void doPointer(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, Address val) {
- children.add(new sun.jvm.hotspot.bugspot.tree.AddressTreeNodeAdapter(val, f, true));
- }
- public void doArray(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, Address val) {
- children.add(new sun.jvm.hotspot.bugspot.tree.AddressTreeNodeAdapter(val, f, true));
- }
- public void doRef(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, Address val) {
- children.add(new sun.jvm.hotspot.bugspot.tree.AddressTreeNodeAdapter(val, f, true));
- }
- public void doCompound(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, Address val) {
- children.add(new sun.jvm.hotspot.bugspot.tree.ObjectTreeNodeAdapter(val, f, true));
- }
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/AddressTreeNodeAdapter.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/AddressTreeNodeAdapter.java
deleted file mode 100644
index 18b011bfd83..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/AddressTreeNodeAdapter.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2001, 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 sun.jvm.hotspot.bugspot.tree;
-
-import sun.jvm.hotspot.debugger.*;
-import sun.jvm.hotspot.debugger.cdbg.*;
-import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
-
-/** Encapsulates a float value in a tree handled by SimpleTreeModel */
-
-public class AddressTreeNodeAdapter extends FieldTreeNodeAdapter {
- private Address val;
-
- public AddressTreeNodeAdapter(Address val, FieldIdentifier id) {
- this(val, id, false);
- }
-
- public AddressTreeNodeAdapter(Address val, FieldIdentifier id, boolean treeTableMode) {
- super(id, treeTableMode);
- this.val = val;
- }
-
- public int getChildCount() {
- return 0;
- }
-
- public SimpleTreeNode getChild(int index) {
- return null;
- }
-
- public boolean isLeaf() {
- return true;
- }
-
- public int getIndexOfChild(SimpleTreeNode child) {
- return 0;
- }
-
- public String getValue() {
- if (val != null) {
- return val.toString();
- }
- return "NULL";
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/DoubleTreeNodeAdapter.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/DoubleTreeNodeAdapter.java
deleted file mode 100644
index 7fb8d6a1039..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/DoubleTreeNodeAdapter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2001, 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 sun.jvm.hotspot.bugspot.tree;
-
-import sun.jvm.hotspot.debugger.cdbg.*;
-import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
-
-/** Encapsulates a double value in a tree handled by SimpleTreeModel */
-
-public class DoubleTreeNodeAdapter extends FieldTreeNodeAdapter {
- private double val;
-
- public DoubleTreeNodeAdapter(double val, FieldIdentifier id) {
- this(val, id, false);
- }
-
- public DoubleTreeNodeAdapter(double val, FieldIdentifier id, boolean treeTableMode) {
- super(id, treeTableMode);
- this.val = val;
- }
-
- public int getChildCount() {
- return 0;
- }
-
- public SimpleTreeNode getChild(int index) {
- return null;
- }
-
- public boolean isLeaf() {
- return true;
- }
-
- public int getIndexOfChild(SimpleTreeNode child) {
- return 0;
- }
-
- public String getValue() {
- return Double.toString(val);
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/EnumTreeNodeAdapter.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/EnumTreeNodeAdapter.java
deleted file mode 100644
index f5230f1770c..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/EnumTreeNodeAdapter.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2001, 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 sun.jvm.hotspot.bugspot.tree;
-
-import sun.jvm.hotspot.debugger.cdbg.*;
-import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
-
-/** Encapsulates an enumerated value in a tree handled by SimpleTreeModel */
-
-public class EnumTreeNodeAdapter extends FieldTreeNodeAdapter {
- private long val;
- private String enumName;
-
- public EnumTreeNodeAdapter(String enumName, long val, FieldIdentifier id) {
- this(enumName, val, id, false);
- }
-
- public EnumTreeNodeAdapter(String enumName, long val, FieldIdentifier id, boolean treeTableMode) {
- super(id, treeTableMode);
- this.enumName = enumName;
- this.val = val;
- }
-
- public int getChildCount() {
- return 0;
- }
-
- public SimpleTreeNode getChild(int index) {
- return null;
- }
-
- public boolean isLeaf() {
- return true;
- }
-
- public int getIndexOfChild(SimpleTreeNode child) {
- return 0;
- }
-
- public String getValue() {
- if (enumName != null) {
- return enumName;
- } else {
- return Long.toString(val);
- }
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/FieldTreeNodeAdapter.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/FieldTreeNodeAdapter.java
deleted file mode 100644
index 9bb465ae0c1..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/FieldTreeNodeAdapter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2001, 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 sun.jvm.hotspot.bugspot.tree;
-
-import sun.jvm.hotspot.debugger.cdbg.*;
-import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
-
-/** Abstract base class for all adapters for fields of C/C++ objects */
-
-public abstract class FieldTreeNodeAdapter implements SimpleTreeNode {
- private FieldIdentifier id;
- private boolean treeTableMode;
-
- /** The identifier may be null, i.e., for the root of the tree */
- public FieldTreeNodeAdapter(FieldIdentifier id, boolean treeTableMode) {
- this.id = id;
- this.treeTableMode = treeTableMode;
- }
-
- public FieldIdentifier getID() {
- return id;
- }
-
- /** Defaults to false in subclasses */
- public boolean getTreeTableMode() {
- return treeTableMode;
- }
-
- public Type getType() {
- return getID().getType();
- }
-
- public String getName() {
- if (getID() != null) {
- return getID().toString();
- }
- return "";
- }
-
- public String toString() {
- if (treeTableMode) {
- return getName();
- } else {
- if (getID() != null) {
- return getName() + ": " + getValue();
- } else {
- return getValue();
- }
- }
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/FloatTreeNodeAdapter.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/FloatTreeNodeAdapter.java
deleted file mode 100644
index b3aa8cbc151..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/FloatTreeNodeAdapter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2001, 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 sun.jvm.hotspot.bugspot.tree;
-
-import sun.jvm.hotspot.debugger.cdbg.*;
-import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
-
-/** Encapsulates a float value in a tree handled by SimpleTreeModel */
-
-public class FloatTreeNodeAdapter extends FieldTreeNodeAdapter {
- private float val;
-
- public FloatTreeNodeAdapter(float val, FieldIdentifier id) {
- this(val, id, false);
- }
-
- public FloatTreeNodeAdapter(float val, FieldIdentifier id, boolean treeTableMode) {
- super(id, treeTableMode);
- this.val = val;
- }
-
- public int getChildCount() {
- return 0;
- }
-
- public SimpleTreeNode getChild(int index) {
- return null;
- }
-
- public boolean isLeaf() {
- return true;
- }
-
- public int getIndexOfChild(SimpleTreeNode child) {
- return 0;
- }
-
- public String getValue() {
- return Float.toString(val);
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/LongTreeNodeAdapter.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/LongTreeNodeAdapter.java
deleted file mode 100644
index 59d1e0ddc46..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/LongTreeNodeAdapter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2001, 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 sun.jvm.hotspot.bugspot.tree;
-
-import sun.jvm.hotspot.debugger.cdbg.*;
-import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
-
-/** Encapsulates a long value in a tree handled by SimpleTreeModel */
-
-public class LongTreeNodeAdapter extends FieldTreeNodeAdapter {
- private long val;
-
- public LongTreeNodeAdapter(long val, FieldIdentifier id) {
- this(val, id, false);
- }
-
- public LongTreeNodeAdapter(long val, FieldIdentifier id, boolean treeTableMode) {
- super(id, treeTableMode);
- this.val = val;
- }
-
- public int getChildCount() {
- return 0;
- }
-
- public SimpleTreeNode getChild(int index) {
- return null;
- }
-
- public boolean isLeaf() {
- return true;
- }
-
- public int getIndexOfChild(SimpleTreeNode child) {
- return 0;
- }
-
- public String getValue() {
- return Long.toString(val);
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/ObjectTreeNodeAdapter.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/ObjectTreeNodeAdapter.java
deleted file mode 100644
index 9a659e08fe1..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/ObjectTreeNodeAdapter.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (c) 2001, 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 sun.jvm.hotspot.bugspot.tree;
-
-import java.io.*;
-import sun.jvm.hotspot.debugger.*;
-import sun.jvm.hotspot.debugger.cdbg.*;
-import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
-
-/** An adapter class which allows C/C++ objects to be displayed in a
- tree via the SimpleTreeNode interface. */
-
-public class ObjectTreeNodeAdapter extends FieldTreeNodeAdapter {
- // Address of object
- private Address addr;
-
- /** The address may be null (for object fields of objcets which are
- null). The FieldIdentifier should not be null. treeTableMode
- defaults to false. */
- public ObjectTreeNodeAdapter(Address addr, FieldIdentifier id) {
- this(addr, id, false);
- }
-
- /** The address may be null (for object fields of objcets which are
- null). The FieldIdentifier should not be null. */
- public ObjectTreeNodeAdapter(Address addr, FieldIdentifier id, boolean treeTableMode) {
- super(id, treeTableMode);
- this.addr = addr;
- }
-
- public int getChildCount() {
- if (addr == null) {
- return 0;
- }
-
- Counter c = new Counter();
- getType().iterateObject(addr, c);
- return c.getNumFields();
- }
-
- public SimpleTreeNode getChild(int index) {
- if (addr == null) {
- return null;
- }
-
- Fetcher f = new Fetcher(index);
- getType().iterateObject(addr, f);
- return f.getChild();
- }
-
- public boolean isLeaf() {
- return (addr == null);
- }
-
- public int getIndexOfChild(SimpleTreeNode child) {
- FieldIdentifier id = ((FieldTreeNodeAdapter) child).getID();
- Finder f = new Finder(id);
- getType().iterateObject(addr, f);
- return f.getIndex();
- }
-
- public String getValue() {
- if (addr != null) {
- return addr.toString();
- }
- return "NULL";
- }
-
- /** Should be used only once, then have the number of fields
- fetched. */
- static class Counter extends DefaultObjectVisitor {
- private int numFields;
-
- public int getNumFields() {
- return numFields;
- }
-
- public void doBit(FieldIdentifier f, long val) { ++numFields; }
- public void doInt(FieldIdentifier f, long val) { ++numFields; }
- public void doEnum(FieldIdentifier f, long val, String enumName) { ++numFields; }
- public void doFloat(FieldIdentifier f, float val) { ++numFields; }
- public void doDouble(FieldIdentifier f, double val) { ++numFields; }
- public void doPointer(FieldIdentifier f, Address val) { ++numFields; }
- public void doArray(FieldIdentifier f, Address val) { ++numFields; }
- public void doRef(FieldIdentifier f, Address val) { ++numFields; }
- public void doCompound(FieldIdentifier f, Address addr) { ++numFields; }
- }
-
- /** Creates a new SimpleTreeNode for the given field. */
- class Fetcher extends DefaultObjectVisitor {
- private int index;
- private int curField;
- private SimpleTreeNode child;
-
- public Fetcher(int index) {
- this.index = index;
- }
-
- public SimpleTreeNode getChild() {
- return child;
- }
-
- public void doBit(FieldIdentifier f, long val) {
- if (curField == index) {
- child = new LongTreeNodeAdapter(val, f, getTreeTableMode());
- }
- ++curField;
- }
-
- public void doInt(FieldIdentifier f, long val) {
- if (curField == index) {
- child = new LongTreeNodeAdapter(val, f, getTreeTableMode());
- }
- ++curField;
- }
-
- public void doEnum(FieldIdentifier f, long val, String enumName) {
- if (curField == index) {
- child = new EnumTreeNodeAdapter(enumName, val, f, getTreeTableMode());
- }
- ++curField;
- }
-
- public void doFloat(FieldIdentifier f, float val) {
- if (curField == index) {
- child = new FloatTreeNodeAdapter(val, f, getTreeTableMode());
- }
- ++curField;
- }
-
- public void doDouble(FieldIdentifier f, double val) {
- if (curField == index) {
- child = new DoubleTreeNodeAdapter(val, f, getTreeTableMode());
- }
- ++curField;
- }
-
- public void doPointer(FieldIdentifier f, Address val) {
- if (curField == index) {
- child = new AddressTreeNodeAdapter(val, f, getTreeTableMode());
- }
- ++curField;
- }
-
- public void doArray(FieldIdentifier f, Address val) {
- if (curField == index) {
- child = new AddressTreeNodeAdapter(val, f, getTreeTableMode());
- }
- ++curField;
- }
-
- public void doRef(FieldIdentifier f, Address val) {
- if (curField == index) {
- child = new AddressTreeNodeAdapter(val, f, getTreeTableMode());
- }
- ++curField;
- }
-
- public void doCompound(FieldIdentifier f, Address val) {
- if (curField == index) {
- child = new ObjectTreeNodeAdapter(val, f, getTreeTableMode());
- }
- ++curField;
- }
- }
-
- /** Finds the index of the given FieldIdentifier. */
- static class Finder extends DefaultObjectVisitor {
- private FieldIdentifier id;
- private int curField;
- private int index = -1;
-
- public Finder(FieldIdentifier id) {
- this.id = id;
- }
-
- /** Returns -1 if not found */
- public int getIndex() {
- return index;
- }
-
- public void doBit(FieldIdentifier f, long val) { if (f.equals(id)) { index = curField; } ++curField; }
- public void doInt(FieldIdentifier f, long val) { if (f.equals(id)) { index = curField; } ++curField; }
- public void doEnum(FieldIdentifier f, long val,
- String enumName) { if (f.equals(id)) { index = curField; } ++curField; }
- public void doFloat(FieldIdentifier f, float val) { if (f.equals(id)) { index = curField; } ++curField; }
- public void doDouble(FieldIdentifier f, double val) { if (f.equals(id)) { index = curField; } ++curField; }
- public void doPointer(FieldIdentifier f, Address val) { if (f.equals(id)) { index = curField; } ++curField; }
- public void doArray(FieldIdentifier f, Address val) { if (f.equals(id)) { index = curField; } ++curField; }
- public void doRef(FieldIdentifier f, Address val) { if (f.equals(id)) { index = curField; } ++curField; }
- public void doCompound(FieldIdentifier f,
- Address val) { if (f.equals(id)) { index = curField; } ++curField; }
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/BreakpointEvent.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/BreakpointEvent.java
deleted file mode 100644
index 066ff4224a2..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/BreakpointEvent.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2002, 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 sun.jvm.hotspot.livejvm;
-
-import sun.jvm.hotspot.oops.*;
-import sun.jvm.hotspot.runtime.*;
-
-public class BreakpointEvent extends Event {
- private Oop thread;
- private Oop clazz;
- private JNIid method;
- private int location;
-
- public BreakpointEvent(Oop thread,
- Oop clazz,
- JNIid method,
- int location) {
- super(Event.Type.BREAKPOINT);
- this.thread = thread;
- this.clazz = clazz;
- this.method = method;
- this.location = location;
- }
-
- public Oop thread() { return thread; }
- public Oop clazz() { return clazz; }
- public JNIid methodID() { return method; }
- public int location() { return location; }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/CStringAccessor.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/CStringAccessor.java
deleted file mode 100644
index 4555d9ed084..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/CStringAccessor.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2002, 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 sun.jvm.hotspot.livejvm;
-
-import java.io.UnsupportedEncodingException;
-import sun.jvm.hotspot.debugger.*;
-
-class CStringAccessor {
- private Address addr;
- private int bufLen;
-
- CStringAccessor(Address addr, int bufLen) {
- this.addr = addr;
- this.bufLen = bufLen;
- }
-
- String getValue() throws DebuggerException {
- int len = 0;
- while ((addr.getCIntegerAt(len, 1, true) != 0) && (len < bufLen)) {
- ++len;
- }
- byte[] res = new byte[len];
- for (int i = 0; i < len; i++) {
- res[i] = (byte) addr.getCIntegerAt(i, 1, true);
- }
- try {
- return new String(res, "US-ASCII");
- } catch (UnsupportedEncodingException e) {
- throw new DebuggerException("Unable to use US-ASCII encoding");
- }
- }
-
- void setValue(String value) throws DebuggerException {
- try {
- byte[] data = value.getBytes("US-ASCII");
- if (data.length >= bufLen) {
- throw new DebuggerException("String too long");
- }
- for (int i = 0; i < data.length; i++) {
- addr.setCIntegerAt(i, 1, data[i]);
- }
- addr.setCIntegerAt(data.length, 1, 0);
- } catch (UnsupportedEncodingException e) {
- throw new DebuggerException("Unable to use US-ASCII encoding");
- }
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/Event.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/Event.java
deleted file mode 100644
index 344ea6431d9..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/Event.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2002, 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 sun.jvm.hotspot.livejvm;
-
-public class Event {
- public static class Type {
- private Type() {}
- public static final Type BREAKPOINT = new Type();
- public static final Type EXCEPTION = new Type();
- }
-
- private Type type;
-
- public Event(Type type) {
- this.type = type;
- }
-
- public Type getType() { return type; }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/ExceptionEvent.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/ExceptionEvent.java
deleted file mode 100644
index aed5a1c3ab1..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/ExceptionEvent.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2002, 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 sun.jvm.hotspot.livejvm;
-
-import sun.jvm.hotspot.oops.*;
-import sun.jvm.hotspot.runtime.*;
-
-public class ExceptionEvent extends Event {
- private Oop thread;
- private Oop clazz;
- private JNIid method;
- private int location;
- private Oop exception;
- private Oop catchClass;
- private JNIid catchMethod;
- private int catchLocation;
-
- public ExceptionEvent(Oop thread,
- Oop clazz,
- JNIid method,
- int location,
- Oop exception,
- Oop catchClass,
- JNIid catchMethod,
- int catchLocation) {
- super(Event.Type.EXCEPTION);
- this.thread = thread;
- this.clazz = clazz;
- this.method = method;
- this.location = location;
- this.exception = exception;
- this.catchClass = catchClass;
- this.catchMethod = catchMethod;
- this.catchLocation = catchLocation;
- }
-
- public Oop thread() { return thread; }
- public Oop clazz() { return clazz; }
- public JNIid methodID() { return method; }
- public int location() { return location; }
- public Oop exception() { return exception; }
- public Oop catchClass() { return catchClass; }
- public JNIid catchMethodID() { return catchMethod; }
- public int catchLocation() { return catchLocation; }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/JNIHandleAccessor.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/JNIHandleAccessor.java
deleted file mode 100644
index ac3c116cc22..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/JNIHandleAccessor.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2002, 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 sun.jvm.hotspot.livejvm;
-
-import sun.jvm.hotspot.debugger.*;
-import sun.jvm.hotspot.oops.*;
-import sun.jvm.hotspot.utilities.*;
-
-class JNIHandleAccessor {
- private Address addr;
- private ObjectHeap heap;
-
- JNIHandleAccessor(Address addr, ObjectHeap heap) {
- this.addr = addr;
- this.heap = heap;
- }
-
- Oop getValue() {
- // Accessing the contents of the JNIHandle is a double dereference
- Address handle = addr.getAddressAt(0);
- if (handle == null) return null;
- return heap.newOop(handle.getOopHandleAt(0));
- }
-
- void setValue(Oop value) {
- Address handle = addr.getAddressAt(0);
- if (Assert.ASSERTS_ENABLED) {
- Assert.that(handle != null, "Must have valid global JNI handle for setting");
- }
- handle.setOopHandleAt(0, value.getHandle());
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/ServiceabilityAgentJVMDIModule.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/ServiceabilityAgentJVMDIModule.java
deleted file mode 100644
index ed1c628e796..00000000000
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/livejvm/ServiceabilityAgentJVMDIModule.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- * Copyright (c) 2002, 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 sun.jvm.hotspot.livejvm;
-
-import sun.jvm.hotspot.debugger.*;
-import sun.jvm.hotspot.oops.*;
-import sun.jvm.hotspot.runtime.*;
-
-/** Provides Java programming language-level interaction with a live
- Java HotSpot VM via the use of the SA's JVMDI module. This is an
- experimental mechanism. The BugSpot debugger should be converted
- to use the JVMDI/JDWP-based JDI implementation for live process
- interaction once the JDI binding for the SA is complete. */
-
-public class ServiceabilityAgentJVMDIModule {
- private Debugger dbg;
- private String[] saLibNames;
- private String saLibName;
- private boolean attached;
-
- private boolean suspended;
-
- private static final int JVMDI_EVENT_BREAKPOINT = 2;
- private static final int JVMDI_EVENT_EXCEPTION = 4;
-
- private static long timeoutMillis = 3000;
-
- // Values in target process
- // Events sent from VM to SA
- private CIntegerAccessor saAttached;
- private CIntegerAccessor saEventPending;
- private CIntegerAccessor saEventKind;
- // Exception events
- private JNIHandleAccessor saExceptionThread;
- private JNIHandleAccessor saExceptionClass;
- private JNIid saExceptionMethod;
- private CIntegerAccessor saExceptionLocation;
- private JNIHandleAccessor saExceptionException;
- private JNIHandleAccessor saExceptionCatchClass;
- private JNIid saExceptionCatchMethod;
- private CIntegerAccessor saExceptionCatchLocation;
- // Breakpoint events
- private JNIHandleAccessor saBreakpointThread;
- private JNIHandleAccessor saBreakpointClass;
- private JNIid saBreakpointMethod;
- private CIntegerAccessor saBreakpointLocation;
- // Commands sent by the SA to the VM
- private int SA_CMD_SUSPEND_ALL;
- private int SA_CMD_RESUME_ALL;
- private int SA_CMD_TOGGLE_BREAKPOINT;
- private int SA_CMD_BUF_SIZE;
- private CIntegerAccessor saCmdPending;
- private CIntegerAccessor saCmdType;
- private CIntegerAccessor saCmdResult;
- private CStringAccessor saCmdResultErrMsg;
- // Toggle breakpoint command arguments
- private CStringAccessor saCmdBkptSrcFileName;
- private CStringAccessor saCmdBkptPkgName;
- private CIntegerAccessor saCmdBkptLineNumber;
- private CIntegerAccessor saCmdBkptResWasError;
- private CIntegerAccessor saCmdBkptResLineNumber;
- private CIntegerAccessor saCmdBkptResBCI;
- private CIntegerAccessor saCmdBkptResWasSet;
- private CStringAccessor saCmdBkptResMethodName;
- private CStringAccessor saCmdBkptResMethodSig;
-
- public ServiceabilityAgentJVMDIModule(Debugger dbg, String[] saLibNames) {
- this.dbg = dbg;
- this.saLibNames = saLibNames;
- }
-
- /** Indicates whether a call to attach() should complete without an
- exception. */
- public boolean canAttach() {
- return setupLookup("SA_CMD_SUSPEND_ALL");
- }
-
- /** Attempt to initiate a connection with the JVMDI module in the
- target VM. */
- public void attach() throws DebuggerException {
- if (!canAttach()) {
- throw new DebuggerException("Unable to initiate symbol lookup in SA's JVMDI module");
- }
-
- if (attached) {
- throw new DebuggerException("Already attached");
- }
-
- // Attempt to look up well-known symbols in the target VM.
- SA_CMD_SUSPEND_ALL = lookupConstInt("SA_CMD_SUSPEND_ALL");
- SA_CMD_RESUME_ALL = lookupConstInt("SA_CMD_RESUME_ALL");
- SA_CMD_TOGGLE_BREAKPOINT = lookupConstInt("SA_CMD_TOGGLE_BREAKPOINT");
- SA_CMD_BUF_SIZE = lookupConstInt("SA_CMD_BUF_SIZE");
-
- saAttached = lookupCInt("saAttached");
- saEventPending = lookupCInt("saEventPending");
- saEventKind = lookupCInt("saEventKind");
- saCmdPending = lookupCInt("saCmdPending");
- saCmdType = lookupCInt("saCmdType");
- saCmdResult = lookupCInt("saCmdResult");
- saCmdResultErrMsg = lookupCString("saCmdResultErrMsg", SA_CMD_BUF_SIZE);
- // Toggling of breakpoints
- saCmdBkptSrcFileName = lookupCString("saCmdBkptSrcFileName", SA_CMD_BUF_SIZE);
- saCmdBkptPkgName = lookupCString("saCmdBkptPkgName", SA_CMD_BUF_SIZE);
- saCmdBkptLineNumber = lookupCInt("saCmdBkptLineNumber");
- saCmdBkptResWasError = lookupCInt("saCmdBkptResWasError");
- saCmdBkptResLineNumber = lookupCInt("saCmdBkptResLineNumber");
- saCmdBkptResBCI = lookupCInt("saCmdBkptResBCI");
- saCmdBkptResWasSet = lookupCInt("saCmdBkptResWasSet");
- saCmdBkptResMethodName = lookupCString("saCmdBkptResMethodName", SA_CMD_BUF_SIZE);
- saCmdBkptResMethodSig = lookupCString("saCmdBkptResMethodSig", SA_CMD_BUF_SIZE);
-
- // Check for existence of symbols needed later
- // FIXME: should probably cache these since we can't support the
- // -Xrun module or the VM getting unloaded anyway
- lookup("saExceptionThread");
- lookup("saExceptionClass");
- lookup("saExceptionMethod");
- lookup("saExceptionLocation");
- lookup("saExceptionException");
- lookup("saExceptionCatchClass");
- lookup("saExceptionCatchMethod");
- lookup("saExceptionCatchLocation");
- lookup("saBreakpointThread");
- lookup("saBreakpointClass");
- lookup("saBreakpointMethod");
- lookup("saBreakpointLocation");
-
- saAttached.setValue(1);
- attached = true;
- }
-
- public void detach() {
- saAttached.setValue(0);
- attached = false;
- saLibName = null;
- }
-
- /** Set the timeout value (in milliseconds) for the VM to reply to
- commands. Once this timeout has elapsed, the VM is assumed to
- have disconnected. Defaults to 3000 milliseconds (3 seconds). */
- public void setCommandTimeout(long millis) {
- timeoutMillis = millis;
- }
-
- /** Get the timeout value (in milliseconds) for the VM to reply to
- commands. Once this timeout has elapsed, the VM is assumed to
- have disconnected. Defaults to 3000 milliseconds (3 seconds). */
- public long getCommandTimeout() {
- return timeoutMillis;
- }
-
- /** Indicates whether a Java debug event is pending */
- public boolean eventPending() {
- return (saEventPending.getValue() != 0);
- }
-
- /** Poll for event; returns null if none pending. */
- public Event eventPoll() {
- if (saEventPending.getValue() == 0) {
- return null;
- }
-
- int kind = (int) saEventKind.getValue();
- switch (kind) {
- case JVMDI_EVENT_EXCEPTION: {
- JNIHandleAccessor thread = lookupJNIHandle("saExceptionThread");
- JNIHandleAccessor clazz = lookupJNIHandle("saExceptionClass");
- JNIid method = lookupJNIid("saExceptionMethod");
- CIntegerAccessor location = lookupCInt("saExceptionLocation");
- JNIHandleAccessor exception = lookupJNIHandle("saExceptionException");
- JNIHandleAccessor catchClass = lookupJNIHandle("saExceptionCatchClass");
- JNIid catchMethod = lookupJNIid("saExceptionCatchMethod");
- CIntegerAccessor catchLocation = lookupCInt("saExceptionCatchLocation");
- return new ExceptionEvent(thread.getValue(), clazz.getValue(), method,
- (int) location.getValue(), exception.getValue(),
- catchClass.getValue(), catchMethod, (int) catchLocation.getValue());
- }
-
- case JVMDI_EVENT_BREAKPOINT: {
- JNIHandleAccessor thread = lookupJNIHandle("saBreakpointThread");
- JNIHandleAccessor clazz = lookupJNIHandle("saBreakpointClass");
- JNIid method = lookupJNIid("saBreakpointMethod");
- CIntegerAccessor location = lookupCInt("saBreakpointLocation");
- return new BreakpointEvent(thread.getValue(), clazz.getValue(),
- method, (int) location.getValue());
- }
-
- default:
- throw new DebuggerException("Unsupported event type " + kind);
- }
- }
-
- /** Continue past current event */
- public void eventContinue() {
- saEventPending.setValue(0);
- }
-
- /** Suspend all Java threads in the target VM. Throws
- DebuggerException if the VM disconnected. */
- public void suspend() {
- saCmdType.setValue(SA_CMD_SUSPEND_ALL);
- saCmdPending.setValue(1);
- waitForCommandCompletion();
- suspended = true;
- }
-
- /** Resume all Java threads in the target VM. Throws
- DebuggerException if the VM disconnected. */
- public void resume() {
- saCmdType.setValue(SA_CMD_RESUME_ALL);
- saCmdPending.setValue(1);
- waitForCommandCompletion();
- suspended = false;
- }
-
- /** Indicates whether all Java threads have been suspended via this
- interface. */
- public boolean isSuspended() {
- return suspended;
- }
-
- /** Information about toggling of breakpoints */
- public static class BreakpointToggleResult {
- private boolean success;
- private String errMsg;
- private int lineNumber;
- private int bci;
- private boolean wasSet;
- private String methodName;
- private String methodSig;
-
- /** Success constructor */
- public BreakpointToggleResult(int lineNumber, int bci, boolean wasSet,
- String methodName, String methodSig) {
- this.lineNumber = lineNumber;
- this.bci = bci;
- this.wasSet = wasSet;
- this.methodName = methodName;
- this.methodSig = methodSig;
- success = true;
- }
-
- /** Failure constructor */
- public BreakpointToggleResult(String errMsg) {
- this.errMsg = errMsg;
- success = false;
- }
-
- /** Indicates whether this represents a successful return or not */
- public boolean getSuccess() { return success; }
-
- /** Valid only if getSuccess() returns false */
- public String getErrMsg() { return errMsg; }
-
- /** Line number at which breakpoint toggle occurred; valid only if
- getSuccess() returns true. */
- public int getLineNumber() { return lineNumber; }
-
- /** BCI at which breakpoint toggle occurred; valid only if
- getSuccess() returns true. */
- public int getBCI() { return bci; }
-
- /** Indicates whether the breakpoint toggle was the set of a
- breakpoint or not; valid only if getSuccess() returns true. */
- public boolean getWasSet() { return wasSet; }
-
- /** Method name in which the breakpoint toggle occurred; valid
- only if getSuccess() returns true. */
- public String getMethodName() { return methodName; }
-
- /** Method signature in which the breakpoint toggle occurred;
- valid only if getSuccess() returns true. */
- public String getMethodSignature() { return methodSig; }
- }
-
- /** Toggle a breakpoint. Throws DebuggerException if a real error
- occurred; otherwise returns non-null BreakpointToggleResult. The
- work of scanning the loaded classes is done in the target VM
- because it turns out to be significantly faster than scanning
- through the system dictionary from the SA, and interactivity
- when setting breakpoints is important. */
- public BreakpointToggleResult toggleBreakpoint(String srcFileName,
- String pkgName,
- int lineNo) {
- saCmdBkptSrcFileName.setValue(srcFileName);
- saCmdBkptPkgName.setValue(pkgName);
- saCmdBkptLineNumber.setValue(lineNo);
- saCmdType.setValue(SA_CMD_TOGGLE_BREAKPOINT);
- saCmdPending.setValue(1);
- if (waitForCommandCompletion(true)) {
- return new BreakpointToggleResult((int) saCmdBkptResLineNumber.getValue(),
- (int) saCmdBkptResBCI.getValue(),
- (saCmdBkptResWasSet.getValue() != 0),
- saCmdBkptResMethodName.getValue(),
- saCmdBkptResMethodSig.getValue());
- } else {
- return new BreakpointToggleResult(saCmdResultErrMsg.getValue());
- }
- }
-
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- private CIntegerAccessor lookupCInt(String symbolName) {
- return new CIntegerAccessor(lookup(symbolName), 4, false);
- }
-
- private CStringAccessor lookupCString(String symbolName, int bufLen) {
- return new CStringAccessor(lookup(symbolName), bufLen);
- }
-
- private JNIHandleAccessor lookupJNIHandle(String symbolName) {
- return new JNIHandleAccessor(lookup(symbolName), VM.getVM().getObjectHeap());
- }
-
- private JNIid lookupJNIid(String symbolName) {
- Address idAddr = lookup(symbolName).getAddressAt(0);
- if (idAddr == null) {
- return null;
- }
- return new JNIid(idAddr, VM.getVM().getObjectHeap());
- }
-
- private int lookupConstInt(String symbolName) {
- Address addr = lookup(symbolName);
- return (int) addr.getCIntegerAt(0, 4, false);
- }
-
- private boolean setupLookup(String symbolName) {
- if (saLibName == null) {
- for (int i = 0; i < saLibNames.length; i++) {
- Address addr = dbg.lookup(saLibNames[i], symbolName);
- if (addr != null) {
- saLibName = saLibNames[i];
- return true;
- }
- }
- return false;
- }
- return true;
- }
-
- private Address lookup(String symbolName) {
- if (saLibName == null) {
- for (int i = 0; i < saLibNames.length; i++) {
- Address addr = dbg.lookup(saLibNames[i], symbolName);
- if (addr != null) {
- saLibName = saLibNames[i];
- return addr;
- }
- }
- throw new DebuggerException("Unable to find symbol " + symbolName + " in any of the known names for the SA");
- }
-
- Address addr = dbg.lookup(saLibName, symbolName);
- if (addr == null) {
- throw new DebuggerException("Unable to find symbol " + symbolName + " in " + saLibName);
- }
- return addr;
- }
-
- private void waitForCommandCompletion() {
- waitForCommandCompletion(false);
- }
-
- /** Returns true if command succeeded, false if not */
- private boolean waitForCommandCompletion(boolean forBreakpoint) {
- long start = System.currentTimeMillis();
- long cur = start;
- while ((saCmdPending.getValue() != 0) &&
- (cur - start < timeoutMillis)) {
- try {
- java.lang.Thread.currentThread().sleep(10);
- } catch (InterruptedException e) {
- }
- cur = System.currentTimeMillis();
- }
- if (saCmdPending.getValue() != 0) {
- detach();
- throw new DebuggerException("VM appears to have died");
- }
- boolean succeeded = saCmdResult.getValue() == 0;
- if (!succeeded &&
- (!forBreakpoint || saCmdBkptResWasError.getValue() != 0)) {
- String err = saCmdResultErrMsg.getValue();
- throw new DebuggerException("Error executing JVMDI command: " + err);
- }
- return succeeded;
- }
-}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java
index a6d3427daf0..2b81bf09d50 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2013, 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
@@ -469,7 +469,6 @@ public class ConstantPool extends Metadata implements ClassConstants {
case JVM_CONSTANT_UnresolvedClassInError: return "JVM_CONSTANT_UnresolvedClassInError";
case JVM_CONSTANT_MethodHandleInError:return "JVM_CONSTANT_MethodHandleInError";
case JVM_CONSTANT_MethodTypeInError: return "JVM_CONSTANT_MethodTypeInError";
- case JVM_CONSTANT_Object: return "JVM_CONSTANT_Object";
}
throw new InternalError("Unknown tag: " + tag);
}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java
index 93fa1ca6a16..da9d75f7777 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2013, 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
@@ -67,7 +67,6 @@ public interface ClassConstants
public static final int JVM_CONSTANT_UnresolvedClassInError = 103; // Error tag due to resolution error
public static final int JVM_CONSTANT_MethodHandleInError = 104; // Error tag due to resolution error
public static final int JVM_CONSTANT_MethodTypeInError = 105; // Error tag due to resolution error
- public static final int JVM_CONSTANT_Object = 106; // Required for BoundMethodHandle arguments.
// 1.5 major/minor version numbers from JVM spec. 3rd edition
public static final short MAJOR_VERSION = 49;
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PermStat.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/ClassLoaderStats.java
similarity index 97%
rename from hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PermStat.java
rename to hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/ClassLoaderStats.java
index b2ff288fec4..77f0f800445 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PermStat.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/ClassLoaderStats.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, 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
@@ -35,16 +35,16 @@ import sun.jvm.hotspot.tools.*;
import sun.jvm.hotspot.utilities.*;
/**
- A command line tool to print perm. generation statistics.
+ A command line tool to print class loader statistics.
*/
-public class PermStat extends Tool {
+public class ClassLoaderStats extends Tool {
boolean verbose = true;
public static void main(String[] args) {
- PermStat ps = new PermStat();
- ps.start(args);
- ps.stop();
+ ClassLoaderStats cls = new ClassLoaderStats();
+ cls.start(args);
+ cls.stop();
}
private static class ClassData {
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/HeapSummary.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/HeapSummary.java
index 273d7f1a5f4..87621655269 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/HeapSummary.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/HeapSummary.java
@@ -57,17 +57,18 @@ public class HeapSummary extends Tool {
printGCAlgorithm(flagMap);
System.out.println();
System.out.println("Heap Configuration:");
- printValue("MinHeapFreeRatio = ", getFlagValue("MinHeapFreeRatio", flagMap));
- printValue("MaxHeapFreeRatio = ", getFlagValue("MaxHeapFreeRatio", flagMap));
- printValMB("MaxHeapSize = ", getFlagValue("MaxHeapSize", flagMap));
- printValMB("NewSize = ", getFlagValue("NewSize", flagMap));
- printValMB("MaxNewSize = ", getFlagValue("MaxNewSize", flagMap));
- printValMB("OldSize = ", getFlagValue("OldSize", flagMap));
- printValue("NewRatio = ", getFlagValue("NewRatio", flagMap));
- printValue("SurvivorRatio = ", getFlagValue("SurvivorRatio", flagMap));
- printValMB("MetaspaceSize = ", getFlagValue("MetaspaceSize", flagMap));
- printValMB("MaxMetaspaceSize = ", getFlagValue("MaxMetaspaceSize", flagMap));
- printValMB("G1HeapRegionSize = ", HeapRegion.grainBytes());
+ printValue("MinHeapFreeRatio = ", getFlagValue("MinHeapFreeRatio", flagMap));
+ printValue("MaxHeapFreeRatio = ", getFlagValue("MaxHeapFreeRatio", flagMap));
+ printValMB("MaxHeapSize = ", getFlagValue("MaxHeapSize", flagMap));
+ printValMB("NewSize = ", getFlagValue("NewSize", flagMap));
+ printValMB("MaxNewSize = ", getFlagValue("MaxNewSize", flagMap));
+ printValMB("OldSize = ", getFlagValue("OldSize", flagMap));
+ printValue("NewRatio = ", getFlagValue("NewRatio", flagMap));
+ printValue("SurvivorRatio = ", getFlagValue("SurvivorRatio", flagMap));
+ printValMB("MetaspaceSize = ", getFlagValue("MetaspaceSize", flagMap));
+ printValMB("ClassMetaspaceSize = ", getFlagValue("ClassMetaspaceSize", flagMap));
+ printValMB("MaxMetaspaceSize = ", getFlagValue("MaxMetaspaceSize", flagMap));
+ printValMB("G1HeapRegionSize = ", HeapRegion.grainBytes());
System.out.println();
System.out.println("Heap Usage:");
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/JMap.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/JMap.java
index f149978b0e1..675edeba0d3 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/JMap.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/JMap.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2013, 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
@@ -45,7 +45,7 @@ public class JMap extends Tool {
}
protected String getCommandFlags() {
- return "-heap|-heap:format=b|-histo|-permstat|-finalizerinfo";
+ return "-heap|-heap:format=b|-histo|-clstats|-finalizerinfo";
}
protected void printFlagsUsage() {
@@ -53,14 +53,14 @@ public class JMap extends Tool {
System.out.println(" -heap\tto print java heap summary");
System.out.println(" -heap:format=b\tto dump java heap in hprof binary format");
System.out.println(" -histo\tto print histogram of java object heap");
- System.out.println(" -permstat\tto print permanent generation statistics");
+ System.out.println(" -clstats\tto print class loader statistics");
System.out.println(" -finalizerinfo\tto print information on objects awaiting finalization");
super.printFlagsUsage();
}
public static final int MODE_HEAP_SUMMARY = 0;
public static final int MODE_HISTOGRAM = 1;
- public static final int MODE_PERMSTAT = 2;
+ public static final int MODE_CLSTATS = 2;
public static final int MODE_PMAP = 3;
public static final int MODE_HEAP_GRAPH_HPROF_BIN = 4;
public static final int MODE_HEAP_GRAPH_GXL = 5;
@@ -78,8 +78,8 @@ public class JMap extends Tool {
tool = new ObjectHistogram();
break;
- case MODE_PERMSTAT:
- tool = new PermStat();
+ case MODE_CLSTATS:
+ tool = new ClassLoaderStats();
break;
case MODE_PMAP:
@@ -118,7 +118,9 @@ public class JMap extends Tool {
} else if (modeFlag.equals("-histo")) {
mode = MODE_HISTOGRAM;
} else if (modeFlag.equals("-permstat")) {
- mode = MODE_PERMSTAT;
+ mode = MODE_CLSTATS;
+ } else if (modeFlag.equals("-clstats")) {
+ mode = MODE_CLSTATS;
} else if (modeFlag.equals("-finalizerinfo")) {
mode = MODE_FINALIZERINFO;
} else {
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PMap.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PMap.java
index 7aee696fc14..70bd55513b9 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PMap.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PMap.java
@@ -58,10 +58,6 @@ public class PMap extends Tool {
}
}
- protected boolean requiresVM() {
- return false;
- }
-
public static void main(String[] args) throws Exception {
PMap t = new PMap();
t.start(args);
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java
index 0b83f94685d..54aa0e0de5c 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java
@@ -50,29 +50,23 @@ public class PStack extends Tool {
public void run(PrintStream out) {
Debugger dbg = getAgent().getDebugger();
- run(out, dbg, getAgent().isJavaMode());
+ run(out, dbg);
}
public void run(PrintStream out, Debugger dbg) {
- run(out, dbg, true);
- }
-
- private void run(PrintStream out, Debugger dbg, final boolean isJava) {
CDebugger cdbg = dbg.getCDebugger();
if (cdbg != null) {
ConcurrentLocksPrinter concLocksPrinter = null;
- if (isJava) {
- // compute and cache java Vframes.
- initJFrameCache();
- if (concurrentLocks) {
- concLocksPrinter = new ConcurrentLocksPrinter();
- }
- // print Java level deadlocks
- try {
- DeadlockDetector.print(out);
- } catch (Exception exp) {
- out.println("can't print deadlock information: " + exp.getMessage());
- }
+ // compute and cache java Vframes.
+ initJFrameCache();
+ if (concurrentLocks) {
+ concLocksPrinter = new ConcurrentLocksPrinter();
+ }
+ // print Java level deadlocks
+ try {
+ DeadlockDetector.print(out);
+ } catch (Exception exp) {
+ out.println("can't print deadlock information: " + exp.getMessage());
}
List l = cdbg.getThreadList();
@@ -100,63 +94,59 @@ public class PStack extends Tool {
}
out.println();
} else {
- if (isJava) {
- // look for one or more java frames
- String[] names = null;
- // check interpreter frame
- Interpreter interp = VM.getVM().getInterpreter();
- if (interp.contains(pc)) {
- names = getJavaNames(th, f.localVariableBase());
- // print codelet name if we can't determine method
- if (names == null || names.length == 0) {
- out.print(" ");
- InterpreterCodelet ic = interp.getCodeletContaining(pc);
- if (ic != null) {
- String desc = ic.getDescription();
- if (desc != null) out.print(desc);
- }
- out.println();
- }
- } else {
- // look for known code blobs
- CodeCache c = VM.getVM().getCodeCache();
- if (c.contains(pc)) {
- CodeBlob cb = c.findBlobUnsafe(pc);
- if (cb.isNMethod()) {
- names = getJavaNames(th, f.localVariableBase());
- // just print compiled code, if can't determine method
- if (names == null || names.length == 0) {
- out.println("");
- }
- } else if (cb.isBufferBlob()) {
- out.println("");
- } else if (cb.isRuntimeStub()) {
- out.println("");
- } else if (cb.isDeoptimizationStub()) {
- out.println("");
- } else if (cb.isUncommonTrapStub()) {
- out.println("");
- } else if (cb.isExceptionStub()) {
- out.println("");
- } else if (cb.isSafepointStub()) {
- out.println("");
- } else {
- out.println("");
- }
- } else {
- printUnknown(out);
- }
- }
- // print java frames, if any
- if (names != null && names.length != 0) {
- // print java frame(s)
- for (int i = 0; i < names.length; i++) {
- out.println(names[i]);
- }
- }
- } else {
- printUnknown(out);
- }
+ // look for one or more java frames
+ String[] names = null;
+ // check interpreter frame
+ Interpreter interp = VM.getVM().getInterpreter();
+ if (interp.contains(pc)) {
+ names = getJavaNames(th, f.localVariableBase());
+ // print codelet name if we can't determine method
+ if (names == null || names.length == 0) {
+ out.print(" ");
+ InterpreterCodelet ic = interp.getCodeletContaining(pc);
+ if (ic != null) {
+ String desc = ic.getDescription();
+ if (desc != null) out.print(desc);
+ }
+ out.println();
+ }
+ } else {
+ // look for known code blobs
+ CodeCache c = VM.getVM().getCodeCache();
+ if (c.contains(pc)) {
+ CodeBlob cb = c.findBlobUnsafe(pc);
+ if (cb.isNMethod()) {
+ names = getJavaNames(th, f.localVariableBase());
+ // just print compiled code, if can't determine method
+ if (names == null || names.length == 0) {
+ out.println("");
+ }
+ } else if (cb.isBufferBlob()) {
+ out.println("");
+ } else if (cb.isRuntimeStub()) {
+ out.println("");
+ } else if (cb.isDeoptimizationStub()) {
+ out.println("");
+ } else if (cb.isUncommonTrapStub()) {
+ out.println("");
+ } else if (cb.isExceptionStub()) {
+ out.println("");
+ } else if (cb.isSafepointStub()) {
+ out.println("");
+ } else {
+ out.println("");
+ }
+ } else {
+ printUnknown(out);
+ }
+ }
+ // print java frames, if any
+ if (names != null && names.length != 0) {
+ // print java frame(s)
+ for (int i = 0; i < names.length; i++) {
+ out.println(names[i]);
+ }
+ }
}
f = f.sender(th);
}
@@ -164,7 +154,7 @@ public class PStack extends Tool {
exp.printStackTrace();
// continue, may be we can do a better job for other threads
}
- if (isJava && concurrentLocks) {
+ if (concurrentLocks) {
JavaThread jthread = (JavaThread) proxyToThread.get(th);
if (jthread != null) {
concLocksPrinter.print(jthread, out);
@@ -180,10 +170,6 @@ public class PStack extends Tool {
}
}
- protected boolean requiresVM() {
- return false;
- }
-
public static void main(String[] args) throws Exception {
PStack t = new PStack();
t.start(args);
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/Tool.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/Tool.java
index 2957bb043cb..4279c425bd8 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/Tool.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/Tool.java
@@ -27,7 +27,6 @@ package sun.jvm.hotspot.tools;
import java.io.PrintStream;
import java.util.Hashtable;
import sun.jvm.hotspot.*;
-import sun.jvm.hotspot.bugspot.*;
import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.debugger.*;
@@ -35,7 +34,7 @@ import sun.jvm.hotspot.debugger.*;
// override run & code main as shown below.
public abstract class Tool implements Runnable {
- private BugSpotAgent agent;
+ private HotSpotAgent agent;
private int debugeeType;
// debugeeType is one of constants below
@@ -51,12 +50,7 @@ public abstract class Tool implements Runnable {
return true;
}
- // whether this tool requires debuggee to be java process or core?
- protected boolean requiresVM() {
- return true;
- }
-
- protected void setAgent(BugSpotAgent a) {
+ protected void setAgent(HotSpotAgent a) {
agent = a;
}
@@ -64,7 +58,7 @@ public abstract class Tool implements Runnable {
debugeeType = dt;
}
- protected BugSpotAgent getAgent() {
+ protected HotSpotAgent getAgent() {
return agent;
}
@@ -155,7 +149,7 @@ public abstract class Tool implements Runnable {
usage();
}
- agent = new BugSpotAgent();
+ agent = new HotSpotAgent();
try {
switch (debugeeType) {
case DEBUGEE_PID:
@@ -198,33 +192,24 @@ public abstract class Tool implements Runnable {
err.println("Debugger attached successfully.");
- boolean isJava = agent.isJavaMode();
- if (isJava) {
- VM vm = VM.getVM();
- if (vm.isCore()) {
- err.println("Core build detected.");
- } else if (vm.isClientCompiler()) {
- err.println("Client compiler detected.");
- } else if (vm.isServerCompiler()) {
- err.println("Server compiler detected.");
- } else {
- throw new RuntimeException("Fatal error: " +
- "should have been able to detect core/C1/C2 build");
- }
-
- String version = vm.getVMRelease();
- if (version != null) {
- err.print("JVM version is ");
- err.println(version);
- }
-
- run();
- } else { // not a java process or core
- if (requiresVM()) {
- err.println(getName() + " requires a java VM process/core!");
- } else {
- run();
- }
+ VM vm = VM.getVM();
+ if (vm.isCore()) {
+ err.println("Core build detected.");
+ } else if (vm.isClientCompiler()) {
+ err.println("Client compiler detected.");
+ } else if (vm.isServerCompiler()) {
+ err.println("Server compiler detected.");
+ } else {
+ throw new RuntimeException("Fatal error: "
+ + "should have been able to detect core/C1/C2 build");
}
+
+ String version = vm.getVMRelease();
+ if (version != null) {
+ err.print("JVM version is ");
+ err.println(version);
+ }
+
+ run();
}
}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/SAPanel.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/SAPanel.java
index e65416a4c51..e1829a332da 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/SAPanel.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/SAPanel.java
@@ -50,7 +50,7 @@ import com.sun.java.swing.action.*;
/**
* This base class encapsulates many of the events that are fired from
* the various panels in this directory so they can easily be plugged
- * in to different containing frameworks (HSDB, BugSpot).
+ * in to different containing frameworks (HSDB).
*/
public class SAPanel extends JPanel {
protected List listeners = new ArrayList();
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/ConstantTag.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/ConstantTag.java
index e06086fc85f..982063035ea 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/ConstantTag.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/ConstantTag.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2013, 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
@@ -51,7 +51,6 @@ public class ConstantTag {
private static final int JVM_CONSTANT_UnresolvedClassInError = 103; // Resolution failed
private static final int JVM_CONSTANT_MethodHandleInError = 104; // Error tag due to resolution error
private static final int JVM_CONSTANT_MethodTypeInError = 105; // Error tag due to resolution error
- private static final int JVM_CONSTANT_Object = 106; // Required for BoundMethodHandle arguments.
// JVM_CONSTANT_MethodHandle subtypes //FIXME: connect these to data structure
private static int JVM_REF_getField = 1;
@@ -96,8 +95,6 @@ public class ConstantTag {
public boolean isKlassIndex() { return tag == JVM_CONSTANT_ClassIndex; }
public boolean isStringIndex() { return tag == JVM_CONSTANT_StringIndex; }
- public boolean isObject() { return tag == JVM_CONSTANT_Object; }
-
public boolean isKlassReference() { return isKlassIndex() || isUnresolvedKlass(); }
public boolean isFieldOrMethod() { return isField() || isMethod() || isInterfaceMethod(); }
public boolean isSymbol() { return isUtf8(); }
@@ -123,7 +120,6 @@ public class ConstantTag {
case JVM_CONSTANT_StringIndex :
case JVM_CONSTANT_MethodHandle :
case JVM_CONSTANT_MethodType :
- case JVM_CONSTANT_Object :
return BasicType.T_OBJECT;
default:
throw new InternalError("unexpected tag: " + tag);
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/soql/sa.js b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/soql/sa.js
index ad977642bf0..ec22e35e633 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/soql/sa.js
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/soql/sa.js
@@ -31,7 +31,6 @@ var sapkg = new Object();
sapkg.hotspot = Packages.sun.jvm.hotspot;
sapkg.asm = sapkg.hotspot.asm;
-sapkg.bugspot = sapkg.hotspot.bugspot;
sapkg.c1 = sapkg.hotspot.c1;
sapkg.code = sapkg.hotspot.code;
sapkg.compiler = sapkg.hotspot.compiler;
@@ -40,7 +39,6 @@ sapkg.compiler = sapkg.hotspot.compiler;
// sapkg.debugger = sapkg.hotspot.debugger;
sapkg.interpreter = sapkg.hotspot.interpreter;
-sapkg.livejvm = sapkg.hotspot.livejvm;
sapkg.jdi = sapkg.hotspot.jdi;
sapkg.memory = sapkg.hotspot.memory;
sapkg.oops = sapkg.hotspot.oops;
diff --git a/hotspot/agent/src/share/native/jvmdi/sa.cpp b/hotspot/agent/src/share/native/jvmdi/sa.cpp
deleted file mode 100644
index d71e50c4f50..00000000000
--- a/hotspot/agent/src/share/native/jvmdi/sa.cpp
+++ /dev/null
@@ -1,601 +0,0 @@
-/*
- * Copyright (c) 2002, 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.
- *
- */
-
-#include
-#include
-#include
-#include
-#include "sa.hpp"
-#include "jni.h"
-#include "jvmdi.h"
-
-#ifndef WIN32
- #include
-#else
- typedef int int32_t;
-#endif
-
-#ifdef WIN32
- #include
- #define YIELD() Sleep(0)
- #define SLEEP() Sleep(10)
- #define vsnprintf _vsnprintf
-#else
- Error: please port YIELD() and SLEEP() macros to your platform
-#endif
-
-using namespace std;
-
-//////////////////////////////////////////////////////////////////////
-// //
-// Exported "interface" for Java language-level interaction between //
-// the SA and the VM. Note that the SA knows about the layout of //
-// certain VM data structures and that knowledge is taken advantage //
-// of in this code, although this interfaces with the VM via JVMDI. //
-// //
-//////////////////////////////////////////////////////////////////////
-
-extern "C" {
- /////////////////////////////////////
- // //
- // Events sent by the VM to the SA //
- // //
- /////////////////////////////////////
-
- // Set by the SA when it attaches. Indicates that events should be
- // posted via these exported variables, and that the VM should wait
- // for those events to be acknowledged by the SA (via its setting
- // saEventPending to 0).
- JNIEXPORT volatile int32_t saAttached = 0;
-
- // Set to nonzero value by the VM when an event has been posted; set
- // back to 0 by the SA when it has processed that event.
- JNIEXPORT volatile int32_t saEventPending = 0;
-
- // Kind of the event (from jvmdi.h)
- JNIEXPORT volatile int32_t saEventKind = 0;
-
- //
- // Exception events
- //
- JNIEXPORT jthread saExceptionThread;
- JNIEXPORT jclass saExceptionClass;
- JNIEXPORT jmethodID saExceptionMethod;
- JNIEXPORT int32_t saExceptionLocation;
- JNIEXPORT jobject saExceptionException;
- JNIEXPORT jclass saExceptionCatchClass;
- JNIEXPORT jmethodID saExceptionCatchMethod;
- JNIEXPORT int32_t saExceptionCatchLocation;
-
- //
- // Breakpoint events
- //
- JNIEXPORT jthread saBreakpointThread;
- JNIEXPORT jclass saBreakpointClass;
- JNIEXPORT jmethodID saBreakpointMethod;
- JNIEXPORT jlocation saBreakpointLocation;
-
- ///////////////////////////////////////
- // //
- // Commands sent by the SA to the VM //
- // //
- ///////////////////////////////////////
-
- extern JNIEXPORT const int32_t SA_CMD_SUSPEND_ALL = 0;
- extern JNIEXPORT const int32_t SA_CMD_RESUME_ALL = 1;
- extern JNIEXPORT const int32_t SA_CMD_TOGGLE_BREAKPOINT = 2;
- extern JNIEXPORT const int32_t SA_CMD_BUF_SIZE = 1024;
-
- // SA sets this to a nonzero value when it is requesting a command
- // to be processed; VM sets it back to 0 when the command has been
- // executed
- JNIEXPORT volatile int32_t saCmdPending = 0;
-
- // SA sets this to one of the manifest constants above to indicate
- // the kind of command to be executed
- JNIEXPORT volatile int32_t saCmdType = 0;
-
- // VM sets this to 0 if the last command succeeded or a nonzero
- // value if it failed
- JNIEXPORT volatile int32_t saCmdResult = 0;
-
- // If last command failed, this buffer will contain a descriptive
- // error message
- JNIEXPORT char saCmdResultErrMsg[SA_CMD_BUF_SIZE];
-
- //
- // Toggling of breakpoint command arguments.
- //
- // Originally there were separate set/clear breakpoint commands
- // taking a class name, method name and signature, and the iteration
- // through the debug information was done in the SA. It turns out
- // that doing this work in the target VM is significantly faster,
- // and since interactivity when setting and clearing breakpoints is
- // important, the solution which resulted in more C/C++ code was used.
- //
-
- // Source file name
- JNIEXPORT char saCmdBkptSrcFileName[SA_CMD_BUF_SIZE];
-
- // Package name ('/' as separator instead of '.')
- JNIEXPORT char saCmdBkptPkgName[SA_CMD_BUF_SIZE];
-
- // Line number
- JNIEXPORT int32_t saCmdBkptLineNumber;
-
- // Output back to SA: indicator whether the last failure of a
- // breakpoint toggle command was really an error or just a lack of
- // debug information covering the requested line. 0 if not error.
- // Valid only if saCmdResult != 0.
- JNIEXPORT int32_t saCmdBkptResWasError;
-
- // Output back to SA: resulting line number at which the breakpoint
- // was set or cleared (valid only if saCmdResult == 0)
- JNIEXPORT int32_t saCmdBkptResLineNumber;
-
- // Output back to SA: resulting byte code index at which the
- // breakpoint was set or cleared (valid only if saCmdResult == 0)
- JNIEXPORT int32_t saCmdBkptResBCI;
-
- // Output back to SA: indicator whether the breakpoint operation
- // resulted in a set or cleared breakpoint; nonzero if set, zero if
- // cleared (valid only if saCmdResult == 0)
- JNIEXPORT int32_t saCmdBkptResWasSet;
-
- // Output back to SA: method name the breakpoint was set in (valid
- // only if saCmdResult == 0)
- JNIEXPORT char saCmdBkptResMethodName[SA_CMD_BUF_SIZE];
-
- // Output back to SA: method signature (JNI style) the breakpoint
- // was set in (valid only if saCmdResult == 0)
- JNIEXPORT char saCmdBkptResMethodSig[SA_CMD_BUF_SIZE];
-}
-
-// Internal state
-static JavaVM* jvm = NULL;
-static JVMDI_Interface_1* jvmdi = NULL;
-static jthread debugThreadObj = NULL;
-static bool suspended = false;
-static vector suspendedThreads;
-static JVMDI_RawMonitor eventLock = NULL;
-
-class MonitorLocker {
-private:
- JVMDI_RawMonitor lock;
-public:
- MonitorLocker(JVMDI_RawMonitor lock) {
- this->lock = lock;
- if (lock != NULL) {
- jvmdi->RawMonitorEnter(lock);
- }
- }
- ~MonitorLocker() {
- if (lock != NULL) {
- jvmdi->RawMonitorExit(lock);
- }
- }
-};
-
-class JvmdiDeallocator {
-private:
- void* ptr;
-public:
- JvmdiDeallocator(void* ptr) {
- this->ptr = ptr;
- }
- ~JvmdiDeallocator() {
- jvmdi->Deallocate((jbyte*) ptr);
- }
-};
-
-class JvmdiRefListDeallocator {
-private:
- JNIEnv* env;
- jobject* refList;
- jint refCount;
-public:
- JvmdiRefListDeallocator(JNIEnv* env, jobject* refList, jint refCount) {
- this->env = env;
- this->refList = refList;
- this->refCount = refCount;
- }
- ~JvmdiRefListDeallocator() {
- for (int i = 0; i < refCount; i++) {
- env->DeleteGlobalRef(refList[i]);
- }
- jvmdi->Deallocate((jbyte*) refList);
- }
-};
-
-static void
-stop(char* msg) {
- fprintf(stderr, "%s", msg);
- fprintf(stderr, "\n");
- exit(1);
-}
-
-// This fills in the command result error message, sets the command
-// result to -1, and clears the pending command flag
-static void
-reportErrorToSA(const char* str, ...) {
- va_list varargs;
- va_start(varargs, str);
- vsnprintf(saCmdResultErrMsg, sizeof(saCmdResultErrMsg), str, varargs);
- va_end(varargs);
- saCmdResult = -1;
- saCmdPending = 0;
-}
-
-static bool
-packageNameMatches(char* clazzName, char* pkg) {
- int pkgLen = strlen(pkg);
- int clazzNameLen = strlen(clazzName);
-
- if (pkgLen >= clazzNameLen + 1) {
- return false;
- }
-
- if (strncmp(clazzName, pkg, pkgLen)) {
- return false;
- }
-
- // Ensure that '/' is the next character if non-empty package name
- int l = pkgLen;
- if (l > 0) {
- if (clazzName[l] != '/') {
- return false;
- }
- l++;
- }
- // Ensure that there are no more trailing slashes
- while (l < clazzNameLen) {
- if (clazzName[l++] == '/') {
- return false;
- }
- }
- return true;
-}
-
-static void
-executeOneCommand(JNIEnv* env) {
- switch (saCmdType) {
- case SA_CMD_SUSPEND_ALL: {
- if (suspended) {
- reportErrorToSA("Target process already suspended");
- return;
- }
-
- // We implement this by getting all of the threads and calling
- // SuspendThread on each one, except for the thread object
- // corresponding to this thread. Each thread for which the call
- // succeeded (i.e., did not return JVMDI_ERROR_INVALID_THREAD)
- // is added to a list which is remembered for later resumption.
- // Note that this currently has race conditions since a thread
- // might be started after we call GetAllThreads and since a
- // thread for which we got an error earlier might be resumed by
- // the VM while we are busy suspending other threads. We could
- // solve this by looping until there are no more threads we can
- // suspend, but a more robust and scalable solution is to add
- // this functionality to the JVMDI interface (i.e.,
- // "suspendAll"). Probably need to provide an exclude list for
- // such a routine.
- jint threadCount;
- jthread* threads;
- if (jvmdi->GetAllThreads(&threadCount, &threads) != JVMDI_ERROR_NONE) {
- reportErrorToSA("Error while getting thread list");
- return;
- }
-
-
- for (int i = 0; i < threadCount; i++) {
- jthread thr = threads[i];
- if (!env->IsSameObject(thr, debugThreadObj)) {
- jvmdiError err = jvmdi->SuspendThread(thr);
- if (err == JVMDI_ERROR_NONE) {
- // Remember this thread and do not free it
- suspendedThreads.push_back(thr);
- continue;
- } else {
- fprintf(stderr, " SA: Error %d while suspending thread\n", err);
- // FIXME: stop, resume all threads, report error
- }
- }
- env->DeleteGlobalRef(thr);
- }
-
- // Free up threads
- jvmdi->Deallocate((jbyte*) threads);
-
- // Suspension is complete
- suspended = true;
- break;
- }
-
- case SA_CMD_RESUME_ALL: {
- if (!suspended) {
- reportErrorToSA("Target process already suspended");
- return;
- }
-
- saCmdResult = 0;
- bool errorOccurred = false;
- jvmdiError firstError;
- for (int i = 0; i < suspendedThreads.size(); i++) {
- jthread thr = suspendedThreads[i];
- jvmdiError err = jvmdi->ResumeThread(thr);
- env->DeleteGlobalRef(thr);
- if (err != JVMDI_ERROR_NONE) {
- if (!errorOccurred) {
- errorOccurred = true;
- firstError = err;
- }
- }
- }
- suspendedThreads.clear();
- suspended = false;
- if (errorOccurred) {
- reportErrorToSA("Error %d while resuming threads", firstError);
- return;
- }
- break;
- }
-
- case SA_CMD_TOGGLE_BREAKPOINT: {
- saCmdBkptResWasError = 1;
-
- // Search line number info for all loaded classes
- jint classCount;
- jclass* classes;
-
- jvmdiError glcRes = jvmdi->GetLoadedClasses(&classCount, &classes);
- if (glcRes != JVMDI_ERROR_NONE) {
- reportErrorToSA("Error %d while getting loaded classes", glcRes);
- return;
- }
- JvmdiRefListDeallocator rld(env, (jobject*) classes, classCount);
-
- bool done = false;
- bool gotOne = false;
- jclass targetClass;
- jmethodID targetMethod;
- jlocation targetLocation;
- jint targetLineNumber;
-
- for (int i = 0; i < classCount && !done; i++) {
- fflush(stderr);
- jclass clazz = classes[i];
- char* srcName;
- jvmdiError sfnRes = jvmdi->GetSourceFileName(clazz, &srcName);
- if (sfnRes == JVMDI_ERROR_NONE) {
- JvmdiDeallocator de1(srcName);
- if (!strcmp(srcName, saCmdBkptSrcFileName)) {
- // Got a match. Now see whether the package name of the class also matches
- char* clazzName;
- jvmdiError sigRes = jvmdi->GetClassSignature(clazz, &clazzName);
- if (sigRes != JVMDI_ERROR_NONE) {
- reportErrorToSA("Error %d while getting a class's signature", sigRes);
- return;
- }
- JvmdiDeallocator de2(clazzName);
- if (packageNameMatches(clazzName + 1, saCmdBkptPkgName)) {
- // Iterate through all methods
- jint methodCount;
- jmethodID* methods;
- if (jvmdi->GetClassMethods(clazz, &methodCount, &methods) != JVMDI_ERROR_NONE) {
- reportErrorToSA("Error while getting methods of class %s", clazzName);
- return;
- }
- JvmdiDeallocator de3(methods);
- for (int j = 0; j < methodCount && !done; j++) {
- jmethodID m = methods[j];
- jint entryCount;
- JVMDI_line_number_entry* table;
- jvmdiError lnRes = jvmdi->GetLineNumberTable(clazz, m, &entryCount, &table);
- if (lnRes == JVMDI_ERROR_NONE) {
- JvmdiDeallocator de4(table);
- // Look for line number greater than or equal to requested line
- for (int k = 0; k < entryCount && !done; k++) {
- JVMDI_line_number_entry& entry = table[k];
- if (entry.line_number >= saCmdBkptLineNumber &&
- (!gotOne || entry.line_number < targetLineNumber)) {
- gotOne = true;
- targetClass = clazz;
- targetMethod = m;
- targetLocation = entry.start_location;
- targetLineNumber = entry.line_number;
- done = (targetLineNumber == saCmdBkptLineNumber);
- }
- }
- } else if (lnRes != JVMDI_ERROR_ABSENT_INFORMATION) {
- reportErrorToSA("Unexpected error %d while fetching line number table", lnRes);
- return;
- }
- }
- }
- }
- } else if (sfnRes != JVMDI_ERROR_ABSENT_INFORMATION) {
- reportErrorToSA("Unexpected error %d while fetching source file name", sfnRes);
- return;
- }
- }
-
- bool wasSet = true;
- if (gotOne) {
- // Really toggle this breakpoint
- jvmdiError bpRes;
- bpRes = jvmdi->SetBreakpoint(targetClass, targetMethod, targetLocation);
- if (bpRes == JVMDI_ERROR_DUPLICATE) {
- bpRes = jvmdi->ClearBreakpoint(targetClass, targetMethod, targetLocation);
- wasSet = false;
- }
- if (bpRes != JVMDI_ERROR_NONE) {
- reportErrorToSA("Unexpected error %d while setting or clearing breakpoint at bci %d, line %d",
- bpRes, targetLocation, targetLineNumber);
- return;
- }
- } else {
- saCmdBkptResWasError = 0;
- reportErrorToSA("No debug information found covering this line");
- return;
- }
-
- // Provide result
- saCmdBkptResLineNumber = targetLineNumber;
- saCmdBkptResBCI = targetLocation;
- saCmdBkptResWasSet = (wasSet ? 1 : 0);
- {
- char* methodName;
- char* methodSig;
- if (jvmdi->GetMethodName(targetClass, targetMethod, &methodName, &methodSig)
- == JVMDI_ERROR_NONE) {
- JvmdiDeallocator mnd(methodName);
- JvmdiDeallocator msd(methodSig);
- strncpy(saCmdBkptResMethodName, methodName, SA_CMD_BUF_SIZE);
- strncpy(saCmdBkptResMethodSig, methodSig, SA_CMD_BUF_SIZE);
- } else {
- strncpy(saCmdBkptResMethodName, "", SA_CMD_BUF_SIZE);
- strncpy(saCmdBkptResMethodSig, "", SA_CMD_BUF_SIZE);
- }
- }
- break;
- }
-
- default:
- reportErrorToSA("Command %d not yet supported", saCmdType);
- return;
- }
-
- // Successful command execution
- saCmdResult = 0;
- saCmdPending = 0;
-}
-
-static void
-saCommandThread(void *arg) {
- JNIEnv* env = NULL;
- if (jvm->GetEnv((void **) &env, JNI_VERSION_1_2) != JNI_OK) {
- stop("Error while starting Serviceability Agent "
- "command thread: could not get JNI environment");
- }
-
- while (1) {
- // Wait for command
- while (!saCmdPending) {
- SLEEP();
- }
-
- executeOneCommand(env);
- }
-}
-
-static void
-saEventHook(JNIEnv *env, JVMDI_Event *event)
-{
- MonitorLocker ml(eventLock);
-
- saEventKind = event->kind;
-
- if (event->kind == JVMDI_EVENT_VM_INIT) {
- // Create event lock
- if (jvmdi->CreateRawMonitor("Serviceability Agent Event Lock", &eventLock)
- != JVMDI_ERROR_NONE) {
- stop("Unable to create Serviceability Agent's event lock");
- }
- // Start thread which receives commands from the SA.
- jclass threadClass = env->FindClass("java/lang/Thread");
- if (threadClass == NULL) stop("Unable to find class java/lang/Thread");
- jstring threadName = env->NewStringUTF("Serviceability Agent Command Thread");
- if (threadName == NULL) stop("Unable to allocate debug thread name");
- jmethodID ctor = env->GetMethodID(threadClass, "", "(Ljava/lang/String;)V");
- if (ctor == NULL) stop("Unable to find appropriate constructor for java/lang/Thread");
- // Allocate thread object
- jthread thr = (jthread) env->NewObject(threadClass, ctor, threadName);
- if (thr == NULL) stop("Unable to allocate debug thread's java/lang/Thread instance");
- // Remember which thread this is
- debugThreadObj = env->NewGlobalRef(thr);
- if (debugThreadObj == NULL) stop("Unable to allocate global ref for debug thread object");
- // Start thread
- jvmdiError err;
- if ((err = jvmdi->RunDebugThread(thr, &saCommandThread, NULL, JVMDI_THREAD_NORM_PRIORITY))
- != JVMDI_ERROR_NONE) {
- char buf[256];
- sprintf(buf, "Error %d while starting debug thread", err);
- stop(buf);
- }
- // OK, initialization is done
- return;
- }
-
- if (!saAttached) {
- return;
- }
-
- switch (event->kind) {
- case JVMDI_EVENT_EXCEPTION: {
- fprintf(stderr, "SA: Exception thrown -- ignoring\n");
- saExceptionThread = event->u.exception.thread;
- saExceptionClass = event->u.exception.clazz;
- saExceptionMethod = event->u.exception.method;
- saExceptionLocation = event->u.exception.location;
- saExceptionException = event->u.exception.exception;
- saExceptionCatchClass = event->u.exception.catch_clazz;
- saExceptionCatchClass = event->u.exception.catch_clazz;
- saExceptionCatchMethod = event->u.exception.catch_method;
- saExceptionCatchLocation = event->u.exception.catch_location;
- // saEventPending = 1;
- break;
- }
-
- case JVMDI_EVENT_BREAKPOINT: {
- saBreakpointThread = event->u.breakpoint.thread;
- saBreakpointClass = event->u.breakpoint.clazz;
- saBreakpointMethod = event->u.breakpoint.method;
- saBreakpointLocation = event->u.breakpoint.location;
- saEventPending = 1;
- break;
- }
-
- default:
- break;
- }
-
- while (saAttached && saEventPending) {
- SLEEP();
- }
-}
-
-extern "C" {
-JNIEXPORT jint JNICALL
-JVM_OnLoad(JavaVM *vm, char *options, void *reserved)
-{
- jvm = vm;
- if (jvm->GetEnv((void**) &jvmdi, JVMDI_VERSION_1) != JNI_OK) {
- return -1;
- }
- if (jvmdi->SetEventHook(&saEventHook) != JVMDI_ERROR_NONE) {
- return -1;
- }
- return 0;
-}
-};
diff --git a/hotspot/agent/src/share/native/jvmdi/sa.dsp b/hotspot/agent/src/share/native/jvmdi/sa.dsp
deleted file mode 100644
index 0339afbdefa..00000000000
--- a/hotspot/agent/src/share/native/jvmdi/sa.dsp
+++ /dev/null
@@ -1,105 +0,0 @@
-# Microsoft Developer Studio Project File - Name="sa" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=sa - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "sa.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "sa.mak" CFG="sa - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "sa - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "sa - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "sa - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SA_EXPORTS" /YX /FD /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /I "D:\jdk1.4\include" /I "D:\jdk1.4\include\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SA_EXPORTS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-
-!ELSEIF "$(CFG)" == "sa - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SA_EXPORTS" /YX /FD /GZ /c
-# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "D:\jdk1.4\include" /I "D:\jdk1.4\include\win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SA_EXPORTS" /YX /FD /GZ /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-
-!ENDIF
-
-# Begin Target
-
-# Name "sa - Win32 Release"
-# Name "sa - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\sa.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# End Group
-# Begin Group "Resource Files"
-
-# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
-# End Group
-# End Target
-# End Project
diff --git a/hotspot/agent/src/share/native/jvmdi/sa.dsw b/hotspot/agent/src/share/native/jvmdi/sa.dsw
deleted file mode 100644
index d16525a403d..00000000000
--- a/hotspot/agent/src/share/native/jvmdi/sa.dsw
+++ /dev/null
@@ -1,29 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "sa"=.\sa.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/hotspot/agent/src/share/native/jvmdi/sa.hpp b/hotspot/agent/src/share/native/jvmdi/sa.hpp
deleted file mode 100644
index ffe5e79c038..00000000000
--- a/hotspot/agent/src/share/native/jvmdi/sa.hpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2002, 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.
- *
- */
-
-#include "jni.h"
-
-extern "C" {
-JNIEXPORT jint JNICALL
-JVM_OnLoad(JavaVM *vm, char *options, void *reserved);
-}
diff --git a/hotspot/make/Makefile b/hotspot/make/Makefile
index a1d8cb9dde6..c55574d8247 100644
--- a/hotspot/make/Makefile
+++ b/hotspot/make/Makefile
@@ -464,9 +464,6 @@ endif
$(EXPORT_LIB_DIR)/%.jar: $(GEN_DIR)/%.jar
$(install-file)
-$(EXPORT_JRE_LIB_DIR)/%.jar: $(GEN_DIR)/%.jar
- $(install-file)
-
# Include files (jvmti.h, jvmticmlr.h, jni.h, $(JDK_INCLUDE_SUBDIR)/jni_md.h, jmm.h, jfr.h)
$(EXPORT_INCLUDE_DIR)/%: $(GEN_DIR)/jvmtifiles/%
$(install-file)
diff --git a/hotspot/make/bsd/makefiles/defs.make b/hotspot/make/bsd/makefiles/defs.make
index 824abe3aa0c..4c56c973892 100644
--- a/hotspot/make/bsd/makefiles/defs.make
+++ b/hotspot/make/bsd/makefiles/defs.make
@@ -157,8 +157,6 @@ EXPORT_SERVER_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/server
EXPORT_CLIENT_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/client
EXPORT_MINIMAL_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/minimal
-EXPORT_LIST += $(EXPORT_JRE_LIB_DIR)/wb.jar
-
ifeq ($(findstring true, $(JVM_VARIANT_SERVER) $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true)
EXPORT_LIST += $(EXPORT_SERVER_DIR)/Xusage.txt
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.$(LIBRARY_SUFFIX)
diff --git a/hotspot/make/bsd/makefiles/vm.make b/hotspot/make/bsd/makefiles/vm.make
index a77d04f0393..e93765dc50f 100644
--- a/hotspot/make/bsd/makefiles/vm.make
+++ b/hotspot/make/bsd/makefiles/vm.make
@@ -337,9 +337,6 @@ include $(MAKEFILES_DIR)/jsig.make
# Serviceability agent
include $(MAKEFILES_DIR)/saproc.make
-# Whitebox testing API
-include $(MAKEFILES_DIR)/wb.make
-
#----------------------------------------------------------------------
ifeq ($(OS_VENDOR), Darwin)
@@ -347,10 +344,10 @@ $(LIBJVM).dSYM: $(LIBJVM)
dsymutil $(LIBJVM)
# no libjvm_db for macosx
-build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(BUILDLIBSAPROC) dtraceCheck $(LIBJVM).dSYM $(WB_JAR)
+build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(BUILDLIBSAPROC) dtraceCheck $(LIBJVM).dSYM
echo "Doing vm.make build:"
else
-build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(BUILDLIBSAPROC) $(WB_JAR)
+build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(BUILDLIBSAPROC)
endif
install: install_jvm install_jsig install_saproc
diff --git a/hotspot/make/bsd/makefiles/wb.make b/hotspot/make/bsd/makefiles/wb.make
deleted file mode 100644
index 8298d871cce..00000000000
--- a/hotspot/make/bsd/makefiles/wb.make
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# Copyright (c) 2012, 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.
-#
-#
-
-# Rules to build whitebox testing library, used by vm.make
-WB = wb
-
-WBSRCDIR = $(GAMMADIR)/src/share/tools/whitebox
-
-WB_JAR = $(GENERATED)/$(WB).jar
-
-WB_JAVA_SRCS = $(shell find $(WBSRCDIR) -name '*.java')
-WB_JAVA_CLASSDIR = $(GENERATED)/wb/classes
-
-WB_JAVA_CLASSES = $(patsubst $(WBSRCDIR)/%,$(WB_JAVA_CLASSDIR)/%, \
- $(patsubst %.java,%.class,$(WB_JAVA_SRCS)))
-
-$(WB_JAVA_CLASSDIR)/%.class: $(WBSRCDIR)/%.java $(WB_JAVA_CLASSDIR)
- $(REMOTE) $(COMPILE.JAVAC) -sourcepath $(WBSRCDIR) -nowarn -d $(WB_JAVA_CLASSDIR) $<
-
-$(WB_JAR): $(WB_JAVA_CLASSES)
- $(QUIETLY) $(REMOTE) $(RUN.JAR) cf $@ -C $(WB_JAVA_CLASSDIR)/ .
-
-$(WB_JAVA_CLASSDIR):
- $(QUIETLY) mkdir -p $@
-
diff --git a/hotspot/make/hotspot_version b/hotspot/make/hotspot_version
index 5d39709c53b..bcc1ff8f148 100644
--- a/hotspot/make/hotspot_version
+++ b/hotspot/make/hotspot_version
@@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2013
HS_MAJOR_VER=25
HS_MINOR_VER=0
-HS_BUILD_NUMBER=20
+HS_BUILD_NUMBER=21
JDK_MAJOR_VER=1
JDK_MINOR_VER=8
diff --git a/hotspot/make/linux/makefiles/defs.make b/hotspot/make/linux/makefiles/defs.make
index cd9c2c43654..9bdbdf226e6 100644
--- a/hotspot/make/linux/makefiles/defs.make
+++ b/hotspot/make/linux/makefiles/defs.make
@@ -258,8 +258,6 @@ EXPORT_SERVER_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/server
EXPORT_CLIENT_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/client
EXPORT_MINIMAL_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/minimal
-EXPORT_LIST += $(EXPORT_JRE_LIB_DIR)/wb.jar
-
ifeq ($(findstring true, $(JVM_VARIANT_SERVER) $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true)
EXPORT_LIST += $(EXPORT_SERVER_DIR)/Xusage.txt
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.$(LIBRARY_SUFFIX)
diff --git a/hotspot/make/linux/makefiles/vm.make b/hotspot/make/linux/makefiles/vm.make
index 1de0d310b88..b31064782f7 100644
--- a/hotspot/make/linux/makefiles/vm.make
+++ b/hotspot/make/linux/makefiles/vm.make
@@ -381,12 +381,9 @@ include $(MAKEFILES_DIR)/jsig.make
# Serviceability agent
include $(MAKEFILES_DIR)/saproc.make
-# Whitebox testing API
-include $(MAKEFILES_DIR)/wb.make
-
#----------------------------------------------------------------------
-build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(BUILDLIBSAPROC) dtraceCheck $(WB_JAR)
+build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(BUILDLIBSAPROC) dtraceCheck
install: install_jvm install_jsig install_saproc
diff --git a/hotspot/make/linux/makefiles/wb.make b/hotspot/make/linux/makefiles/wb.make
deleted file mode 100644
index 8298d871cce..00000000000
--- a/hotspot/make/linux/makefiles/wb.make
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# Copyright (c) 2012, 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.
-#
-#
-
-# Rules to build whitebox testing library, used by vm.make
-WB = wb
-
-WBSRCDIR = $(GAMMADIR)/src/share/tools/whitebox
-
-WB_JAR = $(GENERATED)/$(WB).jar
-
-WB_JAVA_SRCS = $(shell find $(WBSRCDIR) -name '*.java')
-WB_JAVA_CLASSDIR = $(GENERATED)/wb/classes
-
-WB_JAVA_CLASSES = $(patsubst $(WBSRCDIR)/%,$(WB_JAVA_CLASSDIR)/%, \
- $(patsubst %.java,%.class,$(WB_JAVA_SRCS)))
-
-$(WB_JAVA_CLASSDIR)/%.class: $(WBSRCDIR)/%.java $(WB_JAVA_CLASSDIR)
- $(REMOTE) $(COMPILE.JAVAC) -sourcepath $(WBSRCDIR) -nowarn -d $(WB_JAVA_CLASSDIR) $<
-
-$(WB_JAR): $(WB_JAVA_CLASSES)
- $(QUIETLY) $(REMOTE) $(RUN.JAR) cf $@ -C $(WB_JAVA_CLASSDIR)/ .
-
-$(WB_JAVA_CLASSDIR):
- $(QUIETLY) mkdir -p $@
-
diff --git a/hotspot/make/sa.files b/hotspot/make/sa.files
index b982aaff736..c4414be60c1 100644
--- a/hotspot/make/sa.files
+++ b/hotspot/make/sa.files
@@ -24,10 +24,7 @@
# This filelist macro is included in platform specific sa.make
# included all packages/*.java. package list can be generated by
-# $(GAMMADIR)/agent/make/build-pkglist. Then manually removed all
-# classes in sun.jvm.hotspot.ui (and subpackages), all ui classes
-# in sun.jvm.hotspot.bugspot/hotspot and SPARC and x86 disassembler
-# classes and sun.jvm.hotspot.utilities.soql.
+# $(GAMMADIR)/agent/make/build-pkglist.
# define AGENT_DIR before including this file in sa.make
@@ -40,8 +37,6 @@ AGENT_FILES = \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/asm/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/asm/sparc/*.java \
-$(AGENT_SRC_DIR)/sun/jvm/hotspot/bugspot/*.java \
-$(AGENT_SRC_DIR)/sun/jvm/hotspot/bugspot/tree/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/c1/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/ci/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/code/*.java \
@@ -82,7 +77,6 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/gc_implementation/shared/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/gc_interface/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/interpreter/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/jdi/*.java \
-$(AGENT_SRC_DIR)/sun/jvm/hotspot/livejvm/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/memory/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/oops/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/opto/*.java \
diff --git a/hotspot/make/solaris/makefiles/defs.make b/hotspot/make/solaris/makefiles/defs.make
index 896798f1a12..14d0aced5a1 100644
--- a/hotspot/make/solaris/makefiles/defs.make
+++ b/hotspot/make/solaris/makefiles/defs.make
@@ -187,8 +187,6 @@ ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
endif
endif
-EXPORT_LIST += $(EXPORT_JRE_LIB_DIR)/wb.jar
-
EXPORT_SERVER_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/server
EXPORT_CLIENT_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/client
diff --git a/hotspot/make/solaris/makefiles/vm.make b/hotspot/make/solaris/makefiles/vm.make
index 74d42a23d83..5aca8f05f76 100644
--- a/hotspot/make/solaris/makefiles/vm.make
+++ b/hotspot/make/solaris/makefiles/vm.make
@@ -347,12 +347,9 @@ include $(MAKEFILES_DIR)/jsig.make
# Serviceability agent
include $(MAKEFILES_DIR)/saproc.make
-# Whitebox testing API
-include $(MAKEFILES_DIR)/wb.make
-
#----------------------------------------------------------------------
-build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(LIBJVM_DTRACE) $(BUILDLIBSAPROC) dtraceCheck $(WB_JAR)
+build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(LIBJVM_DTRACE) $(BUILDLIBSAPROC) dtraceCheck
install: install_jvm install_jsig install_saproc
diff --git a/hotspot/make/solaris/makefiles/wb.make b/hotspot/make/solaris/makefiles/wb.make
deleted file mode 100644
index a4a24ddc792..00000000000
--- a/hotspot/make/solaris/makefiles/wb.make
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# Copyright (c) 2012, 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.
-#
-
-# Rules to build whitebox testing library, used by vm.make
-
-WB = wb
-
-WBSRCDIR = $(GAMMADIR)/src/share/tools/whitebox
-
-WB_JAR = $(GENERATED)/$(WB).jar
-
-WB_JAVA_SRCS = $(shell find $(WBSRCDIR) -name '*.java')
-WB_JAVA_CLASSDIR = $(GENERATED)/wb/classes
-
-WB_JAVA_CLASSES = $(patsubst $(WBSRCDIR)/%,$(WB_JAVA_CLASSDIR)/%, \
- $(patsubst %.java,%.class,$(WB_JAVA_SRCS)))
-
-$(WB_JAVA_CLASSDIR)/%.class: $(WBSRCDIR)/%.java $(WB_JAVA_CLASSDIR)
- $(REMOTE) $(COMPILE.JAVAC) -sourcepath $(WBSRCDIR) -nowarn -d $(WB_JAVA_CLASSDIR) $<
-
-$(WB_JAR): $(WB_JAVA_CLASSES)
- $(QUIETLY) $(REMOTE) $(RUN.JAR) cf $@ -C $(WB_JAVA_CLASSDIR)/ .
-
-$(WB_JAVA_CLASSDIR):
- $(QUIETLY) mkdir -p $@
-
diff --git a/hotspot/make/windows/makefiles/debug.make b/hotspot/make/windows/makefiles/debug.make
index 36a12dc9de2..c19f1757b69 100644
--- a/hotspot/make/windows/makefiles/debug.make
+++ b/hotspot/make/windows/makefiles/debug.make
@@ -33,7 +33,7 @@ GENERATED=../generated
BUILD_PCH_FILE=_build_pch_file.obj
!endif
-default:: $(BUILD_PCH_FILE) $(AOUT) launcher checkAndBuildSA wb
+default:: $(BUILD_PCH_FILE) $(AOUT) launcher checkAndBuildSA
!include ../local.make
!include compile.make
@@ -72,4 +72,3 @@ $(AOUT): $(Res_Files) $(Obj_Files) vm.def
!include $(WorkSpace)/make/windows/makefiles/shared.make
!include $(WorkSpace)/make/windows/makefiles/sa.make
!include $(WorkSpace)/make/windows/makefiles/launcher.make
-!include $(WorkSpace)/make/windows/makefiles/wb.make
diff --git a/hotspot/make/windows/makefiles/defs.make b/hotspot/make/windows/makefiles/defs.make
index 5d58e699bf2..ca1f327be75 100644
--- a/hotspot/make/windows/makefiles/defs.make
+++ b/hotspot/make/windows/makefiles/defs.make
@@ -277,8 +277,6 @@ ifeq ($(JVM_VARIANT_CLIENT),true)
endif
endif
-EXPORT_LIST += $(EXPORT_JRE_LIB_DIR)/wb.jar
-
ifeq ($(BUILD_WIN_SA), 1)
EXPORT_LIST += $(EXPORT_JRE_BIN_DIR)/sawindbg.$(LIBRARY_SUFFIX)
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
diff --git a/hotspot/make/windows/makefiles/fastdebug.make b/hotspot/make/windows/makefiles/fastdebug.make
index f6347bcb912..0fc2329dfd9 100644
--- a/hotspot/make/windows/makefiles/fastdebug.make
+++ b/hotspot/make/windows/makefiles/fastdebug.make
@@ -33,7 +33,7 @@ GENERATED=../generated
BUILD_PCH_FILE=_build_pch_file.obj
!endif
-default:: $(BUILD_PCH_FILE) $(AOUT) launcher checkAndBuildSA wb
+default:: $(BUILD_PCH_FILE) $(AOUT) launcher checkAndBuildSA
!include ../local.make
!include compile.make
@@ -71,4 +71,3 @@ $(AOUT): $(Res_Files) $(Obj_Files) vm.def
!include $(WorkSpace)/make/windows/makefiles/shared.make
!include $(WorkSpace)/make/windows/makefiles/sa.make
!include $(WorkSpace)/make/windows/makefiles/launcher.make
-!include $(WorkSpace)/make/windows/makefiles/wb.make
diff --git a/hotspot/make/windows/makefiles/product.make b/hotspot/make/windows/makefiles/product.make
index ada9c72a148..2b21d1ceb58 100644
--- a/hotspot/make/windows/makefiles/product.make
+++ b/hotspot/make/windows/makefiles/product.make
@@ -32,7 +32,7 @@ GENERATED=../generated
BUILD_PCH_FILE=_build_pch_file.obj
!endif
-default:: $(BUILD_PCH_FILE) $(AOUT) launcher checkAndBuildSA wb
+default:: $(BUILD_PCH_FILE) $(AOUT) launcher checkAndBuildSA
!include ../local.make
!include compile.make
@@ -82,4 +82,3 @@ $(AOUT): $(Res_Files) $(Obj_Files) vm.def
!include $(WorkSpace)/make/windows/makefiles/shared.make
!include $(WorkSpace)/make/windows/makefiles/sa.make
!include $(WorkSpace)/make/windows/makefiles/launcher.make
-!include $(WorkSpace)/make/windows/makefiles/wb.make
diff --git a/hotspot/make/windows/makefiles/wb.make b/hotspot/make/windows/makefiles/wb.make
deleted file mode 100644
index 76b4318bdce..00000000000
--- a/hotspot/make/windows/makefiles/wb.make
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# Copyright (c) 2012, 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.
-#
-#
-
-# This makefile is used to build the whitebox testing lib
-# and compile the tests which use it
-
-!include $(WorkSpace)/make/windows/makefiles/rules.make
-
-WBSRCDIR = $(WorkSpace)/src/share/tools/whitebox
-
-# turn GENERATED into a windows path to get sane dependencies
-WB_CLASSES=$(GENERATED:/=\)\wb\classes
-WB_JAR=$(GENERATED:/=\)\wb.jar
-
-# call recursive make to do wildcard expansion
-.SUFFIXES : .java .class
-wb_java_srcs: $(WorkSpace)\src\share\tools\whitebox\sun\hotspot\*.java $(WB_CLASSES)
- $(MAKE) -f $(WorkSpace)\make\windows\makefiles\$(BUILD_FLAVOR).make $(**:.java=.class)
-
-
-{$(WorkSpace)\src\share\tools\whitebox\sun\hotspot}.java.class::
- $(COMPILE_JAVAC) -sourcepath $(WBSRCDIR) -d $(WB_CLASSES) $<
-
-$(WB_JAR): wb_java_srcs
- $(RUN_JAR) cf $@ -C $(WB_CLASSES) .
-
-# turn $@ to a unix path because mkdir in PATH is cygwin/mks mkdir
-$(WB_CLASSES):
- mkdir -p $(@:\=/)
-
-# main target to build wb
-wb: $(WB_JAR)
-
diff --git a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp
index 93ae06e0f6d..1c368ffe84e 100644
--- a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp
@@ -216,6 +216,11 @@ bool frame::safe_for_sender(JavaThread *thread) {
}
}
+ // Could just be some random pointer within the codeBlob
+ if (!_cb->code_contains(_pc)) {
+ return false;
+ }
+
// Entry frame checks
if (is_entry_frame()) {
// an entry frame must have a valid fp.
diff --git a/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp b/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp
index d32a2493cfb..01d593fb034 100644
--- a/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, 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
@@ -340,8 +340,6 @@ void TemplateTable::ldc(bool wide) {
__ bind(notInt);
// __ cmp(O2, JVM_CONSTANT_String);
- __ brx(Assembler::equal, true, Assembler::pt, isString);
- __ delayed()->cmp(O2, JVM_CONSTANT_Object);
__ brx(Assembler::notEqual, true, Assembler::pt, notString);
__ delayed()->ldf(FloatRegisterImpl::S, O0, O1, Ftos_f);
__ bind(isString);
diff --git a/hotspot/src/cpu/x86/vm/frame_x86.cpp b/hotspot/src/cpu/x86/vm/frame_x86.cpp
index 0718f592aa6..fa0855c458c 100644
--- a/hotspot/src/cpu/x86/vm/frame_x86.cpp
+++ b/hotspot/src/cpu/x86/vm/frame_x86.cpp
@@ -91,6 +91,12 @@ bool frame::safe_for_sender(JavaThread *thread) {
return false;
}
}
+
+ // Could just be some random pointer within the codeBlob
+ if (!_cb->code_contains(_pc)) {
+ return false;
+ }
+
// Entry frame checks
if (is_entry_frame()) {
// an entry frame must have a valid fp.
diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp
index 74c237fdf90..9f09507e67b 100644
--- a/hotspot/src/os/linux/vm/os_linux.cpp
+++ b/hotspot/src/os/linux/vm/os_linux.cpp
@@ -4743,49 +4743,26 @@ jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
//
static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
- static bool proc_pid_cpu_avail = true;
static bool proc_task_unchecked = true;
static const char *proc_stat_path = "/proc/%d/stat";
pid_t tid = thread->osthread()->thread_id();
- int i;
char *s;
char stat[2048];
int statlen;
char proc_name[64];
int count;
long sys_time, user_time;
- char string[64];
char cdummy;
int idummy;
long ldummy;
FILE *fp;
- // We first try accessing /proc//cpu since this is faster to
- // process. If this file is not present (linux kernels 2.5 and above)
- // then we open /proc//stat.
- if ( proc_pid_cpu_avail ) {
- sprintf(proc_name, "/proc/%d/cpu", tid);
- fp = fopen(proc_name, "r");
- if ( fp != NULL ) {
- count = fscanf( fp, "%s %lu %lu\n", string, &user_time, &sys_time);
- fclose(fp);
- if ( count != 3 ) return -1;
-
- if (user_sys_cpu_time) {
- return ((jlong)sys_time + (jlong)user_time) * (1000000000 / clock_tics_per_sec);
- } else {
- return (jlong)user_time * (1000000000 / clock_tics_per_sec);
- }
- }
- else proc_pid_cpu_avail = false;
- }
-
// The /proc//stat aggregates per-process usage on
// new Linux kernels 2.6+ where NPTL is supported.
// The /proc/self/task//stat still has the per-thread usage.
// See bug 6328462.
- // There can be no directory /proc/self/task on kernels 2.4 with NPTL
- // and possibly in some other cases, so we check its availability.
+ // There possibly can be cases where there is no directory
+ // /proc/self/task, so we check its availability.
if (proc_task_unchecked && os::Linux::is_NPTL()) {
// This is executed only once
proc_task_unchecked = false;
@@ -4810,7 +4787,6 @@ static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
// We don't really need to know the command string, just find the last
// occurrence of ")" and then start parsing from there. See bug 4726580.
s = strrchr(stat, ')');
- i = 0;
if (s == NULL ) return -1;
// Skip blank chars
diff --git a/hotspot/src/share/tools/whitebox/sun/hotspot/parser/DiagnosticCommand.java b/hotspot/src/share/tools/whitebox/sun/hotspot/parser/DiagnosticCommand.java
deleted file mode 100644
index 2099901a4a6..00000000000
--- a/hotspot/src/share/tools/whitebox/sun/hotspot/parser/DiagnosticCommand.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package sun.hotspot.parser;
-
-public class DiagnosticCommand {
-
- public enum DiagnosticArgumentType {
- JLONG, BOOLEAN, STRING, NANOTIME, STRINGARRAY, MEMORYSIZE
- }
-
- private String name;
- private String desc;
- private DiagnosticArgumentType type;
- private boolean mandatory;
- private String defaultValue;
-
- public DiagnosticCommand(String name, String desc, DiagnosticArgumentType type,
- boolean mandatory, String defaultValue) {
- this.name = name;
- this.desc = desc;
- this.type = type;
- this.mandatory = mandatory;
- this.defaultValue = defaultValue;
- }
-
- public String getName() {
- return name;
- }
-
- public String getDesc() {
- return desc;
- }
-
- public DiagnosticArgumentType getType() {
- return type;
- }
-
- public boolean isMandatory() {
- return mandatory;
- }
-
- public String getDefaultValue() {
- return defaultValue;
- }
-}
diff --git a/hotspot/src/share/vm/adlc/formssel.cpp b/hotspot/src/share/vm/adlc/formssel.cpp
index b9170ec379e..42f1e3fad6f 100644
--- a/hotspot/src/share/vm/adlc/formssel.cpp
+++ b/hotspot/src/share/vm/adlc/formssel.cpp
@@ -753,10 +753,11 @@ bool InstructForm::captures_bottom_type(FormDict &globals) const {
!strcmp(_matrule->_rChild->_opType,"DecodeNKlass") ||
!strcmp(_matrule->_rChild->_opType,"EncodePKlass") ||
!strcmp(_matrule->_rChild->_opType,"LoadN") ||
- !strcmp(_matrule->_rChild->_opType,"GetAndSetN") ||
!strcmp(_matrule->_rChild->_opType,"LoadNKlass") ||
!strcmp(_matrule->_rChild->_opType,"CreateEx") || // type of exception
- !strcmp(_matrule->_rChild->_opType,"CheckCastPP")) ) return true;
+ !strcmp(_matrule->_rChild->_opType,"CheckCastPP") ||
+ !strcmp(_matrule->_rChild->_opType,"GetAndSetP") ||
+ !strcmp(_matrule->_rChild->_opType,"GetAndSetN")) ) return true;
else if ( is_ideal_load() == Form::idealP ) return true;
else if ( is_ideal_store() != Form::none ) return true;
diff --git a/hotspot/src/share/vm/ci/ciEnv.cpp b/hotspot/src/share/vm/ci/ciEnv.cpp
index bd18105d9ba..a9a3706df32 100644
--- a/hotspot/src/share/vm/ci/ciEnv.cpp
+++ b/hotspot/src/share/vm/ci/ciEnv.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, 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
@@ -597,10 +597,6 @@ ciConstant ciEnv::get_constant_by_index_impl(constantPoolHandle cpool,
assert (klass->is_instance_klass() || klass->is_array_klass(),
"must be an instance or array klass ");
return ciConstant(T_OBJECT, klass->java_mirror());
- } else if (tag.is_object()) {
- oop obj = cpool->object_at(index);
- ciObject* ciobj = get_object(obj);
- return ciConstant(T_OBJECT, ciobj);
} else if (tag.is_method_type()) {
// must execute Java code to link this CP entry into cache[i].f1
ciSymbol* signature = get_symbol(cpool->method_type_signature_at(index));
diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp
index 3247e87692b..a961fda8f51 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp
@@ -117,7 +117,7 @@ void ConcurrentMarkThread::run() {
if (G1Log::fine()) {
gclog_or_tty->date_stamp(PrintGCDateStamps);
gclog_or_tty->stamp(PrintGCTimeStamps);
- gclog_or_tty->print_cr("[GC concurrent-root-region-scan-end, %1.7lf]",
+ gclog_or_tty->print_cr("[GC concurrent-root-region-scan-end, %1.7lf secs]",
scan_end - scan_start);
}
}
@@ -150,7 +150,7 @@ void ConcurrentMarkThread::run() {
if (G1Log::fine()) {
gclog_or_tty->date_stamp(PrintGCDateStamps);
gclog_or_tty->stamp(PrintGCTimeStamps);
- gclog_or_tty->print_cr("[GC concurrent-mark-end, %1.7lf sec]",
+ gclog_or_tty->print_cr("[GC concurrent-mark-end, %1.7lf secs]",
mark_end_sec - mark_start_sec);
}
@@ -234,7 +234,7 @@ void ConcurrentMarkThread::run() {
if (G1Log::fine()) {
gclog_or_tty->date_stamp(PrintGCDateStamps);
gclog_or_tty->stamp(PrintGCTimeStamps);
- gclog_or_tty->print_cr("[GC concurrent-cleanup-end, %1.7lf]",
+ gclog_or_tty->print_cr("[GC concurrent-cleanup-end, %1.7lf secs]",
cleanup_end_sec - cleanup_start_sec);
}
}
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
index 168fc3376f6..4231e95f3b5 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
@@ -267,7 +267,15 @@ G1CollectorPolicy::G1CollectorPolicy() :
double max_gc_time = (double) MaxGCPauseMillis / 1000.0;
double time_slice = (double) GCPauseIntervalMillis / 1000.0;
_mmu_tracker = new G1MMUTrackerQueue(time_slice, max_gc_time);
- _sigma = (double) G1ConfidencePercent / 100.0;
+
+ uintx confidence_perc = G1ConfidencePercent;
+ // Put an artificial ceiling on this so that it's not set to a silly value.
+ if (confidence_perc > 100) {
+ confidence_perc = 100;
+ warning("G1ConfidencePercent is set to a value that is too large, "
+ "it's been updated to %u", confidence_perc);
+ }
+ _sigma = (double) confidence_perc / 100.0;
// start conservatively (around 50ms is about right)
_concurrent_mark_remark_times_ms->add(0.05);
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp
index 1111cecfa4c..8bd099bd41a 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp
@@ -32,7 +32,7 @@
#define G1_FLAGS(develop, develop_pd, product, product_pd, diagnostic, experimental, notproduct, manageable, product_rw) \
\
- product(intx, G1ConfidencePercent, 50, \
+ product(uintx, G1ConfidencePercent, 50, \
"Confidence level for MMU/pause predictions") \
\
develop(intx, G1MarkingOverheadPercent, 0, \
diff --git a/hotspot/src/share/vm/interpreter/bytecodeTracer.cpp b/hotspot/src/share/vm/interpreter/bytecodeTracer.cpp
index f03edec8392..ac490ec4449 100644
--- a/hotspot/src/share/vm/interpreter/bytecodeTracer.cpp
+++ b/hotspot/src/share/vm/interpreter/bytecodeTracer.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, 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
@@ -335,9 +335,6 @@ void BytecodePrinter::print_constant(int i, outputStream* st) {
st->print_cr(" %s", constants->resolved_klass_at(i)->external_name());
} else if (tag.is_unresolved_klass()) {
st->print_cr(" ", i);
- } else if (tag.is_object()) {
- st->print("