[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[cp-patches] Rewrite split-for-gcj
From: |
Andrew Haley |
Subject: |
[cp-patches] Rewrite split-for-gcj |
Date: |
Thu, 11 Aug 2005 19:14:45 +0100 |
split-for-gcj takes an ungodly amount of time. This is about 20x
faster. As far as I can see it does the same thing as the previous
version.
Andrew.
2005-08-11 Andrew Haley <address@hidden>
* lib/split-for-gcj.sh: Delete.
* configure.ac: Add split-for-gcj.awk
* lib/split-for-gcj.awk.in: New file.
* lib/gen-classlist.sh.in: Call split-for-gcj.awk.
Index: configure.ac
===================================================================
RCS file: /cvsroot/classpath/classpath/configure.ac,v
retrieving revision 1.97
diff -u -r1.97 configure.ac
--- configure.ac 1 Aug 2005 22:28:34 -0000 1.97
+++ configure.ac 11 Aug 2005 18:05:59 -0000
@@ -160,7 +160,7 @@
dnl Initialize libtool
AC_DISABLE_STATIC
AC_PROG_LIBTOOL
-dnl AC_PROG_AWK
+AC_PROG_AWK
AC_PROG_CC
AC_PROG_CPP
@@ -465,6 +465,7 @@
scripts/classpath.spec
lib/Makefile
lib/gen-classlist.sh
-examples/Makefile])
+examples/Makefile
+lib/split-for-gcj.awk])
AC_CONFIG_COMMANDS([gen-classlist],[chmod 755 lib/gen-classlist.sh])
AC_OUTPUT
Index: lib/gen-classlist.sh.in
===================================================================
RCS file: /cvsroot/classpath/classpath/lib/gen-classlist.sh.in,v
retrieving revision 1.28
diff -u -r1.28 gen-classlist.sh.in
--- lib/gen-classlist.sh.in 10 Aug 2005 22:37:27 -0000 1.28
+++ lib/gen-classlist.sh.in 11 Aug 2005 18:05:59 -0000
@@ -87,7 +87,7 @@
done
if test -n "$GCJ"; then
- ${top_srcdir}/lib/split-for-gcj.sh
+ @AWK@ -f ${top_builddir}/lib/split-for-gcj.awk || exit 1
fi
fi
Index: lib/split-for-gcj.awk.in
===================================================================
RCS file: lib/split-for-gcj.awk.in
diff -N lib/split-for-gcj.awk.in
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ lib/split-for-gcj.awk.in 11 Aug 2005 18:05:59 -0000
@@ -0,0 +1,74 @@
+#! @AWK@ -f
+
+# This script is used when compiling Classpath with gcj. The idea is
+# to compile one package at a time, and only recompile packages when
+# actually required.
+
+# We build java->class by package so we need to know what .java files
+# correspond to what package.
+
+# We have a .stamp file for each package; this is the makefile target.
+# We also have a .list file for each package, which lists all the
+# input files in that package.
+
+# gen-classlist.sh makes a list of all the .java files we are going to compile.
+
+# This script generates Makefile.deps, which looks like this:
+#
+# java/awt/AWTUtilities.class: lists/java-awt.stamp
+# lists/java-awt.list:
/home/aph/gcc/gcc/libjava/classpath/gnu/java/awt/AWTUtilities.java
+# java/awt/BitMaskExtent.class: lists/java-awt.stamp
+# lists/java-awt.list:
/home/aph/gcc/gcc/libjava/classpath/gnu/java/awt/BitMaskExtent.java
+# java/awt/BitwiseXORComposite.class: lists/java-awt.stamp
+# lists/java-awt.list:
/home/aph/gcc/gcc/libjava/classpath/gnu/java/awt/BitwiseXORComposite.java
+
+# This uses a somewhat hacky procedure for finding the package of a
+# given file.
+
+BEGIN {
+ print "Splitting for gcj"
+ system ("rm -f Makefile.deps > /dev/null 2>&1")
+ system ("test -d lists || mkdir lists")
+
+ i = 0
+ while (getline classes[i] < "classes")
+ i++
+ dirs[0] = "java"
+ dirs[1] = "javax"
+ dirs[2] = "gnu"
+ dirs[3] = "org"
+ for (dir in dirs)
+ {
+ for (file in classes)
+ {
+ pkg = classes[file]
+ startpos = match (pkg, "/" dirs[dir] "/")
+ if (startpos)
+ {
+ pkg = substr (pkg, startpos+1)
+ sub ("/[^/]*\\.java", "", pkg)
+ list = pkg
+ gsub ("/", "-", list)
+ list = "lists/" list
+ print classes[file] >> list ".list.1"
+
+ classfile = classes[file]
+ sub ("\\.java$", ".class", classfile)
+ classfile = substr (classfile, match (classfile, dirs[dir] "/"))
+ print classfile ": " list ".stamp" >> "Makefile.deps"
+ print list ".list: " classes[file] >> "Makefile.deps"
+ }
+ }
+ }
+
+ # Only update a .list file if it changed.
+ system ("for file in lists/*.list.1; do " \
+ "real=`echo \"$file\" | sed -e 's/.1$//'`;" \
+ "if cmp -s $real $file; then " \
+ " rm $file; " \
+ "else " \
+ " mv $file $real; " \
+ "fi " \
+ "done")
+}
+
- [cp-patches] Rewrite split-for-gcj,
Andrew Haley <=