even better
authoradam <adam@megacz.com>
Wed, 25 Feb 2004 12:23:51 +0000 (12:23 +0000)
committeradam <adam@megacz.com>
Wed, 25 Feb 2004 12:23:51 +0000 (12:23 +0000)
darcs-hash:20040225122351-5007d-11142349d72afb9816072a471b7a7cd6629c348d.gz

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

index 3acc98c..b605550 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -283,9 +283,8 @@ 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`
                $(shell pwd)/upstream/install/$(target)/bin/ar cq        \
                        $(shell pwd)/build/$(platform)/natibex.a         \
                        `cat $(shell pwd)/.natbins`
-# -O2,--relax,
        PATH=upstream/install/bin:$$PATH upstream/install/bin/$(target)-gcj          \
        PATH=upstream/install/bin:$$PATH upstream/install/bin/$(target)-gcj          \
-               -Wl,--no-gc-sections,--noinhibit-exec                                \
+               -Wl,-O2,--relax,--gc-sections,--noinhibit-exec                       \
                --main=org.ibex.plat.$(platform)                                     \
                -Lupstream/install/$(target)/lib                                     \
                -Lupstream/install/lib                                               \
                --main=org.ibex.plat.$(platform)                                     \
                -Lupstream/install/$(target)/lib                                     \
                -Lupstream/install/lib                                               \
index 2aed806..7f6f248 100644 (file)
@@ -385,7 +385,7 @@ public class HTTP {
         
         if (h.get("AUTHTYPE").equals("Basic")) {
             if (authCache.get(originalUrl) != null) throw new HTTPException("username/password rejected");
         
         if (h.get("AUTHTYPE").equals("Basic")) {
             if (authCache.get(originalUrl) != null) throw new HTTPException("username/password rejected");
-            authCache.put(originalUrl, "Basic " + new String(Base64.encode(userInfo.getBytes("US-ASCII"))));
+            authCache.put(originalUrl, "Basic " + new String(Base64.encode(userInfo.getBytes("UTF8"))));
             
         } else if (h.get("AUTHTYPE").equals("Digest")) {
             if (authCache.get(originalUrl) != null && !"true".equals(h.get("stale")))
             
         } else if (h.get("AUTHTYPE").equals("Digest")) {
             if (authCache.get(originalUrl) != null && !"true".equals(h.get("stale")))
@@ -432,7 +432,7 @@ public class HTTP {
 
         if (style.equals("Basic")) {
             Proxy.Authorization.authorization2 =
 
         if (style.equals("Basic")) {
             Proxy.Authorization.authorization2 =
-                "Basic " + new String(Base64.encode(Proxy.Authorization.authorization.getBytes("US-ASCII")));
+                "Basic " + new String(Base64.encode(Proxy.Authorization.authorization.getBytes("UTF8")));
             
         } else if (style.equals("Digest")) {
             String A1 = Proxy.Authorization.authorization.substring(0, userInfo.indexOf(':')) + ":" + h.get("realm") + ":" +
             
         } else if (style.equals("Digest")) {
             String A1 = Proxy.Authorization.authorization.substring(0, userInfo.indexOf(':')) + ":" + h.get("realm") + ":" +
@@ -633,7 +633,7 @@ public class HTTP {
     }
 
     private String H(String s) throws IOException {
     }
 
     private String H(String s) throws IOException {
-        byte[] b = s.getBytes("US-ASCII");
+        byte[] b = s.getBytes("UTF8");
         MD5Digest md5 = new MD5Digest();
         md5.update(b, 0, b.length);
         byte[] out = new byte[md5.getDigestSize()];
         MD5Digest md5 = new MD5Digest();
         md5.update(b, 0, b.length);
         byte[] out = new byte[md5.getDigestSize()];
@@ -1037,13 +1037,13 @@ public class HTTP {
              */
             private static byte[] lmHash(String password) {
                 /*
              */
             private static byte[] lmHash(String password) {
                 /*
-                byte[] oemPassword = password.toUpperCase().getBytes("US-ASCII");
+                byte[] oemPassword = password.toUpperCase().getBytes("UTF8");
                 int length = java.lang.Math.min(oemPassword.length, 14);
                 byte[] keyBytes = new byte[14];
                 System.arraycopy(oemPassword, 0, keyBytes, 0, length);
                 Key lowKey = createDESKey(keyBytes, 0);
                 Key highKey = createDESKey(keyBytes, 7);
                 int length = java.lang.Math.min(oemPassword.length, 14);
                 byte[] keyBytes = new byte[14];
                 System.arraycopy(oemPassword, 0, keyBytes, 0, length);
                 Key lowKey = createDESKey(keyBytes, 0);
                 Key highKey = createDESKey(keyBytes, 7);
-                byte[] magicConstant = "KGS!@#$%".getBytes("US-ASCII");
+                byte[] magicConstant = "KGS!@#$%".getBytes("UTF8");
                 Cipher des = Cipher.getInstance("DES/ECB/NoPadding");
                 des.init(Cipher.ENCRYPT_MODE, lowKey);
                 byte[] lowHash = des.doFinal(magicConstant);
                 Cipher des = Cipher.getInstance("DES/ECB/NoPadding");
                 des.init(Cipher.ENCRYPT_MODE, lowKey);
                 byte[] lowHash = des.doFinal(magicConstant);
index a04a77a..18231fb 100644 (file)
@@ -7,7 +7,8 @@ import org.apache.bcel.generic.*;
 import org.apache.bcel.classfile.*;
 import org.apache.bcel.util.*;
 
 import org.apache.bcel.classfile.*;
 import org.apache.bcel.util.*;
 
-// Field pruning
+// can we drop nio?  in natibex.a?
+
 public class BytecodePruner {
 
     public static final boolean deleteMethods = false;
 public class BytecodePruner {
 
     public static final boolean deleteMethods = false;
@@ -60,11 +61,7 @@ public class BytecodePruner {
                 } else {
                     JavaClass cl = repo.loadClass(s[i].substring(0, s[i].lastIndexOf('.')));;
                     bcp.visitJavaClass(cl);
                 } else {
                     JavaClass cl = repo.loadClass(s[i].substring(0, s[i].lastIndexOf('.')));;
                     bcp.visitJavaClass(cl);
-                    Method[] meths = getMethods(cl);
-                    for(int j=0; j<meths.length; j++) {
-                        if (meths[j].getName().equals(s[i].substring(s[i].lastIndexOf('.') + 1)))
-                            bcp.visitJavaMethod(cl, meths[j]);
-                    }
+                    bcp.loadMethod(s[i]);
                 }
             } catch (Exception e) {
                 System.out.println("WARNING: couldn't load class for " + s[i]);
                 }
             } catch (Exception e) {
                 System.out.println("WARNING: couldn't load class for " + s[i]);
@@ -86,18 +83,20 @@ public class BytecodePruner {
         bcp.loadMethod("java.lang.Thread.run");                // we call start(), but the VM calls run()...
         bcp.loadMethod("java.lang.ref.Reference.enqueue");     // the GC calls this directly
         bcp.loadAllMethods("gnu.gcj.runtime.StringBuffer");    // the compiler emits calls directly to this class
         bcp.loadMethod("java.lang.Thread.run");                // we call start(), but the VM calls run()...
         bcp.loadMethod("java.lang.ref.Reference.enqueue");     // the GC calls this directly
         bcp.loadAllMethods("gnu.gcj.runtime.StringBuffer");    // the compiler emits calls directly to this class
+        bcp.loadAllMethods("gnu.gcj.convert.Input_UTF8");      // retrieved via reflection
+        bcp.loadAllMethods("gnu.gcj.convert.Output_UTF8");     // retrieved via reflection
+
 
         bcp.loadAllMethods("gnu.gcj.protocol.http.Handler");
         bcp.loadAllMethods("gnu.gcj.protocol.file.Handler");
         bcp.loadAllMethods("gnu.gcj.protocol.core.Handler");
         bcp.loadAllMethods("gnu.gcj.protocol.jar.Handler");
 
         bcp.loadAllMethods("gnu.gcj.protocol.http.Handler");
         bcp.loadAllMethods("gnu.gcj.protocol.file.Handler");
         bcp.loadAllMethods("gnu.gcj.protocol.core.Handler");
         bcp.loadAllMethods("gnu.gcj.protocol.jar.Handler");
-        bcp.loadAllMethods("gnu.gcj.convert.Input_UTF8");      // retrieved via reflection
-        bcp.loadAllMethods("gnu.gcj.convert.Output_UTF8");     // retrieved via reflection
         bcp.loadAllMethods("gnu.gcj.convert.Input_8859_1");    // retrieved via reflection
         bcp.loadAllMethods("gnu.gcj.convert.Output_8859_1");   // retrieved via reflection
         bcp.loadAllMethods("gnu.gcj.convert.Input_8859_1");    // retrieved via reflection
         bcp.loadAllMethods("gnu.gcj.convert.Output_8859_1");   // retrieved via reflection
-        bcp.loadAllMethods("gnu.gcj.convert.Input_ASCII");    // retrieved via reflection
-        bcp.loadAllMethods("gnu.gcj.convert.Output_ASCII");   // retrieved via reflection
-        
+        bcp.loadAllMethods("gnu.gcj.convert.Input_ASCII");     // retrieved via reflection
+        bcp.loadAllMethods("gnu.gcj.convert.Output_ASCII");    // retrieved via reflection
+
+
         bcp.loadAllMethods("java.util.Date");
         bcp.loadAllMethods("java.text.DateFormat");
         bcp.loadAllMethods("java.text.NumberFormat");
         bcp.loadAllMethods("java.util.Date");
         bcp.loadAllMethods("java.text.DateFormat");
         bcp.loadAllMethods("java.text.NumberFormat");
@@ -108,6 +107,8 @@ public class BytecodePruner {
                 bcp.visitJavaMethod(repo.loadClass("org.ibex.plat.Linux"), meths[i]);
         }
         System.out.println();
                 bcp.visitJavaMethod(repo.loadClass("org.ibex.plat.Linux"), meths[i]);
         }
         System.out.println();
+
+        // FIXME: insert "the null class" when eliminating?
         System.out.println("Dumping...");
 
         StringTokenizer st = new StringTokenizer(s[0], ":");
         System.out.println("Dumping...");
 
         StringTokenizer st = new StringTokenizer(s[0], ":");
@@ -134,24 +135,30 @@ public class BytecodePruner {
         cg.setMinor(0);
         cg.setConstantPool(newcpg);
 
         cg.setMinor(0);
         cg.setConstantPool(newcpg);
 
+        boolean constructed = false;
+        Method[] methods = getMethods(clazz);
+        for(int i=0; i<methods.length; i++)
+            if (dest.contains(methods[i]) && methods[i].getName().equals("<init>"))
+                constructed = true;
+
         // we can only prune static fields (to avoid altering object layout, which is hardcoded into
         // CNI code), but that's okay since instance fields don't contribute to binary size
         Field[] fields = clazz.getFields();
         // we can only prune static fields (to avoid altering object layout, which is hardcoded into
         // CNI code), but that's okay since instance fields don't contribute to binary size
         Field[] fields = clazz.getFields();
-        for(int i=0; i<fields.length; i++)
+        for(int i=0; i<fields.length; i++) {
             if (!dest.contains(fields[i]) && fields[i].isStatic()) { 
                 System.out.println("  pruning field " + clazz.getClassName() + "." + fields[i].getName());
                 cg.removeField(fields[i]);
             }
             if (!dest.contains(fields[i]) && fields[i].isStatic()) { 
                 System.out.println("  pruning field " + clazz.getClassName() + "." + fields[i].getName());
                 cg.removeField(fields[i]);
             }
+            if (!constructed && !fields[i].isStatic()) {
+                System.out.println("  unconstructed: pruning field " + clazz.getClassName() + "." + fields[i].getName());
+                //cg.removeField(fields[i]);
+            }
+        }
 
 
-        Method[] methods = getMethods(clazz);
         int numMethods = 0;
         boolean good = false;
         for(int i=0; i<methods.length; i++) {
         int numMethods = 0;
         boolean good = false;
         for(int i=0; i<methods.length; i++) {
-            if (dest.contains(methods[i])
-                || clazz.getClassName().startsWith("gnu.gcj.runtime.")
-                || (clazz.getClassName().startsWith("java.lang.") &&
-                    !(clazz.getClassName().equals("java.lang.System") && methods[i].getName().equals("runFinalizersOnExit")))
-                ) {
+            if (dest.contains(methods[i]) /*&& (constructed || !methods[i].isStatic())*/) {
                 if (!methods[i].getName().equals("<clinit>")) good = true;
             } else {
                 if (methods[i].getCode() == null) {
                 if (!methods[i].getName().equals("<clinit>")) good = true;
             } else {
                 if (methods[i].getCode() == null) {
@@ -180,9 +187,16 @@ public class BytecodePruner {
             }
         }
                                
             }
         }
                                
-        new File(outdir + "/" + new File(clazz.getClassName().replace('.', '/')).getParent()).mkdirs();
-        System.out.println("dumping " + clazz.getClassName());
-        cg.getJavaClass().dump(outdir + "/" + clazz.getClassName().replace('.', '/') + ".class");
+        // FIXME: remove this
+        good = true;
+
+        if (!good) {
+            System.out.println("DROPPING " + clazz.getClassName());
+        } else {
+            new File(outdir + "/" + new File(clazz.getClassName().replace('.', '/')).getParent()).mkdirs();
+            System.out.println("dumping " + clazz.getClassName());
+            cg.getJavaClass().dump(outdir + "/" + clazz.getClassName().replace('.', '/') + ".class");
+        }
     }
 
     public JavaClass sig2class(String sig) throws Exception {
     }
 
     public JavaClass sig2class(String sig) throws Exception {
@@ -267,7 +281,10 @@ public class BytecodePruner {
                 InvokeInstruction ii = (InvokeInstruction)instr;
                 String ii_sig = getMethodSignature(ii, cpg);
                 JavaClass c = sig2class(ii.getLoadClassType(cpg).getSignature());
                 InvokeInstruction ii = (InvokeInstruction)instr;
                 String ii_sig = getMethodSignature(ii, cpg);
                 JavaClass c = sig2class(ii.getLoadClassType(cpg).getSignature());
+
+                // FIXME: removable?
                 load(ii.getReturnType(cpg));
                 load(ii.getReturnType(cpg));
+
                 load(ii.getType(cpg));
                 Method[] meths = getMethods(c);
                 boolean good = false;
                 load(ii.getType(cpg));
                 Method[] meths = getMethods(c);
                 boolean good = false;
@@ -282,7 +299,10 @@ public class BytecodePruner {
             }
         }
         level -= 2;
             }
         }
         level -= 2;
+
         // FIXME: move this to the top
         // FIXME: move this to the top
+
+        // FIXME: removable?
         load(method.getReturnType());
         Type[] argtypes = method.getArgumentTypes();
         for(int i=0; i<argtypes.length; i++) load(argtypes[i]);
         load(method.getReturnType());
         Type[] argtypes = method.getArgumentTypes();
         for(int i=0; i<argtypes.length; i++) load(argtypes[i]);
@@ -356,8 +376,8 @@ public class BytecodePruner {
         for(int i=0; i<subclasses.length; i++) {
             JavaClass subclass = (JavaClass)subclasses[i];
             if (subclass == c) continue;
         for(int i=0; i<subclasses.length; i++) {
             JavaClass subclass = (JavaClass)subclasses[i];
             if (subclass == c) continue;
-            for(int j=0; j<level; j++) System.out.print(" ");
-            System.out.println("  [subclass " + subclass.getClassName() + "]");
+            //for(int j=0; j<level; j++) System.out.print(" ");
+            //System.out.println("  [subclass " + subclass.getClassName() + "]");
             markMethodInSubclasses(c, m, subclass, cpg);
         }
     }
             markMethodInSubclasses(c, m, subclass, cpg);
         }
     }