i cant belive this works
authoradam <adam@megacz.com>
Wed, 25 Feb 2004 10:56:33 +0000 (10:56 +0000)
committeradam <adam@megacz.com>
Wed, 25 Feb 2004 10:56:33 +0000 (10:56 +0000)
darcs-hash:20040225105633-5007d-39212ae26c25a5fed3012ac2b07553f0a60e19b5.gz

Makefile
src/org/ibex/util/BytecodePruner.java

index 5fb91ff..3acc98c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -259,17 +259,7 @@ build/$(platform)/$(target_bin): upstream/jpeg-6b/build-$(target)/libjpeg.a
 #                              -fomit-frame-pointer \
 #                              -fno-force-mem \
 #                              -fno-force-addr \
-#                              -fbranch-probabilities \
-#                              -fno-schedule-insns \
-#                              -fno-optimize-sibling-calls \
-#                              -fno-if-conversion \
-#                              -fno-thread-jumps \
-#                              -foptimize-static-class-initialization \
-#                              -fno-store-check \
-#                              -fno-bounds-check \
 #                              -fmerge-all-constants \
-#                              -fno-inline-functions \
-#                              -finline-limit=1 \
 
        cd build/pruned;                                                  \
                for A in `find . -name \*.class -or -name \*.java`; do    \
@@ -293,10 +283,9 @@ build/$(platform)/$(target_bin): upstream/jpeg-6b/build-$(target)/libjpeg.a
                $(shell pwd)/upstream/install/$(target)/bin/ar cq        \
                        $(shell pwd)/build/$(platform)/natibex.a         \
                        `cat $(shell pwd)/.natbins`
-# --relax,-O2,--no-whole-archive,
+# -O2,--relax,
        PATH=upstream/install/bin:$$PATH upstream/install/bin/$(target)-gcj          \
-               -Wl,--no-gc-sections,--noinhibit-exec,-rpath,upstream/install/$(target)/lib     \
-               -Wl,-nostdlib,--eh-frame-hdr,-m,elf_i386,-dynamic-linker,/lib/ld-linux.so.2 \
+               -Wl,--no-gc-sections,--noinhibit-exec                                \
                --main=org.ibex.plat.$(platform)                                     \
                -Lupstream/install/$(target)/lib                                     \
                -Lupstream/install/lib                                               \
@@ -308,9 +297,7 @@ build/$(platform)/$(target_bin): upstream/jpeg-6b/build-$(target)/libjpeg.a
                upstream/jpeg-6b/build-$(target)/libjpeg.a                           \
                $(link_flags)                                                        \
                upstream/gcc-3.3/build-$(target)/$(target)/boehm-gc/.libs/libgcjgc.a \
-               -lz -ldl -lgcc -lm -lpthread -ldl -lgcc -lc -lgcc \
-               upstream/install/bin/../lib/gcc-lib/i686-pc-linux-gnu/3.3/crtend.o \
-               upstream/install/bin/../lib/gcc-lib/i686-pc-linux-gnu/3.3/../../../../i686-pc-linux-gnu/lib/crtn.o \
+               -lz -ldl                                                             \
                -o $@
 #      strip build/Linux/ibex.linux
 #      ls -l build/Linux/ibex.linux
index f9a3b64..a04a77a 100644 (file)
@@ -11,13 +11,13 @@ import org.apache.bcel.util.*;
 public class BytecodePruner {
 
     public static final boolean deleteMethods = false;
-
-    // FIXME
     public static SyntheticRepository repo = null;
-
     public static HashSet dest = new HashSet();
-
     public static String outdir = ".";
+    public static Hashtable subclasses = new Hashtable();
+    public static int level = 0;
+
+    public BytecodePruner() { }
 
     public void loadAllMethods(String classname) throws Exception {
         visitJavaClass(repo.loadClass(classname));
@@ -40,6 +40,7 @@ public class BytecodePruner {
     public void loadMethod(String classAndMethodName) throws Exception {
         String classname = classAndMethodName.substring(0, classAndMethodName.lastIndexOf('.'));
         String methodname = classAndMethodName.substring(classAndMethodName.lastIndexOf('.') + 1);
+        if (classname.endsWith("." + methodname)) methodname = "<init>";
         visitJavaClass(repo.loadClass(classname));
         Method[] meths = getMethods(repo.loadClass(classname));
         for(int i=0; i<meths.length; i++)
@@ -75,8 +76,6 @@ public class BytecodePruner {
         // we call start(), but the VM calls run()...
         bcp.loadMethod("java.lang.Thread.run");
         bcp.loadAllMethods("java.lang.SecurityContext");
-        //bcp.visitJavaClass(repo.loadClass("java.awt.AWTPermission"));
-        //bcp.visitJavaClass(repo.loadClass("gnu.classpath.Configuration"));
         bcp.loadAllMethods("java.lang.ThreadDeath");
 
         bcp.loadAllMethods("java.util.Hashtable$HashIterator");
@@ -125,8 +124,6 @@ public class BytecodePruner {
         }
     }
 
-    public BytecodePruner() { }
-
     public static void dump(JavaClass clazz) throws Exception {
         if (!dest.contains(clazz)) return;
 
@@ -150,10 +147,10 @@ public class BytecodePruner {
         int numMethods = 0;
         boolean good = false;
         for(int i=0; i<methods.length; i++) {
-            if (dest.contains(methods[i]) ||
-                clazz.getClassName().startsWith("java.io.FileDescriptor")
+            if (dest.contains(methods[i])
                 || clazz.getClassName().startsWith("gnu.gcj.runtime.")
-                || clazz.getClassName().startsWith("java.lang.")
+                || (clazz.getClassName().startsWith("java.lang.") &&
+                    !(clazz.getClassName().equals("java.lang.System") && methods[i].getName().equals("runFinalizersOnExit")))
                 ) {
                 if (!methods[i].getName().equals("<clinit>")) good = true;
             } else {
@@ -217,13 +214,7 @@ public class BytecodePruner {
         load(((ObjectType)t).getClassName());
     }
 
-    // hashtable of hashsets
-    public static Hashtable subclasses = new Hashtable();
-
-    public String getMethodSignature(Method m, ConstantPoolGen cpg) throws Exception {
-        return m.getName() + m.getSignature();
-    }
-
+    public String getMethodSignature(Method m, ConstantPoolGen cpg) throws Exception { return m.getName() + m.getSignature(); }
     public String getMethodSignature(InvokeInstruction ii, ConstantPoolGen cpg) throws Exception {
         String sig = "";
         Type[] argtypes = ii.getArgumentTypes(cpg);
@@ -231,23 +222,15 @@ public class BytecodePruner {
         return ii.getMethodName(cpg) + "(" + sig + ")" + ii.getReturnType(cpg).getSignature();
     }
 
-    public static int level = 0;
     public void visitJavaMethod(JavaClass jc, Method method) throws Exception {
         visitJavaClass(jc);
-        /*
-        if (jc.getClassName().equals("java.util.Date") && method.getName().equals("readObject")) return;
-        */
         if (jc.getClassName().indexOf("SharedLib") != -1) return;
         if (jc.getClassName().indexOf("Datagram") != -1) return;
-        if (dest.contains(method)) return;
 
-        /*
-        // HACK (okay?)
-        // not inferrable: CNI call to abstract method
-        if (jc.getClassName().equals("java.util.TimeZone") && method.getName().equals("getDefaultTimeZoneId"))
-            loadMethod("java.util.SimpleTimeZone.useDaylightTime");
-        */
-        
+        // gcj bug; gcj can't compile this method from a .class file input; I have no idea why
+        if (jc.getClassName().equals("java.lang.System") && method.getName().equals("runFinalizersOnExit")) return;
+
+        if (dest.contains(method)) return;
         dest.add(method);
         level += 2;
         for(int i=0; i<level; i++) System.out.print(" ");
@@ -299,6 +282,7 @@ public class BytecodePruner {
             }
         }
         level -= 2;
+        // FIXME: move this to the top
         load(method.getReturnType());
         Type[] argtypes = method.getArgumentTypes();
         for(int i=0; i<argtypes.length; i++) load(argtypes[i]);
@@ -333,8 +317,8 @@ public class BytecodePruner {
             ((HashSet)subclasses.get(interfaces[i])).add(clazz);
         }
 
-        if (clazz.getClassName().startsWith("org.ibex."))
-            loadAllMethods(clazz.getClassName());
+        // FIXME
+        if (clazz.getClassName().startsWith("org.ibex.")) loadAllMethods(clazz.getClassName());
 
         for(JavaClass sup = superclass; sup != null; sup = sup.getSuperClass()) {
             visitJavaClass(sup);
@@ -345,16 +329,9 @@ public class BytecodePruner {
             remarkMethods(interfaces[i], clazz, cpg);
         }
 
-        Field[] fields = clazz.getFields();
-        for(int i=0; i<fields.length; i++) {
-            if (!fields[i].isStatic())
-                visitJavaField(fields[i]);
-        }
-
         Method[] methods = getMethods(clazz);
         for(int i=0; i<methods.length; i++) {
             if (methods[i].getName().equals("<clinit>")) visitJavaMethod(clazz, methods[i]);
-            // only if ctor reachable (?)
             if (methods[i].getName().equals("equals")) visitJavaMethod(clazz, methods[i]);
             if (methods[i].getName().equals("hashCode")) visitJavaMethod(clazz, methods[i]);
             if (methods[i].getName().equals("finalize")) visitJavaMethod(clazz, methods[i]);