From 7f40378f06a5723ede9c8abc23775cadcdd0037c Mon Sep 17 00:00:00 2001 From: David Daney Date: Thu, 15 Feb 2007 17:25:24 +0000 Subject: [PATCH] Make-lang.in (JAVA_MANFILES): Add doc/gc-analyze.1. gcc/java: 2007-02-15 David Daney * Make-lang.in (JAVA_MANFILES): Add doc/gc-analyze.1. (java.maintainer-clean):Add gc-analyze.1. (.INTERMEDIATE): Add gc-analyze.pod. (gc-analyze.pod): New rule. (java.install-man): Install gc-analyze.1 * gcj.texi: Add new section for the gc-analyze program. libjava: 2007-02-15 Johannes Schmidt David Daney * configure.ac: Create vm-tools-packages file. Add gnu/gcj/tools/gc_analyze to standard.omit and vm-tools-packages. Check for /proc/self/maps. * Makefile.am (bin_PROGRAMS): Added gc-analyze. (gc_analyze_SOURCES): New. (gc_analyze_LDFLAGS): New. (gc_analyze_LINK): New. (gc_analyze_LDADD): New. (gc_analyze_DEPENDENCIES): New. (nat_source_files): Add gnu/gcj/util/natGCInfo.cc. * Makefile.in: Regenerated. * configure: Regenerated. * include/config.h.in: Regenerated. * sources.am: Regenerated. * scripts/makemake.tcl: Don't include gc-analyze classes in libgcj. * gnu/gcj/tools/gc_analyze/SymbolLookup.java: New. * gnu/gcj/tools/gc_analyze/ObjectMap.java: New. * gnu/gcj/tools/gc_analyze/MemoryMap.java: New. * gnu/gcj/tools/gc_analyze/SymbolTable.java: New. * gnu/gcj/tools/gc_analyze/BlockMap.java: New. * gnu/gcj/tools/gc_analyze/BytePtr.java: New. * gnu/gcj/tools/gc_analyze/ItemList.java: New. * gnu/gcj/tools/gc_analyze/ToolPrefix.java: New. * gnu/gcj/tools/gc_analyze/MemoryAnalyze.java: New. * gnu/gcj/util/GCInfo.java: New. * gnu/gcj/util/GCInfo.h: New. * gnu/gcj/util/natGCInfo.cc: New. * gnu/gcj/util/UtilPermission.java: New. * gnu/gcj/util/UtilPermission.h: New. * classpath/tools/gnu/gcj/tools/gc_analyze/SymbolTable.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/ObjectMap$ObjectItem.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryMap$RangeComparator.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/BlockMap$PtrMarks.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryMap$Range.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/BlockMap.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/BytePtr.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$SubstringComparator.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/ItemList.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/ToolPrefix.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$1$Info.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$1.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$2.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$3.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$4.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$OptionParser.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/BlockMap$SizeKind.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/SymbolLookup.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/ObjectMap.class: New. * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryMap.class: New. * classpath/lib/gnu/gcj/util/GCInfo.class: New. * classpath/lib/gnu/gcj/util/UtilPermission.class: New. libjava/classpath: 2007-02-15 David Daney * tools/Makefile.am (TOOLS_ZIP): Add classes from vm-tools-packages. * tools/Makefile.in: Regenerated. From-SVN: r122007 --- gcc/java/ChangeLog | 9 + gcc/java/Make-lang.in | 11 +- gcc/java/gcj.texi | 88 +++- libjava/ChangeLog | 56 +++ libjava/Makefile.am | 17 +- libjava/Makefile.in | 54 ++- libjava/classpath/ChangeLog.gcj | 5 + .../classpath/lib/gnu/gcj/util/GCInfo.class | Bin 0 -> 1043 bytes .../lib/gnu/gcj/util/UtilPermission.class | Bin 0 -> 367 bytes libjava/classpath/tools/Makefile.am | 11 +- libjava/classpath/tools/Makefile.in | 11 +- .../tools/gc_analyze/BlockMap$PtrMarks.class | Bin 0 -> 612 bytes .../tools/gc_analyze/BlockMap$SizeKind.class | Bin 0 -> 1004 bytes .../gnu/gcj/tools/gc_analyze/BlockMap.class | Bin 0 -> 5408 bytes .../gnu/gcj/tools/gc_analyze/BytePtr.class | Bin 0 -> 2466 bytes .../gnu/gcj/tools/gc_analyze/ItemList.class | Bin 0 -> 3358 bytes .../gc_analyze/MemoryAnalyze$1$Info.class | Bin 0 -> 510 bytes .../tools/gc_analyze/MemoryAnalyze$1.class | Bin 0 -> 1109 bytes .../tools/gc_analyze/MemoryAnalyze$2.class | Bin 0 -> 1109 bytes .../tools/gc_analyze/MemoryAnalyze$3.class | Bin 0 -> 1073 bytes .../tools/gc_analyze/MemoryAnalyze$4.class | Bin 0 -> 1086 bytes .../MemoryAnalyze$OptionParser.class | Bin 0 -> 2636 bytes .../MemoryAnalyze$SubstringComparator.class | Bin 0 -> 1269 bytes .../gcj/tools/gc_analyze/MemoryAnalyze.class | Bin 0 -> 10627 bytes .../tools/gc_analyze/MemoryMap$Range.class | Bin 0 -> 714 bytes .../MemoryMap$RangeComparator.class | Bin 0 -> 1064 bytes .../gnu/gcj/tools/gc_analyze/MemoryMap.class | Bin 0 -> 7398 bytes .../gc_analyze/ObjectMap$ObjectItem.class | Bin 0 -> 894 bytes .../gnu/gcj/tools/gc_analyze/ObjectMap.class | Bin 0 -> 4105 bytes .../gcj/tools/gc_analyze/SymbolLookup.class | Bin 0 -> 2485 bytes .../gcj/tools/gc_analyze/SymbolTable.class | Bin 0 -> 5725 bytes .../gnu/gcj/tools/gc_analyze/ToolPrefix.class | Bin 0 -> 1051 bytes libjava/configure | 192 +++++++- libjava/configure.ac | 10 + .../gnu/gcj/tools/gc_analyze/BlockMap.java | 218 +++++++++ libjava/gnu/gcj/tools/gc_analyze/BytePtr.java | 115 +++++ .../gnu/gcj/tools/gc_analyze/ItemList.java | 72 +++ .../gcj/tools/gc_analyze/MemoryAnalyze.java | 458 ++++++++++++++++++ .../gnu/gcj/tools/gc_analyze/MemoryMap.java | 359 ++++++++++++++ .../gnu/gcj/tools/gc_analyze/ObjectMap.java | 140 ++++++ .../gcj/tools/gc_analyze/SymbolLookup.java | 112 +++++ .../gnu/gcj/tools/gc_analyze/SymbolTable.java | 198 ++++++++ .../gnu/gcj/tools/gc_analyze/ToolPrefix.java | 45 ++ libjava/gnu/gcj/util/GCInfo.h | 45 ++ libjava/gnu/gcj/util/GCInfo.java | 79 +++ libjava/gnu/gcj/util/UtilPermission.h | 32 ++ libjava/gnu/gcj/util/UtilPermission.java | 20 + libjava/gnu/gcj/util/natGCInfo.cc | 454 +++++++++++++++++ libjava/include/config.h.in | 6 + libjava/scripts/makemake.tcl | 1 + libjava/sources.am | 4 +- 51 files changed, 2783 insertions(+), 39 deletions(-) create mode 100644 libjava/classpath/lib/gnu/gcj/util/GCInfo.class create mode 100644 libjava/classpath/lib/gnu/gcj/util/UtilPermission.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/BlockMap$PtrMarks.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/BlockMap$SizeKind.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/BlockMap.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/BytePtr.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/ItemList.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$1$Info.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$1.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$2.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$3.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$4.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$OptionParser.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$SubstringComparator.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryMap$Range.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryMap$RangeComparator.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryMap.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/ObjectMap$ObjectItem.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/ObjectMap.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/SymbolLookup.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/SymbolTable.class create mode 100644 libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/ToolPrefix.class create mode 100644 libjava/gnu/gcj/tools/gc_analyze/BlockMap.java create mode 100644 libjava/gnu/gcj/tools/gc_analyze/BytePtr.java create mode 100644 libjava/gnu/gcj/tools/gc_analyze/ItemList.java create mode 100644 libjava/gnu/gcj/tools/gc_analyze/MemoryAnalyze.java create mode 100644 libjava/gnu/gcj/tools/gc_analyze/MemoryMap.java create mode 100644 libjava/gnu/gcj/tools/gc_analyze/ObjectMap.java create mode 100644 libjava/gnu/gcj/tools/gc_analyze/SymbolLookup.java create mode 100644 libjava/gnu/gcj/tools/gc_analyze/SymbolTable.java create mode 100644 libjava/gnu/gcj/tools/gc_analyze/ToolPrefix.java create mode 100644 libjava/gnu/gcj/util/GCInfo.h create mode 100644 libjava/gnu/gcj/util/GCInfo.java create mode 100644 libjava/gnu/gcj/util/UtilPermission.h create mode 100644 libjava/gnu/gcj/util/UtilPermission.java create mode 100644 libjava/gnu/gcj/util/natGCInfo.cc diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 03c4f962e15..f9ef73fb28e 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,12 @@ +2007-02-15 David Daney + + * Make-lang.in (JAVA_MANFILES): Add doc/gc-analyze.1. + (java.maintainer-clean):Add gc-analyze.1. + (.INTERMEDIATE): Add gc-analyze.pod. + (gc-analyze.pod): New rule. + (java.install-man): Install gc-analyze.1 + * gcj.texi: Add new section for the gc-analyze program. + 2007-02-07 Andrew Haley * class.c (uncache_this_class_ref): New. diff --git a/gcc/java/Make-lang.in b/gcc/java/Make-lang.in index f1c347ffeb1..a2024948a71 100644 --- a/gcc/java/Make-lang.in +++ b/gcc/java/Make-lang.in @@ -139,7 +139,7 @@ java.pdf: doc/gcj.pdf java.html: $(build_htmldir)/java/index.html JAVA_MANFILES = doc/gcj.1 doc/jcf-dump.1 doc/gij.1 \ doc/jv-convert.1 doc/grmic.1 doc/grmiregistry.1 \ - doc/gcj-dbtool.1 + doc/gcj-dbtool.1 doc/gc-analyze.1 java.man: $(JAVA_MANFILES) @@ -208,6 +208,7 @@ java.maintainer-clean: -rm -f $(docobjdir)/grmic.1 -rm -f $(docobjdir)/grmiregistry.1 -rm -f $(docobjdir)/gcj-dbtool.1 + -rm -f $(docobjdir)/gc-analyze.1 # # Stage hooks: # The main makefile has already created stage?/java. @@ -318,7 +319,7 @@ $(build_htmldir)/java/index.html: $(TEXI_JAVA_FILES) $(TEXI2HTML) -I $(gcc_docdir)/include -I $(srcdir)/java -o $(@D) $< .INTERMEDIATE: gcj.pod jcf-dump.pod gij.pod \ - jv-convert.pod grmic.pod grmiregistry.pod gcj-dbtool.pod + jv-convert.pod grmic.pod grmiregistry.pod gcj-dbtool.pod gc-analyze.pod gcj.pod: java/gcj.texi -$(TEXI2POD) -D gcj < $< > $@ @@ -334,15 +335,17 @@ grmiregistry.pod: java/gcj.texi -$(TEXI2POD) -D grmiregistry < $< > $@ gcj-dbtool.pod: java/gcj.texi -$(TEXI2POD) -D gcj-dbtool < $< > $@ +gc-analyze.pod: java/gcj.texi + -$(TEXI2POD) -D gc-analyze < $< > $@ # Install the man pages. java.install-man: installdirs \ $(DESTDIR)$(man1dir)/$(JAVA_INSTALL_NAME)$(man1ext) \ $(JAVA_TARGET_INDEPENDENT_BIN_TOOLS:%=doc/%.1) \ doc/gij.1 doc/jv-convert.1 doc/grmic.1 doc/grmiregistry.1 \ - doc/gcj-dbtool.1 + doc/gcj-dbtool.1 doc/gc-analyze.1 for tool in $(JAVA_TARGET_INDEPENDENT_BIN_TOOLS) \ - gij jv-convert grmic grmiregistry gcj-dbtool ; do \ + gij jv-convert grmic grmiregistry gcj-dbtool gc-analyze ; do \ tool_transformed_name=`echo $$tool|sed '$(program_transform_name)'`; \ man_name=$(DESTDIR)$(man1dir)/$${tool_transformed_name}$(man1ext); \ rm -f $$man_name ; \ diff --git a/gcc/java/gcj.texi b/gcc/java/gcj.texi index aa86ba489ea..8bd9d5bcfb6 100644 --- a/gcc/java/gcj.texi +++ b/gcc/java/gcj.texi @@ -17,7 +17,7 @@ @c the word ``Java'. @c When this manual is copyrighted. -@set copyrights-gcj 2001, 2002, 2003, 2004, 2005 +@set copyrights-gcj 2001, 2002, 2003, 2004, 2005, 2006, 2007 @c Versions @set which-gcj GCC-@value{version-GCC} @@ -79,6 +79,8 @@ man page gfdl(7). Generate stubs for Remote Method Invocation. * grmiregistry: (gcj)Invoking grmiregistry. The remote object registry. +* gc-analyze: (gcj)Invoking gc-analyze. + Analyze Garbage Collector (GC) memory dumps. @end direntry @end format @@ -125,6 +127,7 @@ files and object files, and it can read both Java source code and * Invoking jv-convert:: Converting from one encoding to another * Invoking grmic:: Generate stubs for Remote Method Invocation. * Invoking grmiregistry:: The remote object registry. +* Invoking gc-analyze:: Analyze Garbage Collector (GC) memory dumps. * About CNI:: Description of the Compiled Native Interface * System properties:: Modifying runtime behavior of the libgcj library * Resources:: Where to look for more information @@ -1412,6 +1415,89 @@ Print version information, then exit. @c man end +@node Invoking gc-analyze +@chapter Invoking gc-analyze + +@c man title gc-analyze Analyze Garbage Collector (GC) memory dumps + +@c man begin SYNOPSIS gc-analyze +@command{gc-analyze} [@option{OPTION}] @dots{} [@var{file}] +@ignore + [@option{-v}] + [@option{--verbose}] + [@option{-p} @var{tool-prefix}] + [@option{-d} @var{directory}] + [@option{--version}] + [@option{--help}] +@end ignore +@c man end + +@c man begin DESCRIPTION gc-analyze + +@command{gc-analyze} prints an analysis of a GC memory dump to +standard out. + +The memory dumps may be created by calling +@code{gnu.gcj.util.GCInfo.enumerate(String namePrefix)} from java +code. A memory dump will be created on an out of memory condition if +@code{gnu.gcj.util.GCInfo.setOOMDump(String namePrefix)} is called +before the out of memory occurs. + +Running this program will create two files: @file{TestDump001} and +@file{TestDump001.bytes}. + +@example +import gnu.gcj.util.*; +import java.util.*; + +public class GCDumpTest +@{ + static public void main(String args[]) + @{ + ArrayList l = new ArrayList(1000); + + for (int i = 1; i < 1500; i++) @{ + l.add("This is string #" + i); + @} + GCInfo.enumerate("TestDump"); + @} +@} +@end example + +The memory dump may then be displayed by running: + +@example +gc-analyze -v TestDump001 +@end example + +@c FIXME: Add real information here. +@c This really isn't much more than the --help output. + +@c man end + +@c man begin OPTIONS gc-analyze + +@table @gcctabopt +@item --verbose +@itemx -v +Verbose output. + +@item -p @var{tool-prefix} +Prefix added to the names of the @command{nm} and @command{readelf} commands. + +@item -d @var{directory} +Directory that contains the executable and shared libraries used when +the dump was generated. + +@item --help +Print a help message, then exit. + +@item --version +Print version information, then exit. +@end table + +@c man end + @node About CNI @chapter About CNI diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 6eeacf03ce4..9d4406f32fe 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,59 @@ +2007-02-15 Johannes Schmidt + David Daney + + * configure.ac: Create vm-tools-packages file. Add + gnu/gcj/tools/gc_analyze to standard.omit and vm-tools-packages. + Check for /proc/self/maps. + * Makefile.am (bin_PROGRAMS): Added gc-analyze. + (gc_analyze_SOURCES): New. + (gc_analyze_LDFLAGS): New. + (gc_analyze_LINK): New. + (gc_analyze_LDADD): New. + (gc_analyze_DEPENDENCIES): New. + (nat_source_files): Add gnu/gcj/util/natGCInfo.cc. + * Makefile.in: Regenerated. + * configure: Regenerated. + * include/config.h.in: Regenerated. + * sources.am: Regenerated. + * scripts/makemake.tcl: Don't include gc-analyze classes in libgcj. + * gnu/gcj/tools/gc_analyze/SymbolLookup.java: New. + * gnu/gcj/tools/gc_analyze/ObjectMap.java: New. + * gnu/gcj/tools/gc_analyze/MemoryMap.java: New. + * gnu/gcj/tools/gc_analyze/SymbolTable.java: New. + * gnu/gcj/tools/gc_analyze/BlockMap.java: New. + * gnu/gcj/tools/gc_analyze/BytePtr.java: New. + * gnu/gcj/tools/gc_analyze/ItemList.java: New. + * gnu/gcj/tools/gc_analyze/ToolPrefix.java: New. + * gnu/gcj/tools/gc_analyze/MemoryAnalyze.java: New. + * gnu/gcj/util/GCInfo.java: New. + * gnu/gcj/util/GCInfo.h: New. + * gnu/gcj/util/natGCInfo.cc: New. + * gnu/gcj/util/UtilPermission.java: New. + * gnu/gcj/util/UtilPermission.h: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/SymbolTable.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/ObjectMap$ObjectItem.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryMap$RangeComparator.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/BlockMap$PtrMarks.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryMap$Range.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/BlockMap.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/BytePtr.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$SubstringComparator.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/ItemList.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/ToolPrefix.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$1$Info.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$1.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$2.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$3.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$4.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryAnalyze$OptionParser.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/BlockMap$SizeKind.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/SymbolLookup.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/ObjectMap.class: New. + * classpath/tools/gnu/gcj/tools/gc_analyze/MemoryMap.class: New. + * classpath/lib/gnu/gcj/util/GCInfo.class: New. + * classpath/lib/gnu/gcj/util/UtilPermission.class: New. + 2007-02-15 David Daney * gnu/java/net/PlainSocketImpl.h: Regenerate. diff --git a/libjava/Makefile.am b/libjava/Makefile.am index 9841f60c4af..7c700e10929 100644 --- a/libjava/Makefile.am +++ b/libjava/Makefile.am @@ -73,7 +73,7 @@ db_pathtail = gcj-$(gcc_version)/$(db_name) if NATIVE bin_PROGRAMS = jv-convert gij grmic grmiregistry gcj-dbtool \ gappletviewer gjarsigner gkeytool gjar gjavah gnative2ascii \ - gorbd grmid gserialver gtnameserv + gorbd grmid gserialver gtnameserv gc-analyze ## It is convenient to actually build and install the default database ## when gcj-dbtool is available. @@ -647,6 +647,20 @@ gcj_dbtool_LDADD = gnu/gcj/tools/gcj_dbtool.lo -L$(here)/.libs libgcj.la ## linking this program. gcj_dbtool_DEPENDENCIES = gnu/gcj/tools/gcj_dbtool.lo libgcj.la libgcj.spec +gc_analyze_SOURCES = + +## We need -nodefaultlibs because we want to avoid gcj's `-lgcj'. We +## need this because we are explicitly using libtool to link using the +## `.la' file. +gc_analyze_LDFLAGS = --main=gnu.gcj.tools.gc_analyze.MemoryAnalyze \ + -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) +gc_analyze_LINK = $(GCJLINK) +## See jv_convert_LDADD. +gc_analyze_LDADD = -L$(here)/.libs libgcj-tools.la libgcj.la +## Depend on the spec file to make sure it is up to date before +## linking this program. +gc_analyze_DEPENDENCIES = libgcj-tools.la libgcj.la libgcj.spec + gij_SOURCES = ## We need -nodefaultlibs because we want to avoid gcj's `-lgcj'. We ## need this because we are explicitly using libtool to link using the @@ -831,6 +845,7 @@ gnu/gcj/runtime/natSharedLibLoader.cc \ gnu/gcj/runtime/natSystemClassLoader.cc \ gnu/gcj/runtime/natStringBuffer.cc \ gnu/gcj/util/natDebug.cc \ +gnu/gcj/util/natGCInfo.cc \ gnu/java/lang/natMainThread.cc \ gnu/java/lang/management/natVMClassLoadingMXBeanImpl.cc \ gnu/java/lang/management/natVMCompilationMXBeanImpl.cc \ diff --git a/libjava/Makefile.in b/libjava/Makefile.in index 5411f07d6cc..b7cfb00aab7 100644 --- a/libjava/Makefile.in +++ b/libjava/Makefile.in @@ -51,7 +51,7 @@ target_triplet = @target@ @NATIVE_TRUE@ gjar$(EXEEXT) gjavah$(EXEEXT) \ @NATIVE_TRUE@ gnative2ascii$(EXEEXT) gorbd$(EXEEXT) \ @NATIVE_TRUE@ grmid$(EXEEXT) gserialver$(EXEEXT) \ -@NATIVE_TRUE@ gtnameserv$(EXEEXT) +@NATIVE_TRUE@ gtnameserv$(EXEEXT) gc-analyze$(EXEEXT) @BUILD_ECJ1_TRUE@libexecsub_PROGRAMS = ecjx$(EXEEXT) @ANONVERSCRIPT_TRUE@am__append_5 = -Wl,--version-script=$(srcdir)/libgcj.ver @USING_GCC_TRUE@am__append_6 = $(WARNINGS) @@ -305,7 +305,7 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc jvmti.cc exception.cc \ gnu/gcj/runtime/natSharedLibLoader.cc \ gnu/gcj/runtime/natSystemClassLoader.cc \ gnu/gcj/runtime/natStringBuffer.cc gnu/gcj/util/natDebug.cc \ - gnu/java/lang/natMainThread.cc \ + gnu/gcj/util/natGCInfo.cc gnu/java/lang/natMainThread.cc \ gnu/java/lang/management/natVMClassLoadingMXBeanImpl.cc \ gnu/java/lang/management/natVMCompilationMXBeanImpl.cc \ gnu/java/lang/management/natVMGarbageCollectorMXBeanImpl.cc \ @@ -368,7 +368,7 @@ am__objects_2 = gnu/classpath/jdwp/natVMFrame.lo \ gnu/gcj/runtime/natSharedLibLoader.lo \ gnu/gcj/runtime/natSystemClassLoader.lo \ gnu/gcj/runtime/natStringBuffer.lo gnu/gcj/util/natDebug.lo \ - gnu/java/lang/natMainThread.lo \ + gnu/gcj/util/natGCInfo.lo gnu/java/lang/natMainThread.lo \ gnu/java/lang/management/natVMClassLoadingMXBeanImpl.lo \ gnu/java/lang/management/natVMCompilationMXBeanImpl.lo \ gnu/java/lang/management/natVMGarbageCollectorMXBeanImpl.lo \ @@ -438,6 +438,8 @@ am_ecjx_OBJECTS = ecjx_OBJECTS = $(am_ecjx_OBJECTS) am_gappletviewer_OBJECTS = gappletviewer_OBJECTS = $(am_gappletviewer_OBJECTS) +am_gc_analyze_OBJECTS = +gc_analyze_OBJECTS = $(am_gc_analyze_OBJECTS) am_gcj_dbtool_OBJECTS = gnu/gcj/tools/gcj_dbtool/natMain.$(OBJEXT) gcj_dbtool_OBJECTS = $(am_gcj_dbtool_OBJECTS) am__gen_from_JIS_SOURCES_DIST = gnu/gcj/convert/gen-from-JIS.c \ @@ -501,23 +503,23 @@ SOURCES = $(lib_gnu_awt_xlib_la_SOURCES) $(libgcj_tools_la_SOURCES) \ $(libgcj_la_SOURCES) $(EXTRA_libgcj_la_SOURCES) \ $(libgcj_bc_la_SOURCES) $(libgij_la_SOURCES) \ $(libjvm_la_SOURCES) $(ecjx_SOURCES) $(gappletviewer_SOURCES) \ - $(gcj_dbtool_SOURCES) $(gen_from_JIS_SOURCES) $(gij_SOURCES) \ - $(gjar_SOURCES) $(gjarsigner_SOURCES) $(gjavah_SOURCES) \ - $(gkeytool_SOURCES) $(gnative2ascii_SOURCES) $(gorbd_SOURCES) \ - $(grmic_SOURCES) $(grmid_SOURCES) $(grmiregistry_SOURCES) \ - $(gserialver_SOURCES) $(gtnameserv_SOURCES) \ - $(jv_convert_SOURCES) + $(gc_analyze_SOURCES) $(gcj_dbtool_SOURCES) \ + $(gen_from_JIS_SOURCES) $(gij_SOURCES) $(gjar_SOURCES) \ + $(gjarsigner_SOURCES) $(gjavah_SOURCES) $(gkeytool_SOURCES) \ + $(gnative2ascii_SOURCES) $(gorbd_SOURCES) $(grmic_SOURCES) \ + $(grmid_SOURCES) $(grmiregistry_SOURCES) $(gserialver_SOURCES) \ + $(gtnameserv_SOURCES) $(jv_convert_SOURCES) DIST_SOURCES = $(lib_gnu_awt_xlib_la_SOURCES) \ $(libgcj_tools_la_SOURCES) $(am__libgcj_la_SOURCES_DIST) \ $(EXTRA_libgcj_la_SOURCES) $(libgcj_bc_la_SOURCES) \ $(libgij_la_SOURCES) $(libjvm_la_SOURCES) $(ecjx_SOURCES) \ - $(gappletviewer_SOURCES) $(gcj_dbtool_SOURCES) \ - $(am__gen_from_JIS_SOURCES_DIST) $(gij_SOURCES) \ - $(gjar_SOURCES) $(gjarsigner_SOURCES) $(gjavah_SOURCES) \ - $(gkeytool_SOURCES) $(gnative2ascii_SOURCES) $(gorbd_SOURCES) \ - $(grmic_SOURCES) $(grmid_SOURCES) $(grmiregistry_SOURCES) \ - $(gserialver_SOURCES) $(gtnameserv_SOURCES) \ - $(jv_convert_SOURCES) + $(gappletviewer_SOURCES) $(gc_analyze_SOURCES) \ + $(gcj_dbtool_SOURCES) $(am__gen_from_JIS_SOURCES_DIST) \ + $(gij_SOURCES) $(gjar_SOURCES) $(gjarsigner_SOURCES) \ + $(gjavah_SOURCES) $(gkeytool_SOURCES) $(gnative2ascii_SOURCES) \ + $(gorbd_SOURCES) $(grmic_SOURCES) $(grmid_SOURCES) \ + $(grmiregistry_SOURCES) $(gserialver_SOURCES) \ + $(gtnameserv_SOURCES) $(jv_convert_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ @@ -1344,7 +1346,9 @@ gnu/gcj/tools/gcj_dbtool/Main.java gnu_gcj_tools_gcj_dbtool_header_files = $(patsubst %.java,%.h,$(gnu_gcj_tools_gcj_dbtool_source_files)) gnu_gcj_util_source_files = \ -gnu/gcj/util/Debug.java +gnu/gcj/util/Debug.java \ +gnu/gcj/util/GCInfo.java \ +gnu/gcj/util/UtilPermission.java gnu_gcj_util_header_files = $(patsubst %.java,%.h,$(gnu_gcj_util_source_files)) gnu_gcj_xlib_source_files = \ @@ -7818,6 +7822,13 @@ gcj_dbtool_LDFLAGS = --main=gnu.gcj.tools.gcj_dbtool.Main \ gcj_dbtool_LINK = $(GCJLINK) gcj_dbtool_LDADD = gnu/gcj/tools/gcj_dbtool.lo -L$(here)/.libs libgcj.la gcj_dbtool_DEPENDENCIES = gnu/gcj/tools/gcj_dbtool.lo libgcj.la libgcj.spec +gc_analyze_SOURCES = +gc_analyze_LDFLAGS = --main=gnu.gcj.tools.gc_analyze.MemoryAnalyze \ + -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) + +gc_analyze_LINK = $(GCJLINK) +gc_analyze_LDADD = -L$(here)/.libs libgcj-tools.la libgcj.la +gc_analyze_DEPENDENCIES = libgcj-tools.la libgcj.la libgcj.spec gij_SOURCES = gij_LDFLAGS = -rpath $(libdir)/gcj-$(gcc_version) -rpath $(toolexeclibdir) \ -shared-libgcc $(THREADLDFLAGS) @@ -7947,6 +7958,7 @@ gnu/gcj/runtime/natSharedLibLoader.cc \ gnu/gcj/runtime/natSystemClassLoader.cc \ gnu/gcj/runtime/natStringBuffer.cc \ gnu/gcj/util/natDebug.cc \ +gnu/gcj/util/natGCInfo.cc \ gnu/java/lang/natMainThread.cc \ gnu/java/lang/management/natVMClassLoadingMXBeanImpl.cc \ gnu/java/lang/management/natVMCompilationMXBeanImpl.cc \ @@ -8360,6 +8372,8 @@ gnu/gcj/util/$(DEPDIR)/$(am__dirstamp): @: > gnu/gcj/util/$(DEPDIR)/$(am__dirstamp) gnu/gcj/util/natDebug.lo: gnu/gcj/util/$(am__dirstamp) \ gnu/gcj/util/$(DEPDIR)/$(am__dirstamp) +gnu/gcj/util/natGCInfo.lo: gnu/gcj/util/$(am__dirstamp) \ + gnu/gcj/util/$(DEPDIR)/$(am__dirstamp) gnu/java/lang/$(am__dirstamp): @$(mkdir_p) gnu/java/lang @: > gnu/java/lang/$(am__dirstamp) @@ -8694,6 +8708,9 @@ ecjx$(EXEEXT): $(ecjx_OBJECTS) $(ecjx_DEPENDENCIES) gappletviewer$(EXEEXT): $(gappletviewer_OBJECTS) $(gappletviewer_DEPENDENCIES) @rm -f gappletviewer$(EXEEXT) $(gappletviewer_LINK) $(gappletviewer_LDFLAGS) $(gappletviewer_OBJECTS) $(gappletviewer_LDADD) $(LIBS) +gc-analyze$(EXEEXT): $(gc_analyze_OBJECTS) $(gc_analyze_DEPENDENCIES) + @rm -f gc-analyze$(EXEEXT) + $(gc_analyze_LINK) $(gc_analyze_LDFLAGS) $(gc_analyze_OBJECTS) $(gc_analyze_LDADD) $(LIBS) gnu/gcj/tools/gcj_dbtool/$(am__dirstamp): @$(mkdir_p) gnu/gcj/tools/gcj_dbtool @: > gnu/gcj/tools/gcj_dbtool/$(am__dirstamp) @@ -8826,6 +8843,8 @@ mostlyclean-compile: -rm -f gnu/gcj/tools/gcj_dbtool/natMain.$(OBJEXT) -rm -f gnu/gcj/util/natDebug.$(OBJEXT) -rm -f gnu/gcj/util/natDebug.lo + -rm -f gnu/gcj/util/natGCInfo.$(OBJEXT) + -rm -f gnu/gcj/util/natGCInfo.lo -rm -f gnu/gcj/xlib/lib_gnu_awt_xlib_la-natClip.$(OBJEXT) -rm -f gnu/gcj/xlib/lib_gnu_awt_xlib_la-natClip.lo -rm -f gnu/gcj/xlib/lib_gnu_awt_xlib_la-natColormap.$(OBJEXT) @@ -9035,6 +9054,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@gnu/gcj/runtime/$(DEPDIR)/natSystemClassLoader.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gnu/gcj/tools/gcj_dbtool/$(DEPDIR)/natMain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gnu/gcj/util/$(DEPDIR)/natDebug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gnu/gcj/util/$(DEPDIR)/natGCInfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gnu/gcj/xlib/$(DEPDIR)/lib_gnu_awt_xlib_la-natClip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gnu/gcj/xlib/$(DEPDIR)/lib_gnu_awt_xlib_la-natColormap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gnu/gcj/xlib/$(DEPDIR)/lib_gnu_awt_xlib_la-natDisplay.Plo@am__quote@ diff --git a/libjava/classpath/ChangeLog.gcj b/libjava/classpath/ChangeLog.gcj index e4a71a829a5..c147ab6a7a8 100644 --- a/libjava/classpath/ChangeLog.gcj +++ b/libjava/classpath/ChangeLog.gcj @@ -1,3 +1,8 @@ +2007-02-15 David Daney + + * tools/Makefile.am (TOOLS_ZIP): Add classes from vm-tools-packages. + * tools/Makefile.in: Regenerated. + 2007-02-15 Gary Benson * javax/management/AttributeList.java: Updated. diff --git a/libjava/classpath/lib/gnu/gcj/util/GCInfo.class b/libjava/classpath/lib/gnu/gcj/util/GCInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..e07bb933213793525f941ff3dc138bf32eafc68f GIT binary patch literal 1043 zcmZ{iU2hUW6o%h{g{8~dB9&T-_4|WG?Y34;EXJD}t9C0*P!cbf?Q}cHF3o-z`?I{U zL=!K)@JAWX0AYcYn>lmN%z4gx=FH!JKYs(*!gCcVhGo}}P1os|aU{Ct-tIg9xTiv4 zD0J+vw%N6P*KD*q+=&>nFNH6nR}AT@(PB_`dq-SD8Vfoy$TBQh!sj1iug!yxcDu_N zidN6DyDd8q(jNtt=tP7JCF_FHb)q;Y-1&0I15bpZ==mB7D5|(TC8>E9M%>e}j4M>d z8}v51>e*$@zpB%4W90x_gQkF-q|neL6=NRh%cFx->O ztlT}&QI+yC@@SK;__jBgz=WKkScV1e#~u&th{nh8SjUFU)W%Ut*JS!(z>mc@azY+8 z8V9dOMW5){mI?VJEHj$DIB@tIAqSry{-h0A9Ji=Qn*JP+LrQ)X@>TM-$uhE;+BtIH zX_JCRt40>omO_Ki(@q~=B713YN)3+y7TuA6l|GjCYkyFv{X*$;@#;CsKX5G}7U>?a zN^6-UtkEzlW3qxG3A|0`2JTRNC~b$VBQg*(#G~;Hc$@QhTeH0P#M>vHbs>+YM?8k7w5IUvKhaOa^#A|> literal 0 HcmV?d00001 diff --git a/libjava/classpath/lib/gnu/gcj/util/UtilPermission.class b/libjava/classpath/lib/gnu/gcj/util/UtilPermission.class new file mode 100644 index 0000000000000000000000000000000000000000..f7d9dadb63ee445f9213a5a2f1f59ddfe2646fda GIT binary patch literal 367 zcmaJ+O-sZu6r9xBYF%CJq8IVt%?~i_d1Vg@o{9*od(XyD-_oX#q=G-oliOTCnBpi15`+!$Ar_te-FvB1GnJu2yqZXJau zd7(V%ABjM6PL{${VE3r#rIoU!oCQa=oE*;u;>+gVWLUxa0INs@h6P!3-PQ}^Zq=eP z0(sGBRn3*7j(;EH@IapPi+>tU*xstTxA+q-kj&zg$msXy&N@8~A-Gxh1P|9^ tOqop)@c_xm=?m7Ld5e%SX8kp1

+h_r6pZV3Qf^v4vspwaqNT&L?;nRvrKV literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/Makefile.am b/libjava/classpath/tools/Makefile.am index f47191cfdbb..8ba984bb314 100755 --- a/libjava/classpath/tools/Makefile.am +++ b/libjava/classpath/tools/Makefile.am @@ -155,12 +155,19 @@ $(TOOLS_ZIP): $(TOOLS_JAVA_FILES) ## mkdir classes asm find $(srcdir)/external/asm -name '*.java' -print > asm.lst find $(srcdir)/gnu/classpath/tools -name '*.java' -print > classes.lst - cat classes.lst asm.lst > all-classes.lst + if [ -f $(top_builddir)/../vm-tools-packages ]; then \ + for pkg in `cat $(top_builddir)/../vm-tools-packages`; do \ + $(FIND) $(top_srcdir)/../$$pkg -follow -name '*.java' -print >> vm-tools.lst; \ + done \ + else \ + echo -n > vm-tools.lst; \ + fi + cat classes.lst asm.lst vm-tools.lst > all-classes.lst if JAVA_MAINTAINER_MODE ## Compile ASM separately as it is latin-1 encoded. AC=`echo $(JCOMPILER) | sed -e 's/UTF-8/ISO-8859-1/g'`; \ $$AC -g -w -d $(srcdir)/asm @asm.lst - $(JCOMPILER) -g -w -d $(srcdir)/classes @classes.lst + $(JCOMPILER) -g -w -d $(srcdir)/classes @classes.lst @vm-tools.lst ## Copy over tools resource files. @list=`cd $(top_srcdir)/resource && find gnu/classpath/tools -name \*.properties -print`; \ for p in $$list; do \ diff --git a/libjava/classpath/tools/Makefile.in b/libjava/classpath/tools/Makefile.in index cb0525f49fd..960dc6e0035 100644 --- a/libjava/classpath/tools/Makefile.in +++ b/libjava/classpath/tools/Makefile.in @@ -1079,10 +1079,17 @@ dist-hook: $(TOOLS_ZIP): $(TOOLS_JAVA_FILES) find $(srcdir)/external/asm -name '*.java' -print > asm.lst find $(srcdir)/gnu/classpath/tools -name '*.java' -print > classes.lst - cat classes.lst asm.lst > all-classes.lst + if [ -f $(top_builddir)/../vm-tools-packages ]; then \ + for pkg in `cat $(top_builddir)/../vm-tools-packages`; do \ + $(FIND) $(top_srcdir)/../$$pkg -follow -name '*.java' -print >> vm-tools.lst; \ + done \ + else \ + echo -n > vm-tools.lst; \ + fi + cat classes.lst asm.lst vm-tools.lst > all-classes.lst @JAVA_MAINTAINER_MODE_TRUE@ AC=`echo $(JCOMPILER) | sed -e 's/UTF-8/ISO-8859-1/g'`; \ @JAVA_MAINTAINER_MODE_TRUE@ $$AC -g -w -d $(srcdir)/asm @asm.lst -@JAVA_MAINTAINER_MODE_TRUE@ $(JCOMPILER) -g -w -d $(srcdir)/classes @classes.lst +@JAVA_MAINTAINER_MODE_TRUE@ $(JCOMPILER) -g -w -d $(srcdir)/classes @classes.lst @vm-tools.lst @JAVA_MAINTAINER_MODE_TRUE@ @list=`cd $(top_srcdir)/resource && find gnu/classpath/tools -name \*.properties -print`; \ @JAVA_MAINTAINER_MODE_TRUE@ for p in $$list; do \ @JAVA_MAINTAINER_MODE_TRUE@ dirname=classes/`dirname $$p`; \ diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/BlockMap$PtrMarks.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/BlockMap$PtrMarks.class new file mode 100644 index 0000000000000000000000000000000000000000..59094b9c9b8f9b9e9e3dedfa94c553d4200dca89 GIT binary patch literal 612 zcma)4%TB^T6g>mwRf|@%z8?@-Ks6NIYFtQS0s%GAuq8vCV4<|6EhhR`E{KT>KfsSN z-f6@wE_&zQnKSp?b2?w&AD;kDQOY2}U=F;gHL!vTuIwU`=|)pfx>D1Pzym zp&&C48A=PCVaU$yN0C${>DS4RL{Ws41n9byPZc>&@->Qis(OS>(Q25-Gc23$(9Plu zYo?*hV7$>m0-F>IP$-@ev_@^}Sf;nJMLWfq$iOyssG>G8X(G-ftwQ&AsY+lE`?RVt I{Q=#>4I5Sv3sTjQ!_^#;DC*F0 zT_D*s2I^%;hlY%@Zs^D&Be30bedqP;Waxy43+}~UU`uZxLs$9BU`o*!c(j?!g=(B4 zYsZ>6hk<}~i9y!229*;-5^na^3NLhT8{HfSxT|9i6@gqon1#0U!d1HGSG#+xss!|| z?>k|~lTqYE8XmB0qxu4w)#5op-yQpMIt$r+@Gq6WBJ1_<|BpxqZPYkTlIIFh3lx9Gh^0xABN%+?&+<~Lk3_vZ8}bCf?bp1@7s#W<(RzPs#JVdWj% zV!RgPlyIAI^()1giP%!83X9S%v5weHy;aRGD7AP#A-^(5=d{WUmPhAIS-@_^?dzo7 zzz*)mkmW^-3&<*|>_QZt5vaNZGL}GDv-K0=D{AYOX{LZju~%G@xEEV>LVybKTOrUx J+RZp_`~kzQ-0A=T literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/BlockMap.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/BlockMap.class new file mode 100644 index 0000000000000000000000000000000000000000..b29214c02901feacd083e09054bd5cfb351af603 GIT binary patch literal 5408 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 literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/BytePtr.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/BytePtr.class new file mode 100644 index 0000000000000000000000000000000000000000..c5a812e90bf3c38c8dc315ac3334a281ea3c29b2 GIT binary patch literal 2466 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 literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$1$Info.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$1$Info.class new file mode 100644 index 0000000000000000000000000000000000000000..687e94d388cc8a68218f26c48d482cca823758e5 GIT binary patch literal 510 zcmb7B%Sr<=6g_FD9UVtotJc@XMUhs}q3enuMWHa&MWq`Tl1}58k|r<@q5Udd2`>Bq zKT5naEr>f^V!XYPjMZ3x1)&&5(X=lbHTuR45h%Nnxyi%)H1nXC^lO|is+iLa8QKn zVg;)V6<=y`lTJq>y5l27*)`t;Tn%|7Grkn9WzvV1ux`2tWl@VnuA` TQ8jFlcb4hfl($3NLLGbGRDyT_ literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$1.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$1.class new file mode 100644 index 0000000000000000000000000000000000000000..9fbf1a59d74ca6452c05f9ed69fb4f52f9564d03 GIT binary patch literal 1109 zcmbVLZEF)j5Pqh)^qMp#G1_RgzSPEgNo=oC{8SYrR1i`vwB&;zvc0UymCJ6pyJ#cm ze-aVF5B>mulsJ3Q(in=tgWH{*duE>5ndg4|{PrC{1DiJH2u@cG-L7}!###pvTd#!@ z!RWnocV%CPqbK82rD4M&tQxczh$tF}xc4VU#(EIDF9xx%6=6Q^`B9}oc+i?L_c(G- zgpmxlIl)6;`SD}IE9bv5G+RgFt#AXOy6%1)`l`DyOB z$a7nqnX?pHzLL*}{X-cZh{HeNsGFxnze zbHc+NE=}KS0&Ybj6H+}5q5`tsbco;>tX20r+(7G3Gr>3c@lEZl#*f7s84dOcL?{- zq@9SboEDgkDq(%LK;}FhN+|3oFVGQ7YFEZR-7#v}Af%jX8(S=-6#rRNEE+YjHOH@w z1@>pydI^jDK)zQ0f^2PNW7+zO+@}Or;5D1zi81d`YaBd>3U2dW UVrv}^mt`(wo)YT3TI{|13$7O)hX4Qo literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$2.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$2.class new file mode 100644 index 0000000000000000000000000000000000000000..5fa44be1b86feeb53fbb73075a28a2f8405d024a GIT binary patch literal 1109 zcmbVLO>fgc5Ph3Cb(4l97#b*)k5W^dgw|~krveg+iiDJwO09B0LTKwOjw@$3vK`cL z;|4zmA%w(%AHa`7%sNmtL=_R1ygNI7GjDe0`Nz+1-vMl4!$gL`@#WCupqrH&F@qj12KQSUvgT#F?NCG7p=8|3z+gl6|+cV}K zNAB||7ST2(cofJWdBX6@`L7JE_A!6U-H=P)JxHQJ`rFfOQ#!cd>}N=@p-g3YCpqrMu( zn+&Wq;h_#&)AyQyG^v>b-PSI{qB9NFO(^V~cp@ELY+{)T{O5>I1M;|u+a_)?te!jR zLz2~gB;EukMXaDod|GH@55qi<{9#|ng!~6;7eY648`YCim0X4C#cqY z3=htwort&33d}@}VQscR;yfG5P~MSVsA7`Tu1I>StJSj3kacPuY?6?&^k=b3MXQOd z4811i$)6|dB@FTdrF!EF3iajnCF3iKpHf_z)Id`yQg8+~ X?$U0NwFZaE(ihT?g$At#dGG%M;Y=R7 literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$3.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$3.class new file mode 100644 index 0000000000000000000000000000000000000000..2c91530397e80931bf752eb197fb75895a654733 GIT binary patch literal 1073 zcmbVL%Wl&^6g`tTb()$a1X?Iipv4r&Ex09ORX{>fk&x1Y)GCWg2u+=l&*4nZ=b&a*v4%W1qLUOnHTscUaC}-koAH~ z9*tfLZ%+(VJbELmBL}r=ez-!Dy?VmgiNWQ1C_L`o62^%e^1*q!QYfJ(2cRPjA8|L(yq=u|-Q#q`!vM>v~hjD$rx1O!z!mM=%Hn zs_w=IRNT##W#c2P_c^adXC>z|;=Dnfe3$sd##uDzt*vu7pL42M#8O_XiVK7pRN*3) z>DwjZY437g@c~)7hm!FLE58?dOT>41p`|hDv``5*D5)OCrr-i@Vx8U%vTo63HuHf9 LAjGB9Aavt9wI>j6 literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$4.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$4.class new file mode 100644 index 0000000000000000000000000000000000000000..125ac72799012c7e6848926cdf16920c5c8e510d GIT binary patch literal 1086 zcmbVL-)|B@5dIb@2wo{t+uHhDu>!5V66+IcLWoV8(AJ2-s1LdvTe!OHk-NPn_~-bb zzM2$GeDDwOk21~zjcw$C^x^hq=Dzu6=DXS7e}4V~P(mqz2t&TDLc8r8+S>DEK-N31 zxa@xv_O9r9e!nvEa$5<+7;J-fBoBff*PW9bp}n5Aw_PbJemm?6rK?=ZCU-tC#C69F zawUdGwJ9s@_q6M&=iCp3UuH-jahW?H?iV5mrDj;D9r7b?huW2P#rJu?<_4O8@yD)m z^;3r3{JBa^q%AZUVpXptl3v4BZ(DUOW-QQ z!*ghD;W}R(eS)Q;4@9_HxGrQ%Y`=#mSH^E z45P@9=ydB;weE$!BSzC@&#c~tffLJ)Qo^sA-4j6qYYeN?4N0k|SBiepGv!DxAkB7# z?szQ=HZ~b%dS>P5M&#fA-(g`w44bqGQMyZ!OvWq*kja|0FcEr^NYVF;WIZ9@;O2^J z16alN0n)`E$b1_D=jluh6G#Po!e#O;N+dWIut;x)C0rR()rrWEFBOkry*|cr?EL`C zl<8r`&zQv*BKbO`T^yy3X^8~)uu8;H+$YKi@+ia_MWfb`JHp~&%b{>0x*Vk4LuCw zRX564t+l-LJSU{pUG8$H@lfRFMa>Hu)5-3{4PV-xyTF4`1RDAnjwwaU;bG`=xw@q; zr02_ga*QFpVml(d>_u*cfn8(RJ!!kPoMPzBWQz=avtC7{u!l}ot&x^v4SN|5ukkw1 zJKU}2Z_2=St22@9R78-%0E7PIu$f6i$9^3e42FZ5xu^9C*aFT6 zDkL`Dn#tXY83jznV-mBf zW*48kX6*&)P({_6ml>v`kXOZdb6Zz0jntRTr4c^{cqD;92`c8~V`fb)KMq@!{;G~^ zY6kR&LS9v<2h{X)wkxhjwXz6q@viQDskQ_@sNHolRpIpDI1hF#mil zo82M2mQVl?<9FQSqpI$7gI;r85zMOFTM$$0G%LHC%%r+~Hp8R}_0r!7 zMn9r1J=KmVM3R15J)*Vxb|+_~H=&n|eN7A+L%-wT23|6b(qjY1ns`08iA*UsSTSFG<3bZNN@85vz?EOgeh=QG=M)C$DJg~sNAUos zu#PMm7^U?XKEpYDjsm{G1zOMIOU&adEYkZnzQz*1!TY4GC-GvAz5;!?PPz2pM!aTN zh_kvx9#mFCx!K(Zc$1Rap0LNWsI0iDRu9u)mV>pj_eFDLK+0G_nu AcK`qY literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$SubstringComparator.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryAnalyze$SubstringComparator.class new file mode 100644 index 0000000000000000000000000000000000000000..238c2583b7149b877512b7ff8662e202f9a78d37 GIT binary patch literal 1269 zcmbVLT~E_s6n@@rY%;4%!1)0aRD`V?Oz;~Bk&uuq+0-yZgfl6a53; zaAP7f@q&2mk1{@QS7k6wj2C_1^Yxx{p68r?|MB$*z%1sIPz2^pr&Tf=%~IgHwohqG zcXWIIol&Y9yRNst+|ed#t-2q0mSe8CyKi+*4_q&axInt8@98C5cg)h$dedkGNhAb@ zLu)Ir?9y?(KwsT3Ek{6<1!9J?Es*q#J;U=2+BO9ei%MRJN!%Bh{I`j43;wW{L|d~=M-N&a zhqBlO=tRe-ma{u9n%&X@#t9_GuaBo97mk09BG)avxoo^+{8XG{)Okua{c+yI+7}FH zBZnB&Mh~fF50UvqyMoI+Gt3A)XXFcJd&!rtFoaE9p;ha=$5o6_W2UgK2qjrr2_;!u zc1Dh)%16{?1ARmMOdbZMe=%1D}2LPkzX6PkK0IuDMVO8(h5H^%`k+l;Y16bcY5D@%O)^ck-Ry?V zrfql&v??kh7PVjnL=4~yO1o)^AjPi_5CsuLRDAGI5K$5J6BYRWXJ&S@p-JIuf4le2 zopbL!=iKx7pSyYDy@wtlqG|jOFS(e`ZIAU-wYP4oO2*^SZuB;XW8rA;WoFe%vooIP zU0^?XNoDeH3-1V5MZ>Z7s#Pu9%+@569_#6BF%wJTiOw({&#bpdlIE^tRYTUB8Yb@! zGtm<7Hko)MlV?sO7D>)yQpziunbg{No9QEk@^s1}A5%enBxc$xG=*EDm{n9CZw*JA z!-7NZBFZA-N|sQ70iw=QC0-YvMIpmC*vG!z#rQkX*RWhA1czQPF z!k$R9%}i)Ci7EJD|76E0I#tnBrkw7cmTpU3&`o*WaB39t={n7znR4>sXpgySD~zo? zOX0Q&)eI|L1yze7%o6#trZ{IL8mgf4bqbN3Xt=A(j6rvkha){@wj*_oEHPK7c{HC% zOUCV`nMS2gF54)uiEZaF-sN~`i?m0Qusg29i6za>E-}v!s#jR+?h3b>Ak6EICz58{ z=7iaW4%32RSgo^H=t)MRRSOb{aBqF2J6V%8SR3!`3MazJc%nvpCZ{pd9t$UX60o<( zM_q5uscg<0eve@(E1Gkto*KNga;W9?c0&s~t)kU1xOfjFEVeg_#H&`ruaZ!&8Sbpn zXbm)0Sy>s>s0qCwx;|>A^~2j&x{{H2OryZXT=X?+x?Rxhfw>(;4_a6+nB08@o?P!`o`57yU=MHZHM7TlBQ)5 z;)sqXS%h`Ycug*KQrt^1Sm+>o>9;y{(WT%mhIsu!(|6p{hj<7XlGKCU#OZBc8{)}n zw>;IhWcQsq?V?^BVMn;T!P*Ehf1|8>xx}~tQ*PVf@!%;bC%V~k9q<-~7i7$7s1o2| zzSfLWKn24)3zI7%;$^)}D*!9-4w*P4xAbcd{TJ^U)XS%U=2t(^y%e6^!99k{xM?U?$^T$trt-PW$LqCN~0;r1tV* z`5A^sFMS2vr~Q3l&(^JG!fab(hLMoG^i?J!{jM(7)#HSZ^y@p)$qb=lNhE4!k@)C# zs`k--x=ZrM*MUeJhXZLA83L$}ZliAqQ6D^PkjUNx@4a*{)A$i}*x1|I5|7r$ zH2NlD{gjs8q}lDGd+6J;>~{te680V{p%ZblQ;ckQKhwAoH?;k6Ww^^n-=zbx!-Gtv zgN%P*2U+isbArRdyM@ts>vn6ogLFWYaagA#0=?X=QNT3W1>xs=L&6Wp%NECyiQZfq zphtB2zC;fV_@`MiyqAtb<_{O3%oYVc*qK9*(hqd{A6kHYw~L|4$Z?%c$cWOFOvv-& zIz2(P5`pD+bKj8>O-1{L7tFX&fZ`sL|PIzz3~iz2qR z6PrsW6VZR8({BYA7J(_-2Ad<{=A>X^AH77ccI32ZwJ>*5#lK}u~^K1b$VA|buLgy_i8gC_8{Z$>)4#( z{m@EX3|U4kudAr@vXYK&Sw3!isE=LjhWoO|CPpB7nl+tsWEt_L#tt9_p~?loWvpLX zUVEx0?8Rz8M{^+z7wGI41~p{a4!fFqnu~M}@F>Bd4tH)r>%ef2a*57o$QgSir^nhg zHsDS{3#kX^2FGb!3cUG_wcCnH$~Tf?yl z$>7#VtSuN8=q$^4xeCRZwSom3mO(KR?|2GQ98cltBG-%$FG_5gYP@{j>7v_^YPoD$ zSzT;v+{ZI1FNbIHY@N>+PjvUev8}J-%Lx3Fu zd(skb)OZsznXTdA+U{_>8EmxbsbEWQ7XJ4#DuU36wmI~K8q+20AXM}5MZ8%&a|<*8 zN3kk#<`$in(lU*~-nbEX$SyA!=xxjhbXIAiF))4U2o!dhKgip3-Y&^lZR_dm!kq-8 zy7H1Ht`XO{i*ZOfQMiPac%i-WishPM!@?|2K=uqy-6h`Fqw@|cfo_L~$iOb0d-*cB zV^Tgh_T%qyjWFCUv=b6sS(qN~R-D`pgvlT8CMOcXfHHD$D;MPRE6JMqolmcbG z1o3Se??rM725pXm$#_WA^+g;d15D2u#(758%#g%c(X8=4WF}{6Y@dw7_ObkJyx+@! z(wWk^Zq?#lt)>O(b^fY#m1bqb#$>p4ds70}5iqK7q8+vp7zUSve}H?`tv0+*8^vjB z02EPb!jvja+X^%;X&DZLdLLLmb0v5x1_n*kg3nA7KB69A4RPz@@xuUD#;(Ad*5V-D zv@oZI!;z*=v|sQ={>ZK)1AZ^XjHG zOV%u2tnpLO44xZSty#ICUgMv@v+=mLp>|b${o>lD1q*TrIHqE-q)xi$?9lchnFePaPb z6{tl)lqd>**Km{;SGLMz;`a5W}s!X?#h1BA3(=N`S|vsCHfetG?og` z(`_R1Qz4!-xuMFNdrjhn#X)^K6Oe3XI9WYw1c*$thn;SJBmwU3%AmUcstm=wAmd ztbjhQ#|$^^#`_Y7>MGikq5lNveRB2b9DNg>Wvx+_MW0O34RcD7Un`YT9P0g*gC|*J zozQYvpX^W%(^+Y8Y40$KZnU`cQXYNI;xdPBqR-nqV z#c#rj4PDImFKIJ=%g~Gdo}z#5qdfH9LGMX&qZKAzu3P!TwLhJgdc_i1MJ#RT-eWQXp~Z2+()B~QAVJ+IK|$ZQ|w!J zeK8jo7Z=|7{u{=q6z8QlzZ%cQMYmI~k>?e4so#~Q-IGDp>hv$F+>XR=(J#K zOY%kfW6oTb(BhM=zSstUniZ%X>7`wB?2ym15kl*s2 zPe|92oj(=e&)~`Op|^zR;%o=HQM^zFt!aafJm^3Y4%1pJGzw2pfhEXImPcwvVTx~- z1+EG37Yt8|Z;^+c0sgY}U`w9S#F>5M3%L>A`PK)JSBgDzJs0q8cCK}8#Sb<_hmgnm zk=u>{;0#bPBK;&>=1-xc$W@Qgdinvi;!?hYP9lFkK{w#GeJ?#lcjLnIK6-`@(6e+5 zcjG7MIeHQo;V2e`hcCs|>(%rh{v7?6Z>M+petM4w=zTs4xb_s<7jQlLGOnWj$SVJh zz5HL+TxW5PtDJLP(^z*^bDnEH7q~XE-(_;4YdaUYcHsF6E_PkdC9Zq;OxJhlr0Xz` zaUJEeT+j2zTrYFb1&&1@9zIXm$JNSyw0H6>v@^FiR;vDXghg@n&1X?7hkB} z$c^fLZc^{%weZ|#^?STdeVo^;&!YVWZ%|+2jq0nsNqvnkR^Q@F)PM74^?eSzbGXGF z;7#rdzR*2`x4O^gcK1T=a4+L+?n^l8?&MB)FUQ>1aol|ucex)z`!HYXKE?_6>zs7| zg?G5$P&HJ%x~4OVu&XCd$LEaguM;sI2eAy|fQ z=R06?F3%DNm-#&N_)h*B2>hPed>7s-u+ka)bs!^^rg)0@ZvF;v*-H1@+{gC--K}@O z#`p4lz*Md77x|m~E#Rc9TvPem{2gHX8(d}lU06&mEOZM$zz2Y!4^SgN2#lNuE1ky& zv2p?I(JMbSksp@m<3kwJai6xw=|yl?E_3s6xt1%%4CTWj-{pRwG(YU}O}WFRLRjaE zd>FkV?D!-f!HfVb^(a4t?@{~+{v_yocw5Xb(>{J!dah|e;a#9EaUE5z=12JZl;e6H zf4(5x`&=*6g%rGn9kAkZ_*E{&bmZSU_-%VNfPahz>GNqcvjY4KnyCSP7EMKfe}-mUfPaprR1jr= ze}SMqI+YdK>n9F^{3TKs@@Huh--N%2`aI3xFVHOBi#x|J!rZ=uUoZFJ*Ogmo8GnW9 zc|Wa!*)+n?n_>1F`7Rv(-T3kC9;-082qsLllW|3hb}A{BLYZb|dh;?p6nM_t`b@7e z)7zNo_26&&44U zCsX{}kZP#MDKEe;H%v5uFN;BtI}u6zFu&R$t>1G8m5a`t+BU#{K%T>!*O5q3^<^-5 z!^&}<18+MzW;_TZbthyY53iT I`0wQUKYdp8WdHyG literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryMap$Range.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryMap$Range.class new file mode 100644 index 0000000000000000000000000000000000000000..72d9ee0a4372a30789f7b517bf9859236d6c0a9e GIT binary patch literal 714 zcma)3%Wl&^6g@W&Cp9K51xgzOeNZ6v0t>;eJOlwGq7)>GvPI)`VjMYRWIIS@$0xCf zkXY~md=%o0TeS-ou$Vb_?%X-&+&jO1|M&^uKJKv7=2JirN>`% zc%Wxlete)l?Y>hc)-5yyD^vAZg(=VB+i0rCrJxz3c>eOR%o7vuv+z-3lJW`P_4Y=BMn5~!F6vnJZ~>lRd6*deWo`7tR3!SH`uq4auhF!2BXq`k|4@+=u?z)FI95x(r z(UVYHGJ$)T&GWH-#hwM7v+3QljSIZj#^}7Cs-nzuA2;~I jO8dCU$ad&sllD&PwwQBhb({Gbc5sX6vR<%@J81s_+|h$* literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryMap$RangeComparator.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryMap$RangeComparator.class new file mode 100644 index 0000000000000000000000000000000000000000..4355000f58d47085c890a87e22d37c3dd167f36f GIT binary patch literal 1064 zcmb7CTWb?R6#mX`l5Ns$o2Ky=wbmN#=F+Y$MFJ@W2?&w2f-UW1nWRJ9u-Pq}U7`L6 zpYr16C*(yC1s}v`f0TG;Q!S(q#)p|X=bLl+&dm4o*SGHgHc>L55w^NsWOq9~JM?{b zz}AWIgnRx*+IzC^2j_d@toTxRUD@#aXCe@x9~ejwvOV!y*e>7LFWNoX2@RwO`528t z$F(ox38@{&bHZJMZk3J*iH3hFGte<>!oUn+q2+jTKkBz-a46cYB;;CtN4Q5KaFl-m zCc;Af6jG+(TOME;>Xt173$MRmYQiS;hKRw!J3w#iR-w*?;^cZ0zJ=waLYs% zi>lUb6L-{YvMsxgN6>;zLV0>dDr1YVX0;|it9}(JH3^vmKMFeXnWMg7{;vQwR64c7Y2&z+DDA${O)6Hyp5SrJ zV`bdyf(KB;T`b4kYPiRimVL_H)ToNvI!CKf=gO5ISgP`3K9>#015#XA<1iifdDpOt R2Yf2s5sFM>25T{H{Ra881Oos7 literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryMap.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/MemoryMap.class new file mode 100644 index 0000000000000000000000000000000000000000..2646141081abfb17992fc9a605104129f18945fe GIT binary patch literal 7398 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 Wg-kzx3yJP>%00l74)8Y&-~R%pZWSB= literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/ObjectMap$ObjectItem.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/ObjectMap$ObjectItem.class new file mode 100644 index 0000000000000000000000000000000000000000..4a27d3fd48f587b913298d164d1cac417e68de76 GIT binary patch literal 894 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 literal 0 HcmV?d00001 diff --git a/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/SymbolTable.class b/libjava/classpath/tools/classes/gnu/gcj/tools/gc_analyze/SymbolTable.class new file mode 100644 index 0000000000000000000000000000000000000000..49e0bbb8bfcbe7711c9677c03f1ff0fca9638005 GIT binary patch literal 5725 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 z zA#aVMbU&hWl9LNR#!ooPC$_KKyf<-GQlA+xy}ut*0=}P_&hHB-ffU|wg;My{5Po+= z9N{sG{TP$QPO`oh=iz#jt!k0MAE~kocJ?F|3y~mHZmzv5V<&~Tj^i(ET?X*X+~fF{ zV565?Uv^yNafH3};?e4T({9>`Pyj9&QEy34dOp7|W>b$5MZu9ku25 ztwJ%5*}|XamgnCnP;5m;?harj@5q?%$0Cj_wHak*oD_;e^R{B%PNOh#dG2w+{|-8E zx<)3zTr&Z#qsG7u42<0jlN;&MH_?4>Mi*{D61Nhk+xWP;6?-_pgB|-r*vBB)&$jq> zJjL$|oWI2Tr}$)%Ni#sx5H;ITC$mAHB>cp54xb3popQxhn^-J-3EAB``H5-c#u+auv)!gqi#-e*nyw{sQl`F1Z-G zs%CeNm?}Nt(CJgt4#>@AWhpV^Af}ZS%u9)x%zK4pCK)-|oqL++ryay7`_3Eo_fC3p zbH;^QSQ)?vm4bf8 z9z{DIUDR$`PYL z1ejl}h}^@u1iwnU?DQc)h3C;B8_Q1;>m%i9pPO24yIf(po4GdQV~yn*O(&bqe~dg+ zjKM+beVp!cf|?CG;H`(yzO+&oQ4@?q6sF%mZ9-! zs0kQJd;lNHcxQG=LHJ>ROy}M?_uPBWp5K3d{sORoB@HQt>9*gs+s>XH1%Y=!w~yTC z-sdmE-k`+0Q0%y$H1shH@9{%!d)#l^Ypp%uL=1+ki6IQRW)H9)g|6Rj5Te7Q-E)M# zi)}uKGc3e-a1mP;*rzR!q>MqqdZU|kCaS10WO=6}{B4H0>!4TGO~!6WidhqLm}k(VAf{%>Th|U$ zMA<+Q3nm_7kydiJ|6XuvN}v0Ke0gl*iKNonB8sKfrSQH|ozd=tmsKVMtq0xE5mIxq zL(h`)QfN$(SJGtW6m)4Fy6Mt5^q;1iu3TkMv`9Gl8^{fO#|?Q5eWfskn{*B;iUJW7 zVNjG)FY=X~M1|)Bk|I+(MZQ;R5D3Vl52LEgRDCiOjZt1l0k;!^Bchksw`VABond_I z8-{*h;uQC5Czv@w{S0CqwuP}oZSa^fFnr<|n08f=dUMQ}{U)|{AEdT%j literal 0 HcmV?d00001 diff --git a/libjava/configure b/libjava/configure index da281d1b5aa..04449d535e1 100755 --- a/libjava/configure +++ b/libjava/configure @@ -5087,6 +5087,12 @@ if test "$use_x_awt" != yes; then echo gnu/java/awt/peer/x >> standard.omit fi +# Tools that need to be compiled against classpath's tools classes +for package in gnu/gcj/tools/gc_analyze ; do + echo $package >> standard.omit + echo $package >> vm-tools-packages +done + if test -z "${with_multisubdir}"; then builddotdot=. else @@ -6024,7 +6030,7 @@ test x"$pic_mode" = xno && libtool_flags="$libtool_flags --prefer-non-pic" case $host in *-*-irix6*) # Find out which ABI we are using. - echo '#line 6027 "configure"' > conftest.$ac_ext + echo '#line 6033 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -7066,7 +7072,7 @@ if test "${enable_sjlj_exceptions+set}" = set; then : else cat > conftest.$ac_ext << EOF -#line 7069 "configure" +#line 7075 "configure" struct S { ~S(); }; void bar(); void foo() @@ -7819,7 +7825,7 @@ ac_x_header_dirs=' /usr/openwin/share/include' if test "$ac_x_includes" = no; then - # Guess where to find include files, by looking for Intrinsic.h. + # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -7827,7 +7833,7 @@ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -#include +#include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 @@ -7854,7 +7860,7 @@ else sed 's/^/| /' conftest.$ac_ext >&5 for ac_dir in $ac_x_header_dirs; do - if test -r "$ac_dir/X11/Intrinsic.h"; then + if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi @@ -7868,7 +7874,7 @@ if test "$ac_x_libraries" = no; then # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS - LIBS="-lXt $LIBS" + LIBS="-lX11 $LIBS" if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} @@ -7880,11 +7886,11 @@ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -#include +#include int main () { -XtMalloc (0) +XrmInitialize () ; return 0; } @@ -10395,6 +10401,37 @@ cat >>confdefs.h <<\_ACEOF #define HAVE_PROC_SELF_EXE 1 _ACEOF +fi + + echo "$as_me:$LINENO: checking for /proc/self/maps" >&5 +echo $ECHO_N "checking for /proc/self/maps... $ECHO_C" >&6 +if test "${ac_cv_file__proc_self_maps+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/proc/self/maps"; then + ac_cv_file__proc_self_maps=yes +else + ac_cv_file__proc_self_maps=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__proc_self_maps" >&5 +echo "${ECHO_T}$ac_cv_file__proc_self_maps" >&6 +if test $ac_cv_file__proc_self_maps = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE__PROC_SELF_MAPS 1 +_ACEOF + + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PROC_SELF_MAPS 1 +_ACEOF + fi else @@ -10405,6 +10442,11 @@ cat >>confdefs.h <<\_ACEOF #define HAVE_PROC_SELF_EXE 1 _ACEOF + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PROC_SELF_MAPS 1 +_ACEOF + ;; esac fi @@ -16815,7 +16857,7 @@ if test "${have_tls+set}" = set; then else if test "$cross_compiling" = yes; then - if test x$gcc_no_link = xyes; then + if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} { (exit 1); exit 1; }; } @@ -16855,6 +16897,7 @@ fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext + else cat >conftest.$ac_ext <<_ACEOF __thread int a; int b; int main() { return a = b; } @@ -16870,7 +16913,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - save_LDFLAGS="$LDFLAGS" + chktls_save_LDFLAGS="$LDFLAGS" LDFLAGS="-static $LDFLAGS" if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 @@ -16942,7 +16985,134 @@ have_tls=yes fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" + LDFLAGS="$chktls_save_LDFLAGS" + if test $have_tls = yes; then + chktls_save_CFLAGS="$CFLAGS" + thread_CFLAGS=failed + for flag in '' '-pthread' '-lpthread'; do + CFLAGS="$flag $chktls_save_CFLAGS" + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + void *g(void *d) { return NULL; } +int +main () +{ +pthread_t t; pthread_create(&t,NULL,g,NULL); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + thread_CFLAGS="$flag" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "X$thread_CFLAGS" != Xfailed; then + break + fi + done + CFLAGS="$chktls_save_CFLAGS" + if test "X$thread_CFLAGS" != Xfailed; then + CFLAGS="$thread_CFLAGS $chktls_save_CFLAGS" + if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run test program while cross compiling +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + __thread int a; + static int *a_in_other_thread; + static void * + thread_func (void *arg) + { + a_in_other_thread = &a; + return (void *)0; + } +int +main () +{ +pthread_t thread; + void *thread_retval; + int *a_in_main_thread; + if (pthread_create (&thread, (pthread_attr_t *)0, + thread_func, (void *)0)) + return 0; + a_in_main_thread = &a; + if (pthread_join (thread, &thread_retval)) + return 0; + return (a_in_other_thread == a_in_main_thread); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + have_tls=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +have_tls=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + CFLAGS="$chktls_save_CFLAGS" + fi + fi else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 diff --git a/libjava/configure.ac b/libjava/configure.ac index 0ee1ee00c77..a8e536f15d3 100644 --- a/libjava/configure.ac +++ b/libjava/configure.ac @@ -295,6 +295,12 @@ if test "$use_x_awt" != yes; then echo gnu/java/awt/peer/x >> standard.omit fi +# Tools that need to be compiled against classpath's tools classes +for package in gnu/gcj/tools/gc_analyze ; do + echo $package >> standard.omit + echo $package >> vm-tools-packages +done + if test -z "${with_multisubdir}"; then builddotdot=. else @@ -1012,10 +1018,14 @@ else if test x"$cross_compiling" = x"no"; then AC_CHECK_FILES(/proc/self/exe, [ AC_DEFINE(HAVE_PROC_SELF_EXE, 1, [Define if you have /proc/self/exe])]) + AC_CHECK_FILES(/proc/self/maps, [ + AC_DEFINE(HAVE_PROC_SELF_MAPS, 1, + [Define if you have /proc/self/maps])]) else case $host in *-linux*) AC_DEFINE(HAVE_PROC_SELF_EXE, 1, [Define if you have /proc/self/exe]) + AC_DEFINE(HAVE_PROC_SELF_MAPS, 1, [Define if you have /proc/self/maps]) ;; esac fi diff --git a/libjava/gnu/gcj/tools/gc_analyze/BlockMap.java b/libjava/gnu/gcj/tools/gc_analyze/BlockMap.java new file mode 100644 index 00000000000..6e7adae20dd --- /dev/null +++ b/libjava/gnu/gcj/tools/gc_analyze/BlockMap.java @@ -0,0 +1,218 @@ +/* BlockMap.java -- Container for information on GC maintained memory blocks. + Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +package gnu.gcj.tools.gc_analyze; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Map; +import java.util.TreeMap; + +class BlockMap +{ + static final int HBLKSIZE = 4096; + + class SizeKind implements Comparable + { + int size; + int kind; + + public SizeKind(int size, int kind) + { + this.size = size; + this.kind = kind; + } + + public int compareTo(SizeKind b) + { + if (this.size != b.size) + return this.size - b.size; + return this.kind - b.kind; + } + } + + class PtrMarks + { + long ptr; + int marks; + + public PtrMarks(long ptr, int marks) + { + this.ptr = ptr; + this.marks = marks; + } + } + + private TreeMap> map = + new TreeMap>(); + + public BlockMap(BufferedReader reader) throws IOException + { + for (;;) + { + String s = reader.readLine(); + if (s == null) + break; + if (s.charAt(0) == '#') + continue; + if (s.indexOf("Begin block map") >= 0) + { + for (;;) + { + s = reader.readLine(); + if (s.charAt(0) == '#') + continue; + if (s.indexOf("End block map") >= 0) + return; + String[] items = s.split(","); + long ptr = 0; + int kind = 0, size = 0, marks = 0; + for (int i=0; i m = map.get(sk); + if (m == null) + { + m = new ArrayList(); + map.put(sk, m); + } + PtrMarks pm = new PtrMarks(ptr, marks); + m.add(pm); + } // inner loop + } // started inner loop + } // outer loop - finding begin + } // memoryMap + + public void dump() + { + System.out.println(); + System.out.println(); + System.out.println("*** Used Blocks ***\n"); + System.out.println(); + System.out.println(" Size Kind Blocks Used Free Wasted"); + System.out.println("------- ------------- ------- ---------- ---------- -------"); + + int total_blocks = 0, total_used = 0, total_free = 0, total_wasted = 0; + + for (Map.Entry> me : map.entrySet()) + { + SizeKind sk = me.getKey(); + + System.out.println(MemoryAnalyze.format(sk.size, 7) + " " + + MemoryAnalyze.kindToName(sk.kind)); + + int sub_blocks = 0, sub_used = 0, sub_free = 0, sub_wasted = 0; + int sub_count = 0; + + ArrayList v = me.getValue(); + + for (PtrMarks pm : v) + { + int bytes = sk.size; + int blocks = (sk.size + HBLKSIZE - 1) / HBLKSIZE; + int used; + int free; + int wasted; + + if (bytes < HBLKSIZE) + { + used = bytes * pm.marks; + free = bytes * (HBLKSIZE / bytes - pm.marks); + wasted = HBLKSIZE - HBLKSIZE / bytes * bytes; + } + else + { + if (pm.marks != 0) + { + used = bytes; + free = 0; + wasted = (bytes + HBLKSIZE - 1) + / HBLKSIZE * HBLKSIZE - used; + } + else + { + used = 0; + free = bytes; + wasted = 0; + } + } + + StringBuilder sb = new StringBuilder(); + sb.append(" "); + sb.append(MemoryAnalyze.format(blocks, 5)); + sb.append(" "); + sb.append(MemoryAnalyze.format(used, 9)); + sb.append(" "); + sb.append(MemoryAnalyze.format(free, 9)); + sb.append(" "); + sb.append(MemoryAnalyze.format(wasted, 9)); + System.out.println(sb); + + sub_blocks += blocks; + sub_used += used; + sub_free += free; + sub_wasted += wasted; + sub_count++; + + total_blocks += blocks; + total_used += used; + total_free += free; + total_wasted += wasted; + } // blocks with size/kind + if (sub_count > 1) + { + System.out.println( + " ------- ---------- ---------- -------"); + StringBuilder sb = new StringBuilder(); + sb.append(" "); + sb.append(MemoryAnalyze.format(sub_blocks, 5)); + sb.append(" "); + sb.append(MemoryAnalyze.format(sub_used, 9)); + sb.append(" "); + sb.append(MemoryAnalyze.format(sub_free, 9)); + sb.append(" "); + sb.append(MemoryAnalyze.format(sub_wasted, 9)); + System.out.println(sb); + } + } // size/kind + + System.out.println("------- ------------- ------- ---------- ---------- -------"); + StringBuilder sb = new StringBuilder(); + sb.append(" "); + sb.append(MemoryAnalyze.format(total_blocks, 5)); + sb.append(" "); + sb.append(MemoryAnalyze.format(total_used, 9)); + sb.append(" "); + sb.append(MemoryAnalyze.format(total_free, 9)); + sb.append(" "); + sb.append(MemoryAnalyze.format(total_wasted, 9)); + System.out.println(sb); + System.out.println("Total bytes = " + + MemoryAnalyze.format(total_blocks * HBLKSIZE, 10)); + } +} diff --git a/libjava/gnu/gcj/tools/gc_analyze/BytePtr.java b/libjava/gnu/gcj/tools/gc_analyze/BytePtr.java new file mode 100644 index 00000000000..4afceeeec8a --- /dev/null +++ b/libjava/gnu/gcj/tools/gc_analyze/BytePtr.java @@ -0,0 +1,115 @@ +/* BytePtr.java -- Container for bytes from a memory image. + Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +package gnu.gcj.tools.gc_analyze; + +import java.nio.ByteBuffer; + +public class BytePtr +{ + ByteBuffer content; + int wordSize; + + BytePtr(ByteBuffer b, int ws) + { + content = b; + wordSize = ws; + } + + public int getsize() + { + return content.limit(); + } + + public int getByte(int offset) + { + return content.get(offset); + } + + public int getInt(int n) + { + return content.getInt(n * 4); + } + + public int getShort(int n) + { + return content.getShort(n * 2); + } + + public long getWord(int n) + { + if (4 == wordSize) + return 0xffffffffL & content.getInt(n * 4); + else + return content.getLong(n * 8); + } + + public int intsPerWord() + { + return (4 == wordSize) ? 1 : 2; + } + + public BytePtr getRegion(int offset, int size) + { + int oldLimit = content.limit(); + content.position(offset); + content.limit(offset + size); + ByteBuffer n = content.slice(); + content.position(0); + content.limit(oldLimit); + + return new BytePtr(n, wordSize); + } + + public void setInt(int a, int n) + { + content.putInt(a * 4, n); + } + + public void dump() + { + // 38 5a f4 2a 50 bd 04 10 10 00 00 00 0e 00 00 00 8Z.*P........... + int i; + StringBuilder b = new StringBuilder(67); + for (i = 0; i < 66; i++) + b.append(' '); + b.append('\n'); + + i = 0; + do + { + for (int j = 0; j < 16; j++) + { + int k = i + j; + + if (k < content.limit()) + { + int v = 0xff & getByte(k); + // hex + int v1 = v/16; + b.setCharAt(j * 3 + 0, + (char)(v1 >= 10 ? 'a' - 10 + v1 : v1 + '0')); + v1 = v % 16; + b.setCharAt(j * 3 + 1, + (char)(v1 >= 10 ? 'a' - 10 + v1 : v1 + '0')); + // ascii + b.setCharAt(j + 50, (char)((v >= 32 && v <= 127) ? v: '.')); + } + else + { + b.setCharAt(j * 3 + 0, ' '); + b.setCharAt(j * 3 + 1, ' '); + b.setCharAt(j + 50, ' '); + } + } + i += 16; + System.out.print(b); + } while (i < content.limit()); + } +} diff --git a/libjava/gnu/gcj/tools/gc_analyze/ItemList.java b/libjava/gnu/gcj/tools/gc_analyze/ItemList.java new file mode 100644 index 00000000000..7912bebca57 --- /dev/null +++ b/libjava/gnu/gcj/tools/gc_analyze/ItemList.java @@ -0,0 +1,72 @@ +/* ItemList.java -- Maps all objects keyed by their addresses. + Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +package gnu.gcj.tools.gc_analyze; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +class ItemList +{ + public ItemList() + { + } + + private TreeMap> map; + + public void add(ObjectMap.ObjectItem item) + { + if (map == null) + map = new TreeMap>(); + Long x = new Long(item.klass); + HashMap list = map.get(x); + if (list == null) + { + list = new HashMap(); + map.put(x, list); + } + Integer count = list.get(item); + if (count == null) + list.put(item, new Integer(1)); + else + list.put(item, new Integer(count.intValue() + 1)); + } + + void dump(String title, SymbolLookup lookup) throws IOException + { + if (map == null) + return; + System.out.println(title); + for (Map.Entry> me : + map.entrySet()) + { + HashMap list = me.getValue(); + boolean first = true; + + for (Map.Entry me2 : list.entrySet()) + { + ObjectMap.ObjectItem item = me2.getKey(); + Integer count = me2.getValue(); + if (first) + { + String name = + MemoryAnalyze.getSymbolPretty(lookup, item, false); + System.out.println(" " + name + ":"); + first = false; + } + System.out.print(" 0x" + Long.toHexString(item.ptr)); + if (count.intValue() != 1) + System.out.print(" * " + count); + System.out.println(); + } + } + } +} diff --git a/libjava/gnu/gcj/tools/gc_analyze/MemoryAnalyze.java b/libjava/gnu/gcj/tools/gc_analyze/MemoryAnalyze.java new file mode 100644 index 00000000000..d56a71da311 --- /dev/null +++ b/libjava/gnu/gcj/tools/gc_analyze/MemoryAnalyze.java @@ -0,0 +1,458 @@ +/* MemoryAnalyze.java -- Analyzes a libgcj heap dump. + Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +package gnu.gcj.tools.gc_analyze; + +import gnu.classpath.tools.getopt.FileArgumentCallback; +import gnu.classpath.tools.getopt.Option; +import gnu.classpath.tools.getopt.OptionException; +import gnu.classpath.tools.getopt.Parser; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +class MemoryAnalyze +{ + public MemoryAnalyze() + { + } + + private static NumberFormat numberFormat; + private static boolean verbose; + static String format(long number, int digits) + { + if (numberFormat == null) + { + numberFormat = NumberFormat.getNumberInstance(); + numberFormat.setGroupingUsed(true); + } + String temp = numberFormat.format(number); + int spaces = digits - temp.length(); + if (spaces < 0) + spaces = 0; + return " ".substring(0,spaces) + temp; + } + + static void sorted_report(String description, + int total_space, + ArrayList list, + Comparator comparator) + { + System.out.println("*** " + description + " ***"); + System.out.println(); + System.out.println(" Total Size Count Size Description"); + System.out.println("-------------- ----- -------- -----------------------------------"); + Collections.sort(list, comparator); + for (Iterator it = list.iterator(); it.hasNext(); ) + { + String v = (String)it.next(); + System.out.println(stripend(v)); + } + System.out.println("-------------- ----- -------- -----------------------------------"); + System.out.println(format(total_space, 14)); + System.out.println(); + System.out.println(); + } + + private static String stripend(String s) + { + int n = s.lastIndexOf(" /"); + if (n > 0) + return s.substring(0,n); + return s; + } + + static class SubstringComparator implements Comparator + { + private int begin, end; + private boolean reverse; + + SubstringComparator(int begin, int end, boolean reverse) + { + this.begin = begin; + this.end = end; + this.reverse = reverse; + } + + public int compare(String s1, String s2) + { + if (end == 0) + s1 = s1.substring(begin); + else + s1 = s1.substring(begin, end); + + if (end == 0) + s2 = s2.substring(begin); + else + s2 = s2.substring(begin, end); + int i = s1.compareTo(s2); + if (reverse) + return -i; + return i; + } + } + + static class OptionParser extends Parser + { + int filesFound; + + OptionParser() + { + super("gc-analyze", + "gc-analyze (" + System.getProperty("java.vm.version") + ")"); + + add(new Option('d', + "Directory containing runtime objects", + "directory") + { + public void parsed(String argument) throws OptionException + { + ToolPrefix.pathPrefix = argument; + } + }); + + add(new Option('p', + "Binary tool prefix, prepended to nm and readelf to " + + "obtain target specific versions of these commands", + "prefix") + { + public void parsed(String argument) throws OptionException + { + ToolPrefix.toolPrefix = argument; + } + }); + + add(new Option("verbose", 'v', + "Verbose output; requires filename.bytes") + { + public void parsed(String argument) throws OptionException + { + verbose = true; + } + }); + + setHeader("usage: gc-analyze [-v] [-p tool-prefix] [-d ] " + + "filename"); + } + + protected void validate() throws OptionException + { + if (filesFound != 1) + throw new OptionException("Must specify exactly one filename"); + } + + public String[] parse(String[] inArgs) + { + final ArrayList fileResult = new ArrayList(); + parse(inArgs, new FileArgumentCallback() + { + public void notifyFile(String fileArgument) + { + filesFound++; + fileResult.add(fileArgument); + } + }); + return fileResult.toArray(new String[1]); + } + } + + public static void main(String[] args) + { + class Info + { + int size; + int count; + } + int total_space = 0; + + Parser optionParser = new OptionParser(); + + String rest[] = optionParser.parse(args); + + String filename = rest[0]; + + try + { + BufferedReader reader = + new BufferedReader(new InputStreamReader(new FileInputStream(filename))); + SymbolLookup lookup = new SymbolLookup(reader, filename + ".bytes"); + ObjectMap objectMap = new ObjectMap(reader); + BlockMap blockMap = new BlockMap(reader); + reader.close(); + + // add info to item(s) + // add item.klass + for (Map.Entry me : objectMap) + { + ObjectMap.ObjectItem item = me.getValue(); + + // try to get a klass (happens with intern'ed strings...) + if (item.klass==0) + { + BytePtr p = lookup.getBytePtr(item.ptr, item.size); + if (p!=null) + { + long vtable = p.getWord(0); + String sym = + lookup.getSymbolViaVtable(vtable - 2 * lookup.memoryMap.wordSize); + if (sym != null) + { + item.typeName = SymbolTable.demangleVTName(sym); + } + else if (vtable != 0) + { + // get klass from vtable + p = lookup.getBytePtr(vtable, + lookup.memoryMap.wordSize); + if (p != null) + { + long klass = p.getWord(0); + item.klass = klass; + } + } + } + } + + // figure out strings + String class_name; + if (null == item.typeName) + { + class_name = + MemoryAnalyze.getSymbolPretty(lookup, item, false); + item.typeName = class_name; + } + else + { + class_name = item.typeName; + } + System.out.print("class_name=[" + class_name + "]"); + + if (class_name.compareTo("_ZTVN4java4lang6StringE")==0 + || class_name.compareTo("java.lang.String")==0) + { + BytePtr p = lookup.getBytePtr(item.ptr, item.size); + long data = p.getWord(1); + int boffset = p.getInt(2 * p.intsPerWord()); + int count = p.getInt(1 + 2 * p.intsPerWord()); + int hash = p.getInt(2 + 2 * p.intsPerWord()); + BytePtr chars = lookup.getBytePtr(data+boffset, count * 2); + StringBuffer sb = new StringBuffer(count); + for (int qq = 0; qq map = new HashMap(); + for (Map.Entry me : objectMap) + { + ObjectMap.ObjectItem item = me.getValue(); + String name = getSymbolPretty(lookup, item, true); + Info info = map.get(name); + if (info == null) + { + info = new Info(); + info.count = 0; + info.size = item.size; + map.put(name, info); + } + info.count++; + total_space += item.size; + } + + ArrayList list = new ArrayList(); + for (Iterator it = map.entrySet().iterator(); it.hasNext(); ) + { + Map.Entry me = (Map.Entry)it.next(); + String name = (String)me.getKey(); + Info info = (Info)me.getValue(); + + StringBuffer sb = new StringBuffer(); + sb.append(format(info.count * info.size * 100 / total_space, + 3)); + sb.append("%"); + sb.append(format(info.count * info.size, 10)); + sb.append(" = "); + sb.append(format(info.count, 7)); + sb.append(" * "); + sb.append(format(info.size, 9)); + sb.append(" - "); + sb.append(name); + list.add(sb.toString()); + } + + sorted_report("Memory Usage Sorted by Total Size", + total_space, list, new SubstringComparator(5,14,true)); + sorted_report("Memory Usage Sorted by Description", + total_space, list, new SubstringComparator(39,0,false)); + sorted_report("Memory Usage Sorted by Count", + total_space, list, new SubstringComparator(17,25,true)); + sorted_report("Memory Usage Sorted by Size", + total_space, list, new SubstringComparator(28,37,true)); + + blockMap.dump(); + + // dump raw memory + if (verbose) + { + // analyze references + for (Map.Entry me : objectMap) + { + long ptr = me.getKey(); + ObjectMap.ObjectItem item = me.getValue(); + BytePtr p = lookup.getBytePtr(ptr, item.size); + if (p == null) + System.out.println("can't find ptr 0x" + + Long.toHexString(ptr)); + else if (item.kind != 0) // not GC_PTRFREE + for (int i = 1; + i < item.size / lookup.memoryMap.wordSize; i++) + { + long maybe_ptr = p.getWord(i); + ObjectMap.ObjectItem item2 = objectMap.get(maybe_ptr); + if (item2 != null) + { + item2.pointed_by.add(item); + item.points_to.add(item2); + } + } + } + System.out.println(); + System.out.println("*** All Objects ***"); + System.out.println(); + + for (Map.Entry me : objectMap) + { + long ptr = me.getKey(); + ObjectMap.ObjectItem item = me.getValue(); + String name = getSymbolPretty(lookup, item, false); + System.out.print("0x" + Long.toHexString(ptr) + " - " + name + + " (" + item.size + ")"); + if (item.string != null) + System.out.println(" \"" + item.string + "\""); + else + System.out.println(); + + BytePtr p = lookup.getBytePtr(ptr, item.size); + + if (p == null) + System.out.println( + "can't find memory; recently allocated from free list?"); + else + p.dump(); + + item.points_to.dump(" points to:", lookup); + item.pointed_by.dump(" pointed to by:", lookup); + System.out.println(); + } + } + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + public static String kindToName(int kind) + { + String name; + switch (kind) + { + case 0: + name = "GC_PTRFREE"; + break; + case 1: + name = "GC_NORMAL"; + break; + case 2: + name = "GC_UNCOLLECTABLE"; + break; + case 3: + name = "GC_AUUNCOLLCTABLE"; + break; + case 4: + name = "(Java)"; + break; + case 5: + name = "(Java Debug)"; + break; + case 6: + name = "(Java Array)"; + break; + default: + name = "(Kind " + kind + ")"; + break; + } + return name; + } + + public static String getSymbolPretty(SymbolLookup lookup, + ObjectMap.ObjectItem item, + boolean bsize) + throws IOException + { + + String name = item.typeName; + + if (name == null) + name = lookup.getSymbol(item.klass); + + if (name == null) + { + String v = lookup.decodeUTF8(item.ptr, item.size); + if (null != v) + { + name = "UTF8Const"; + item.string = v; + } + } + + if (name == null) + { + name = kindToName(item.kind); + } + if (item.kind==6) + name += "[" + format(item.data, 0) + "]"; + if (bsize) + name = name + " / " + format(item.size, 7); + return name; + } +} diff --git a/libjava/gnu/gcj/tools/gc_analyze/MemoryMap.java b/libjava/gnu/gcj/tools/gc_analyze/MemoryMap.java new file mode 100644 index 00000000000..1bc06d58422 --- /dev/null +++ b/libjava/gnu/gcj/tools/gc_analyze/MemoryMap.java @@ -0,0 +1,359 @@ +/* MemoryMap.java -- Maps address ranges to their data. + Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + +package gnu.gcj.tools.gc_analyze; + +import java.io.BufferedReader; +import java.io.EOFException; +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.FileChannel; +import java.util.Comparator; +import java.util.HashMap; +import java.util.SortedSet; +import java.util.TreeSet; + +/** + * Reads /proc/self/maps output from dump file. + * Creates map of to Range. + * + * Returns filename given address. + * Returns offset given address. + * Returns BytePtr given address. + * + */ +class MemoryMap +{ + static class RangeComparator implements Comparator + { + public int compare(Range r1, Range r2) + { + if (r2.end == 0 && r1.end != 0) + return -compare(r2, r1); + + if (r1.begin < r2.begin) + return -1; + else if (r1.begin >= r2.end) + return 1; + else + return 0; + } + } + + static class Range + { + long begin; + long end; + + long offset; + String filename; + Range() + { + } + + Range(long b, long e, String s, long o) + { + begin = b; + end = e; + filename = s; + offset = o; + } + } + + /** + * Parse the string as an unsigned hexadecimal number. This is + * similar to Long.parseInt(s,16), but without the restriction that + * values that have the sign bit set not being allowed. + * + * @param s the number as a String. + * @return the number. + */ + static long parseHexLong(String s) + { + if (s.length() > 16) + throw new NumberFormatException(); + long r = 0; + for (int i = 0; i < s.length(); i++) + { + int digit = 0; + char c = s.charAt(i); + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + digit = c - '0'; + break; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + digit = 10 + c - 'a'; + break; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + digit = 10 + c - 'A'; + break; + default: + throw new NumberFormatException(); + } + r = (r << 4) + digit; + } + return r; + } + + // String filename -> Range + TreeSet map = new TreeSet(new RangeComparator()); + HashMap symbolTables = + new HashMap(); + ByteOrder byteOrder; + int wordSize; + + public MemoryMap(BufferedReader reader, + String rawFileName) throws IOException + { + FileChannel raw = (new RandomAccessFile(rawFileName, "r")).getChannel(); + ByteBuffer buf = ByteBuffer.allocate(8); + raw.read(buf); + if (buf.hasRemaining()) + { + raw.close(); + throw new EOFException(); + } + buf.flip(); + wordSize = buf.get(); + + if (wordSize == 8 || wordSize == 4) + byteOrder = ByteOrder.LITTLE_ENDIAN; + else + { + byteOrder = ByteOrder.BIG_ENDIAN; + buf.rewind(); + wordSize = buf.getInt(); + if (0 == wordSize) + wordSize = buf.getInt(); + } + switch (wordSize) + { + case 4: + case 8: + break; + default: + throw new IOException("Bad .bytes file header"); + } + buf = ByteBuffer.allocate(3 * wordSize); + buf.order(byteOrder); + raw.position(0L); + + for(;;) + { + // Read the block header. + buf.clear(); + if (-1 == raw.read(buf)) + { + //EOF + raw.close(); + break; + } + if (buf.hasRemaining()) + { + raw.close(); + throw new EOFException(); + } + buf.flip(); + long dummy + = (wordSize == 4) ? (buf.getInt() & 0xffffffffL) : buf.getLong(); + if (dummy != wordSize) + throw new IOException("Bad .bytes file header"); + long start + = wordSize == 4 ? (buf.getInt() & 0xffffffffL) : buf.getLong(); + long length + = wordSize == 4 ? (buf.getInt() & 0xffffffffL) : buf.getLong(); + if (length < 0L) + throw new IOException("Bad .bytes file header"); + + long currentPos = raw.position(); + raw.position(currentPos + length); + + Range range = new Range(start, start + length, + rawFileName, currentPos); + map.add(range); + } + + for (;;) + { + String s = reader.readLine(); + if (s == null) + break; + if (s.indexOf("Begin address map") >= 0) + { + for (;;) + { + s = reader.readLine(); + if (s.indexOf("End address map") >= 0) + { + dump(); + return; + } + int endOfAddress = s.indexOf('-'); + long address = parseHexLong(s.substring(0, endOfAddress)); + int endOfAddress2 = s.indexOf(' ', endOfAddress + 1); + long address2 = parseHexLong(s.substring(endOfAddress + 1, + endOfAddress2)); + int endOfOffset = s.indexOf(' ', endOfAddress2 + 6); + long offset; + try + { + offset = parseHexLong(s.substring(endOfAddress2 + 6, + endOfOffset)); + } + catch (Exception e) + { + offset = 0; + } + int end = s.indexOf('/'); + + if (end > 0) + { + String file = s.substring(end); + if (file.startsWith("/dev/")) + continue; + + Range r = new Range(address, address2, file, offset); + if (offset == 0) + { + // Read the file's symbol table + try + { + File f = ToolPrefix.fileForName(file); + if (f != null) + { + SymbolTable st = new SymbolTable(f.getPath()); + if (st.loadAddr != address) + st.relocation = address - st.loadAddr; + symbolTables.put(file, st); + } + } + catch (Exception ex) + { + ex.printStackTrace(); + } + } + map.add(r); + } + } // inner loop + } // started inner loop + } // outer loop - finding begin + } // memoryMap + + + public void dump() + { + System.out.println("MemoryMap:"); + for (Range r : map) + { + System.out.println(Long.toHexString(r.begin) + "-" + + Long.toHexString(r.end) + " -> " + + r.filename + " offset " + + Long.toHexString(r.offset)); + } + } + + Range getRange(long addr) + { + Range r = new Range(); + r.begin = addr; + SortedSet t = map.tailSet(r); + if (t.isEmpty()) + return null; + Range c = t.first(); + if (c.begin <= addr && addr < c.end) + return c; + return null; + } + + String getFile(long addr) + { + Range r = getRange(addr); + if (null != r) + return r.filename; + return null; + } + + long getOffset(long addr) + { + Range r = getRange(addr); + if (null != r) + return r.offset; + return 0L; + } + + /** + * @return BytePtr which includes given address. + */ + BytePtr getBytePtr(long addr, int length) throws IOException + { + Range r = getRange(addr); + + if (null == r) + return null; + + File f = ToolPrefix.fileForName(r.filename); + if (null == f) + return null; + + if (addr + length > r.end) + length = (int)(r.end - addr); + + ByteBuffer b = ByteBuffer.allocate(length); + b.order(byteOrder); + + FileChannel fc = (new RandomAccessFile(f, "r")).getChannel(); + fc.position(r.offset + addr - r.begin); + int nr = fc.read(b); + fc.close(); + if (nr != length) + return null; + b.flip(); + return new BytePtr(b, wordSize); + } + + public String getSymbol(long addr) + { + Range r = getRange(addr); + + if (r == null) + return null; + + SymbolTable st = symbolTables.get(r.filename); + if (st == null) + return null; + + // Apply relocation + addr -= st.relocation; + + return st.getSymbol(addr); + } +} diff --git a/libjava/gnu/gcj/tools/gc_analyze/ObjectMap.java b/libjava/gnu/gcj/tools/gc_analyze/ObjectMap.java new file mode 100644 index 00000000000..b55034be137 --- /dev/null +++ b/libjava/gnu/gcj/tools/gc_analyze/ObjectMap.java @@ -0,0 +1,140 @@ +/* ObjectMap.java -- Contains a map of all objects keyed by their addresses. + Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + +package gnu.gcj.tools.gc_analyze; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.Iterator; +import java.util.Map; +import java.util.TreeMap; + +class ObjectMap implements Iterable> +{ + + class ObjectItem + { + int used; + int size; + int kind; + long klass; + long data; + long ptr; + String typeName; + String string; // only for string objects + boolean stringData; // character array pointed to by a string + ObjectItem reference; // object at reference points to this + + ItemList points_to = new ItemList(); + ItemList pointed_by = new ItemList(); + } + + private TreeMap map = new TreeMap(); + + public Iterator> iterator() + { + return map.entrySet().iterator(); + } + + public ObjectItem get(long ptr) + { + ObjectItem item = map.get(ptr); + return item; + } + + public ObjectMap(BufferedReader reader) throws IOException + { + outer_loop: + for (;;) + { + String s = reader.readLine(); + if (s == null) + break; + if (s.indexOf("Begin object map") >= 0) + { + for (;;) + { + s = reader.readLine(); + if (s.indexOf("End object map") >= 0) + break outer_loop; + String[] items = s.split(","); + ObjectItem item = new ObjectItem(); + long ptr = 0; + for (int i=0; i 1) + item.klass = + MemoryMap.parseHexLong(last.substring(2)); + else + item.klass = Integer.parseInt(last,16); + break; + case 5: + try + { + item.data = + Integer.parseInt(last.substring(2), 16); + } + catch (Exception e) + { + item.data = 0; + } + break; + } + } + item.ptr = ptr; + map.put(ptr, item); + } // inner loop + } // started inner loop + } // outer loop - finding begin + for (Map.Entry me : this) + { + ObjectItem item = me.getValue(); + if (item.data != 0) + { + // see if data is a pointer to a block + ObjectItem referenced = map.get(item.data); + if (referenced != null) + { + referenced.reference = item; + } + } + } + } // memoryMap + + public void dump() + { + for (Map.Entry me : this) + { + long ptr = me.getKey(); + ObjectItem item = me.getValue(); + System.out.println("ptr = " + Long.toHexString(ptr) + + ", size = " + item.size + + ", klass = " + Long.toHexString(item.klass) + + ", kind = " + item.kind + + ", data = " + item.data); + } + } +} diff --git a/libjava/gnu/gcj/tools/gc_analyze/SymbolLookup.java b/libjava/gnu/gcj/tools/gc_analyze/SymbolLookup.java new file mode 100644 index 00000000000..b3963d8cfd8 --- /dev/null +++ b/libjava/gnu/gcj/tools/gc_analyze/SymbolLookup.java @@ -0,0 +1,112 @@ +/* SymbolLookup.java -- Finds class names by analyzing memory. + Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + +package gnu.gcj.tools.gc_analyze; + +import java.io.BufferedReader; +import java.io.IOException; + +class SymbolLookup +{ + MemoryMap memoryMap; + + public SymbolLookup(BufferedReader reader, + String rawFileName) + throws IOException + { + memoryMap = new MemoryMap(reader, rawFileName); + } + + public String decodeUTF8(long address) throws IOException + { + return decodeUTF8(address, -1); + } + + public String decodeUTF8(long address, int limit) throws IOException + { + if (address == 0) + return null; + + BytePtr utf8 = memoryMap.getBytePtr(address, 64); + + if (utf8 == null) + return null; + + int len = utf8.getShort(1); + int hash16 = utf8.getShort(0) & 0xffff; + + if (len <= 0 || (limit > 0 && len > (limit - 4))) + return null; + + if (len > utf8.getsize() + 4) + utf8 = memoryMap.getBytePtr(address, len + 4); + + if (utf8 == null) + return null; + + StringBuilder sb = new StringBuilder(len); + int pos = 4; + len += 4; + + while (pos < len) + { + int f = utf8.getByte(pos++); + if ((f & 0x80) == 0) + { + sb.append((char)f); + } + else if ((f & 0xe0) == 0xc0) + { + int s = utf8.getByte(pos++); + char c = (char)(((f & 0x1f) << 6) | (s & 0x80)); + sb.append(c); + } + else if ((f & 0xe0) == 0xe0) + { + int s = utf8.getByte(pos++); + int t = utf8.getByte(pos++); + char c = (char)(((f & 0x0f) << 12) + | ((s & 0x80) << 6) | (t & 0x80)); + sb.append(c); + } + else + break; // Bad utf8 + } + String rv = sb.toString(); + if (hash16 == (rv.hashCode() & 0xffff)) + return rv; + else + return null; + } + + public String getSymbolViaVtable(long address) throws IOException + { + return memoryMap.getSymbol(address); + } + + public String getSymbol(long address) throws IOException + { + String symbol = memoryMap.getSymbol(address); + if (null != symbol) + return symbol; + + BytePtr klass = memoryMap.getBytePtr(address, 3 * memoryMap.wordSize); + if (klass == null) + return null; + + long nameUTF8p = klass.getWord(2); + + return decodeUTF8(nameUTF8p); + } + + BytePtr getBytePtr(long addr, int length) throws IOException + { + return memoryMap.getBytePtr(addr, length); + } +} diff --git a/libjava/gnu/gcj/tools/gc_analyze/SymbolTable.java b/libjava/gnu/gcj/tools/gc_analyze/SymbolTable.java new file mode 100644 index 00000000000..eb5df7641b7 --- /dev/null +++ b/libjava/gnu/gcj/tools/gc_analyze/SymbolTable.java @@ -0,0 +1,198 @@ +/* SymbolTable.java -- Maintains a mapping of addresses to names. + Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + +package gnu.gcj.tools.gc_analyze; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +class SymbolTable +{ + // Long address->String name + private HashMap map = new HashMap(); + + // Reverse + // String name -> Long address + // used for RelocateImage + private HashMap reverse = new HashMap(); + + long loadAddr; + long relocation; + + static Matcher interestingSymbol = + Pattern.compile("^([0-9a-fA-F]+)\\s+\\S+\\s+(_Z\\S+)").matcher(""); + static Matcher readelfLoadMatcher = + Pattern.compile("^\\s+LOAD\\s+(\\S+)\\s+(\\S+)\\s.*").matcher(""); + + public SymbolTable(String filename) throws IOException + { + Process p = Runtime.getRuntime().exec(ToolPrefix.toolPrefix + + "nm " + filename); + InputStream es = p.getErrorStream(); + InputStream is = p.getInputStream(); + + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + int count = 0; + + String line; + while ((line = reader.readLine()) != null) + { + interestingSymbol.reset(line); + if (interestingSymbol.matches()) + { + try + { + String name = interestingSymbol.group(2); + String addr = interestingSymbol.group(1); + if (name.startsWith("_ZTVN") || name.endsWith("6class$E")) + { + long address = MemoryMap.parseHexLong(addr); + Long l = new Long(address); + map.put(l, name); + count++; + reverse.put(name, l); + } + } + catch (NumberFormatException e) + { + // ignore it + } + } + } + es.close(); + is.close(); + p.destroy(); + + if (count > 0) + { + // Assume nm read some symbols from it and that + // readelf can tell us something about how it is loaded. + p = Runtime.getRuntime().exec(ToolPrefix.toolPrefix + + "readelf -l " + filename); + es = p.getErrorStream(); + is = p.getInputStream(); + + reader = new BufferedReader(new InputStreamReader(is)); + while ((line = reader.readLine()) != null) + { + readelfLoadMatcher.reset(line); + if (readelfLoadMatcher.matches()) + { + loadAddr + = Long.decode(readelfLoadMatcher.group(2)).longValue(); + break; + } + } + es.close(); + is.close(); + p.destroy(); + } + + System.out.println(ToolPrefix.toolPrefix + "nm " + filename + + " -> " + count + " symbols"); + } + + public static void main(String args[]) + { + try + { + SymbolTable st = new SymbolTable(args[0]); + st.dump(); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + } + + public static String demangleVTName(String n) + { + if (n.startsWith("_ZTVN") && n.endsWith("E")) + return demangle(n.substring(5, n.length() - 1)); + else + return null; + } + + public void dump() + { + for (Map.Entry me : map.entrySet()) + { + long address = me.getKey(); + String symbol = me.getValue(); + System.out.println(Long.toHexString(address) + " -> " + symbol); + if (symbol.startsWith("_ZN") && symbol.endsWith("6class$E")) + { + System.out.println(" Class: " + + demangle(symbol.substring(3, symbol.length() + - 8))); + } + else if (symbol.startsWith("_ZTVN") && symbol.endsWith("E")) + { + System.out.println(" VT: " + + demangle(symbol.substring(5, symbol.length() + - 1))); + } + } + } + + private static String demangle(String symbol) + { + StringBuilder sb = new StringBuilder(); + for (int i=0; i '9') + break; + l = 10 * l + (d - '0'); + i++; + } + if (l == 0) + break; + // copy + if (sb.length() > 0) + sb.append('.'); + while (l > 0 && i < symbol.length()) + { + sb.append(symbol.charAt(i)); + l--; + i++; + } + } + return sb.toString(); + } + + public String getSymbol(long address) + { + String symbol = map.get(address); + if (symbol == null) + return null; + + if (symbol.startsWith("_ZN") && symbol.endsWith("6class$E")) + symbol = demangle(symbol.substring(3, symbol.length() - 8)); + return symbol; + } + + // will return -1 if not found + public long getAddress(String symbol) + { + Long address = reverse.get(symbol); + if (address == null) + return -1; + return address.longValue(); + } +} diff --git a/libjava/gnu/gcj/tools/gc_analyze/ToolPrefix.java b/libjava/gnu/gcj/tools/gc_analyze/ToolPrefix.java new file mode 100644 index 00000000000..e8d73ae92db --- /dev/null +++ b/libjava/gnu/gcj/tools/gc_analyze/ToolPrefix.java @@ -0,0 +1,45 @@ +/* ToolPrefix.java -- Container of the toolPrefix String. + Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +package gnu.gcj.tools.gc_analyze; + +import java.io.File; + +class ToolPrefix +{ + /** + * Private constructor. No creation allowed. This class has + * Static methods only. + */ + private ToolPrefix() + { + } + + static String toolPrefix = ""; + + static String pathPrefix = ""; + + static File fileForName(String filename) + { + File f = new File(pathPrefix + filename); + if (!f.canRead()) + { + // Try it without the prefix. + f = new File(filename); + if (!f.canRead()) + { + // Try to find it in the current directory. + f = new File(f.getName()); + if (!f.canRead()) + return null; + } + } + return f; + } +} diff --git a/libjava/gnu/gcj/util/GCInfo.h b/libjava/gnu/gcj/util/GCInfo.h new file mode 100644 index 00000000000..06e0dd0d06c --- /dev/null +++ b/libjava/gnu/gcj/util/GCInfo.h @@ -0,0 +1,45 @@ + +// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*- + +#ifndef __gnu_gcj_util_GCInfo__ +#define __gnu_gcj_util_GCInfo__ + +#pragma interface + +#include +extern "Java" +{ + namespace gnu + { + namespace gcj + { + namespace util + { + class GCInfo; + } + } + } +} + +class gnu::gcj::util::GCInfo : public ::java::lang::Object +{ + + GCInfo(); + static void checkPermission(); +public: + static void dump(::java::lang::String *); +private: + static void dump0(::java::lang::String *); +public: + static void enumerate(::java::lang::String *); +private: + static void enumerate0(::java::lang::String *); +public: + static void setOOMDump(::java::lang::String *); +private: + static void setOOMDump0(::java::lang::String *); +public: + static ::java::lang::Class class$; +}; + +#endif // __gnu_gcj_util_GCInfo__ diff --git a/libjava/gnu/gcj/util/GCInfo.java b/libjava/gnu/gcj/util/GCInfo.java new file mode 100644 index 00000000000..73f4718f9f2 --- /dev/null +++ b/libjava/gnu/gcj/util/GCInfo.java @@ -0,0 +1,79 @@ +/* GCInfo.java -- Support for creating heap dumps. + Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + +package gnu.gcj.util; + +public class GCInfo +{ + private GCInfo() + { + } + + /** + * @throws SecurityException if there is a SecurityManager installed + * and UtilPermission("dumpHeap") is not granted. + */ + private static void checkPermission() + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkPermission(new UtilPermission("dumpHeap")); + } + + + /** + * Dump a description of the heap state. + * + * @param namePrefix The filename prefix for the dump files. + * + * @throws SecurityException if there is a SecurityManager installed + * and UtilPermission("dumpHeap") is not granted. + */ + public static synchronized void dump(String name) + { + checkPermission(); + dump0(name); + } + + private static native void dump0(String name); + + + /** + * Create a heap dump. + * + * @param namePrefix The filename prefix for the dump files. + * + * @throws SecurityException if there is a SecurityManager installed + * and UtilPermission("dumpHeap") is not granted. + */ + public static synchronized void enumerate(String namePrefix) + { + checkPermission(); + enumerate0(namePrefix); + } + + private static native void enumerate0(String namePrefix); + + /** + * Cause a heap dump if out-of-memory condition occurs. + * + * @param namePrefix The filename prefix for the dump files. If + * null no dumps are created. + * + * @throws SecurityException if there is a SecurityManager installed + * and UtilPermission("dumpHeap") is not granted. + */ + public static synchronized void setOOMDump(String namePrefix) + { + checkPermission(); + setOOMDump0(namePrefix); + } + + private static native void setOOMDump0(String namePrefix); +} diff --git a/libjava/gnu/gcj/util/UtilPermission.h b/libjava/gnu/gcj/util/UtilPermission.h new file mode 100644 index 00000000000..4c7b2267154 --- /dev/null +++ b/libjava/gnu/gcj/util/UtilPermission.h @@ -0,0 +1,32 @@ + +// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*- + +#ifndef __gnu_gcj_util_UtilPermission__ +#define __gnu_gcj_util_UtilPermission__ + +#pragma interface + +#include +extern "Java" +{ + namespace gnu + { + namespace gcj + { + namespace util + { + class UtilPermission; + } + } + } +} + +class gnu::gcj::util::UtilPermission : public ::java::security::BasicPermission +{ + +public: + UtilPermission(::java::lang::String *); + static ::java::lang::Class class$; +}; + +#endif // __gnu_gcj_util_UtilPermission__ diff --git a/libjava/gnu/gcj/util/UtilPermission.java b/libjava/gnu/gcj/util/UtilPermission.java new file mode 100644 index 00000000000..1ea4cb71668 --- /dev/null +++ b/libjava/gnu/gcj/util/UtilPermission.java @@ -0,0 +1,20 @@ +/* GCInfo.java -- Support for creating heap dumps. + Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + +package gnu.gcj.util; + +import java.security.BasicPermission; + +public class UtilPermission extends BasicPermission +{ + public UtilPermission(String name) + { + super(name); + } +} diff --git a/libjava/gnu/gcj/util/natGCInfo.cc b/libjava/gnu/gcj/util/natGCInfo.cc new file mode 100644 index 00000000000..7e5c6fbb845 --- /dev/null +++ b/libjava/gnu/gcj/util/natGCInfo.cc @@ -0,0 +1,454 @@ +/* natGCInfo.cc -- Native portion of support for creating heap dumps. + Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + +#include + +#include + +#include + +#ifdef HAVE_PROC_SELF_MAPS +// +// If /proc/self/maps does not exist we assume we are doomed and do nothing. +// +#include +#include +#include +#include +#include +#include + +// +// Boehm GC includes. +// +#ifdef PACKAGE_NAME +#undef PACKAGE_NAME +#endif + +#ifdef PACKAGE_STRING +#undef PACKAGE_STRING +#endif + +#ifdef PACKAGE_TARNAME +#undef PACKAGE_TARNAME +#endif + +#ifdef PACKAGE_VERSION +#undef PACKAGE_VERSION +#endif + +#ifdef TRUE +#undef TRUE +#endif + +#ifdef FALSE +#undef FALSE +#endif + +extern "C" { +#include "private/dbg_mlc.h" + int GC_n_set_marks(hdr* hhdr); + ptr_t GC_clear_stack(ptr_t p); + extern int GC_gcj_kind; + extern int GC_gcj_debug_kind; +} + +#endif + +#ifdef HAVE_PROC_SELF_MAPS + +static int gc_ok = 1; + +typedef struct gc_debug_info +{ + int used; + int free; + int wasted; + int blocks; + FILE* fp; +}; + +static void +GC_print_debug_callback(hblk *h, word user_data) +{ + hdr *hhdr = HDR(h); + size_t bytes = WORDS_TO_BYTES(hhdr -> hb_sz); + + gc_debug_info *pinfo = (gc_debug_info *)user_data; + + fprintf(pinfo->fp, "ptr = %#lx, kind = %d, size = %zd, marks = %d\n", + (unsigned long)h, hhdr->hb_obj_kind, bytes, GC_n_set_marks(hhdr)); +} + +/* + this next section of definitions shouldn't really be here. + copied from boehmgc/allchblk.c +*/ + +# define UNIQUE_THRESHOLD 32 +# define HUGE_THRESHOLD 256 +# define FL_COMPRESSION 8 +# define N_HBLK_FLS (HUGE_THRESHOLD - UNIQUE_THRESHOLD)/FL_COMPRESSION \ + + UNIQUE_THRESHOLD +#ifndef USE_MUNMAP +extern "C" { + extern word GC_free_bytes[N_HBLK_FLS+1]; +} +#endif + +# ifdef USE_MUNMAP +# define IS_MAPPED(hhdr) (((hhdr) -> hb_flags & WAS_UNMAPPED) == 0) +# else /* !USE_MMAP */ +# define IS_MAPPED(hhdr) 1 +# endif /* USE_MUNMAP */ + +static void +GC_print_hblkfreelist_file(FILE *fp) +{ + struct hblk * h; + word total_free = 0; + hdr * hhdr; + word sz; + int i; + + fprintf(fp, "---------- Begin free map ----------\n"); + for (i = 0; i <= N_HBLK_FLS; ++i) + { + h = GC_hblkfreelist[i]; +#ifdef USE_MUNMAP + if (0 != h) + fprintf (fp, "Free list %ld:\n", (unsigned long)i); +#else + if (0 != h) + fprintf (fp, "Free list %ld (Total size %ld):\n", + (unsigned long)i, + (unsigned long)GC_free_bytes[i]); +#endif + while (h != 0) + { + hhdr = HDR(h); + sz = hhdr -> hb_sz; + fprintf (fp, "\t0x%lx size %lu ", (unsigned long)h, + (unsigned long)sz); + total_free += sz; + + if (GC_is_black_listed (h, HBLKSIZE) != 0) + fprintf (fp, "start black listed\n"); + else if (GC_is_black_listed(h, hhdr -> hb_sz) != 0) + fprintf (fp, "partially black listed\n"); + else + fprintf (fp, "not black listed\n"); + + h = hhdr -> hb_next; + } + } +#ifndef USE_MUNMAP + if (total_free != GC_large_free_bytes) + { + fprintf (fp, "GC_large_free_bytes = %lu (INCONSISTENT!!)\n", + (unsigned long) GC_large_free_bytes); + } +#endif + fprintf (fp, "Total of %lu bytes on free list\n", (unsigned long)total_free); + fprintf (fp, "---------- End free map ----------\n"); +} + +static int GC_dump_count = 1; + +static void +GC_print_debug_info_file(FILE* fp) +{ + gc_debug_info info; + + memset(&info, 0, sizeof info); + info.fp = fp; + + if (gc_ok) + GC_gcollect(); + fprintf(info.fp, "---------- Begin block map ----------\n"); + GC_apply_to_all_blocks(GC_print_debug_callback, (word)(void*)(&info)); + //fprintf(fp, "#Total used %d free %d wasted %d\n", info.used, info.free, info.wasted); + //fprintf(fp, "#Total blocks %d; %dK bytes\n", info.blocks, info.blocks*4); + fprintf(info.fp, "---------- End block map ----------\n"); + + //fprintf(fp, "\n***Free blocks:\n"); + //GC_print_hblkfreelist(); +} + +namespace +{ + class __attribute__ ((visibility ("hidden"))) GC_enumerator + { + public: + GC_enumerator(const char *name); + void enumerate(); + private: + FILE* fp; + int bytes_fd; + + void print_address_map(); + void enumerate_callback(struct hblk *h); + static void enumerate_callback_adaptor(struct hblk *h, word dummy); + }; +} + +GC_enumerator::GC_enumerator(const char *name) +{ + bytes_fd = -1; + fp = fopen (name, "w"); + if (!fp) + { + printf ("GC_enumerator failed to open [%s]\n", name); + return; + } + printf ("GC_enumerator saving summary to [%s]\n", name); + + // open heap file + char bytes_name[strlen(name) + 10]; + sprintf (bytes_name, "%s.bytes", name); + bytes_fd = open (bytes_name, O_CREAT|O_TRUNC|O_WRONLY, 0666); + if (bytes_fd <= 0) + { + printf ("GC_enumerator failed to open [%s]\n", bytes_name); + return; + } + printf ("GC_enumerator saving heap contents to [%s]\n", bytes_name); +} + +/* + sample format of /proc/self/maps + + 0063b000-00686000 rw-p 001fb000 03:01 81993 /avtrex/bin/dumppropapp + 00686000-0072e000 rwxp 00000000 00:00 0 + + These are parsed below as: + start -end xxxx xxxxxxxx a:b xxxxxxxxxxxxxxx + +*/ + + +void +GC_enumerator::print_address_map() +{ + FILE* fm; + char buffer[128]; + + fprintf(fp, "---------- Begin address map ----------\n"); + + fm = fopen("/proc/self/maps", "r"); + if (fm == NULL) + { + if (0 == strerror_r (errno, buffer, sizeof buffer)) + fputs (buffer, fp); + } + else + { + while (fgets (buffer, sizeof buffer, fm) != NULL) + { + fputs (buffer, fp); + char *dash = strchr(buffer, '-'); + char *colon = strchr(buffer, ':'); + if (dash && colon && ((ptrdiff_t)strlen(buffer) > (colon - buffer) + 2)) + { + char *endp; + unsigned long start = strtoul(buffer, NULL, 16); + unsigned long end = strtoul(dash + 1, &endp, 16); + unsigned long a = strtoul(colon - 2, NULL, 16); + unsigned long b = strtoul(colon + 1, NULL, 16); + // If it is an anonymous mapping 00:00 and both readable + // and writeable then dump the contents of the mapping + // to the bytes file. Each block has a header of three + // unsigned longs: + // 0 - The number sizeof(unsigned long) to detect endianness and + // structure layout. + // 1 - The offset in VM. + // 2 - The Length in bytes. + // Followed by the bytes. + if (!a && !b && endp < colon && 'r' == endp[1] && 'w' == endp[2]) + { + unsigned long t = sizeof(unsigned long); + write(bytes_fd, (void*)&t, sizeof(t)); + write(bytes_fd, (void*)&start, sizeof(start)); + t = end - start; + write(bytes_fd, (void*)&t, sizeof(t)); + write(bytes_fd, (void*)start, (end - start)); + } + } + } + fclose(fm); + } + fprintf(fp, "---------- End address map ----------\n"); + fflush(fp); +} + +void +GC_enumerator::enumerate() +{ + print_address_map(); + fprintf(fp, "---------- Begin object map ----------\n"); + if (gc_ok) + GC_gcollect(); + GC_apply_to_all_blocks(enumerate_callback_adaptor, + (word)(void*)(this)); + fprintf(fp, "---------- End object map ----------\n"); + fflush(fp); + + GC_print_debug_info_file(fp); + fflush(fp); + GC_print_hblkfreelist_file(fp); + fflush(fp); + + close(bytes_fd); + fclose(fp); + + GC_clear_stack(0); +} + +void +GC_enumerator::enumerate_callback_adaptor(struct hblk *h, + word dummy) +{ + GC_enumerator* pinfo = (GC_enumerator*)dummy; + pinfo->enumerate_callback(h); +} + +void +GC_enumerator::enumerate_callback(struct hblk *h) +{ + hdr * hhdr = HDR(h); + size_t bytes = WORDS_TO_BYTES(hhdr->hb_sz); + int i; + + for (i = 0; i == 0 || (i + bytes <= HBLKSIZE); i += bytes) + { + int inUse = mark_bit_from_hdr(hhdr,BYTES_TO_WORDS(i)); // in use + char *ptr = (char*)h+i; // address + int kind = hhdr->hb_obj_kind; // kind + void *klass = 0; + void *data = 0; + if (kind == GC_gcj_kind + || kind == GC_gcj_debug_kind + || kind == GC_gcj_debug_kind+1) + { + void* v = *(void **)ptr; + if (v) + { + klass = *(void **)v; + data = *(void **)(ptr + sizeof(void*)); + } + } + if (inUse) + fprintf (fp, "used = %d, ptr = %#lx, size = %zd, kind = %d, " + "klass = %#lx, data = %#lx\n", + inUse, (unsigned long)ptr, bytes, kind, + (unsigned long)klass, (unsigned long)data); + } +} + +/* + * Fill in a char[] with low bytes of the string characters. These + * methods may be called while an OutOfMemoryError is being thrown, so + * we cannot call nice java methods to get the encoding of the string. + */ +static void +J2A(::java::lang::String* str, char *dst) +{ + jchar * pchars = JvGetStringChars(str); + jint len = str->length(); + int i; + for (i=0; ilength() + 1]; + J2A(name, n); + + char temp[name->length() + 20]; + sprintf(temp, "%s%03d", n, GC_dump_count++); + FILE* fp = fopen(temp, "w"); + + GC_print_debug_info_file(fp); + + fclose(fp); +} + +void +::gnu::gcj::util::GCInfo::enumerate0 (::java::lang::String * name) +{ + char n[name->length() + 1]; + J2A(name, n); + char temp[name->length() + 20]; + sprintf(temp, "%s%03d", n, GC_dump_count++); + + GC_enumerator x(temp); + x.enumerate(); +} + +static char *oomDumpName = NULL; + +static void * +nomem_handler(size_t size) +{ + if (oomDumpName) + { + char temp[strlen(oomDumpName) + 20]; + sprintf(temp, "%s%03d", temp, GC_dump_count++); + printf("nomem_handler(%zd) called\n", size); + gc_ok--; + GC_enumerator x(temp); + x.enumerate(); + gc_ok++; + } + return (void*)0; +} + +void +::gnu::gcj::util::GCInfo::setOOMDump0 (::java::lang::String * name) +{ + char *oldName = oomDumpName; + oomDumpName = NULL; + free (oldName); + + if (NULL == name) + return; + + char *n = (char *)malloc(name->length() + 1); + + J2A(name, n); + oomDumpName = n; + GC_oom_fn = nomem_handler; +} + +#else // HAVE_PROC_SELF_MAPS + +void +::gnu::gcj::util::GCInfo::dump0 (::java::lang::String * name) +{ + // Do nothing if dumping not supported. +} + +void +::gnu::gcj::util::GCInfo::enumerate0 (::java::lang::String * name) +{ + // Do nothing if dumping not supported. +} + +void +::gnu::gcj::util::GCInfo::setOOMDump0 (::java::lang::String * name) +{ + // Do nothing if dumping not supported. +} + +#endif // HAVE_PROC_SELF_MAPS + diff --git a/libjava/include/config.h.in b/libjava/include/config.h.in index a4e013d735f..2c025a27af5 100644 --- a/libjava/include/config.h.in +++ b/libjava/include/config.h.in @@ -232,6 +232,9 @@ /* Define if you have /proc/self/exe */ #undef HAVE_PROC_SELF_EXE +/* Define if you have /proc/self/maps */ +#undef HAVE_PROC_SELF_MAPS + /* Define if using POSIX threads that have the mutexattr functions. */ #undef HAVE_PTHREAD_MUTEXATTR_INIT @@ -375,6 +378,9 @@ /* Define to 1 if you have the file `AC_File'. */ #undef HAVE__PROC_SELF_EXE +/* Define to 1 if you have the file `AC_File'. */ +#undef HAVE__PROC_SELF_MAPS + /* Define as const if the declaration of iconv() needs const. */ #undef ICONV_CONST diff --git a/libjava/scripts/makemake.tcl b/libjava/scripts/makemake.tcl index 78259a32af2..5a60097d698 100755 --- a/libjava/scripts/makemake.tcl +++ b/libjava/scripts/makemake.tcl @@ -42,6 +42,7 @@ set package_map(.) package # These are ignored in Classpath. set package_map(gnu/test) ignore set package_map(gnu/javax/swing/plaf/gtk) ignore +set package_map(gnu/gcj/tools/gc_analyze) ignore set package_map(gnu/java/awt/peer/swing) bc diff --git a/libjava/sources.am b/libjava/sources.am index 0c9953f33b9..79b8832bb43 100644 --- a/libjava/sources.am +++ b/libjava/sources.am @@ -555,7 +555,9 @@ gnu/gcj/tools/gcj_dbtool.list: $(gnu_gcj_tools_gcj_dbtool_source_files) gnu_gcj_util_source_files = \ -gnu/gcj/util/Debug.java +gnu/gcj/util/Debug.java \ +gnu/gcj/util/GCInfo.java \ +gnu/gcj/util/UtilPermission.java gnu_gcj_util_header_files = $(patsubst %.java,%.h,$(gnu_gcj_util_source_files))