# -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 \
$(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 \
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
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));
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++)
// 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");
}
}
- public BytecodePruner() { }
-
public static void dump(JavaClass clazz) throws Exception {
if (!dest.contains(clazz)) return;
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 {
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);
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(" ");
}
}
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]);
((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);
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]);