classpath-patches
[Top][All Lists]
Advanced

[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")
+}
+




reply via email to

[Prev in Thread] Current Thread [Next in Thread]