use of com.jopdesign.common.MethodInfo in project jop by jop-devel.
the class DFATool method createPrologue.
private MethodInfo createPrologue() {
// find ordering for class initializers
ClinitOrder c = new ClinitOrder();
appInfo.iterate(c);
List<ClassInfo> order = c.findOrder();
MethodInfo mainClass = appInfo.getMainMethod();
// create prologue
return buildPrologue(mainClass, statements, flow, order);
}
use of com.jopdesign.common.MethodInfo in project jop by jop-devel.
the class DFATool method buildPrologue.
private MethodInfo buildPrologue(MethodInfo mainMethod, List<InstructionHandle> statements, Flow flow, List<ClassInfo> clinits) {
// we use a prologue sequence for startup
InstructionList prologue = new InstructionList();
ConstantPoolGen prologueCP = mainMethod.getConstantPoolGen();
Instruction instr;
int idx;
// add magic initializers to prologue sequence
if (!analyzeBootMethod) {
instr = new ICONST(0);
prologue.append(instr);
instr = new ICONST(0);
prologue.append(instr);
idx = prologueCP.addMethodref("com.jopdesign.sys.GC", "init", "(II)V");
instr = new INVOKESTATIC(idx);
prologue.append(instr);
}
// add class initializers
for (ClassInfo clinit : clinits) {
MemberID cSig = appInfo.getClinitSignature(clinit.getClassName());
idx = prologueCP.addMethodref(cSig.getClassName(), cSig.getMemberName(), cSig.getDescriptor().toString());
instr = new INVOKESTATIC(idx);
prologue.append(instr);
}
if (analyzeBootMethod) {
// Let's just analyze the full boot method, so that the callgraph-builder is happy.
// Doing this after clinit, so that we have DFA infos on fields in JVMHelp.init()
idx = prologueCP.addMethodref("com.jopdesign.sys.Startup", "boot", "()V");
instr = new INVOKESTATIC(idx);
prologue.append(instr);
}
// add main method
instr = new ACONST_NULL();
prologue.append(instr);
idx = prologueCP.addMethodref(mainMethod.getClassName(), mainMethod.getShortName(), mainMethod.getDescriptor().toString());
instr = new INVOKESTATIC(idx);
prologue.append(instr);
// // invoke startMission() to ensure analysis of threads
// idx = prologueCP.addMethodref("joprt.RtThread", "startMission", "()V");
// instr = new INVOKESTATIC(idx);
// prologue.append(instr);
instr = new NOP();
prologue.append(instr);
prologue.setPositions(true);
// add prologue to program structure
for (Iterator l = prologue.iterator(); l.hasNext(); ) {
InstructionHandle handle = (InstructionHandle) l.next();
statements.add(handle);
if (handle.getInstruction() instanceof GOTO) {
GOTO g = (GOTO) handle.getInstruction();
flow.addEdge(new FlowEdge(handle, g.getTarget(), FlowEdge.NORMAL_EDGE));
} else if (handle.getNext() != null) {
flow.addEdge(new FlowEdge(handle, handle.getNext(), FlowEdge.NORMAL_EDGE));
}
}
MemberID pSig = new MemberID(prologueName, Descriptor.parse(prologueSig));
MethodInfo mi = mainMethod.getClassInfo().createMethod(pSig, null, prologue);
mi.setAccessType(AccessType.ACC_PRIVATE);
return mi;
}
use of com.jopdesign.common.MethodInfo in project jop by jop-devel.
the class CallGraph method getReachableImplementationsSet.
/**
* Retrieve non-abstract methods reachable from the given call graph node.
* All callgraph nodes reachable from nodes representing the given a method are collected
* @param cgNode where to start
* @return a list of all reachable implementations, sorted in DFS order
*/
public Set<MethodInfo> getReachableImplementationsSet(ExecutionContext cgNode) {
Set<MethodInfo> implemented = new LinkedHashSet<MethodInfo>();
DepthFirstIterator<ExecutionContext, ContextEdge> ti = new DepthFirstIterator<ExecutionContext, ContextEdge>(callGraph, cgNode);
ti.setCrossComponentTraversal(false);
while (ti.hasNext()) {
MethodInfo m = ti.next().getMethodInfo();
if (m == null)
throw new AssertionError("Abstract method in callgraph");
implemented.add(m);
}
return implemented;
}
use of com.jopdesign.common.MethodInfo in project jop by jop-devel.
the class CallGraph method getLargestMethod.
public ControlFlowGraph getLargestMethod() {
ControlFlowGraph largest = null;
int maxBytes = 0;
for (ExecutionContext rootNode : rootNodes) {
for (MethodInfo mi : this.getReachableImplementationsSet(rootNode.getMethodInfo())) {
int bytes = mi.getCode().getNumberOfBytes();
if (bytes > maxBytes) {
largest = mi.getCode().getControlFlowGraph(false);
maxBytes = bytes;
}
}
}
return largest;
}
use of com.jopdesign.common.MethodInfo in project jop by jop-devel.
the class CallGraph method getReachableImplementationsSet.
/**
* Retrieve non-abstract methods reachable from the given method.
* All callgraph nodes reachable from nodes representing the given a method are collected
*
* @param rootMethod start method
* @return a list of all reachable methods, sorted in topological order
*/
public Set<MethodInfo> getReachableImplementationsSet(MethodInfo rootMethod) {
Set<MethodInfo> implemented = new LinkedHashSet<MethodInfo>();
for (ExecutionContext cgNode : methodNodes.get(rootMethod).getInstances()) {
DepthFirstIterator<ExecutionContext, ContextEdge> ti = new DepthFirstIterator<ExecutionContext, ContextEdge>(callGraph, cgNode);
ti.setCrossComponentTraversal(false);
while (ti.hasNext()) {
MethodInfo m = ti.next().getMethodInfo();
if (m == null)
throw new AssertionError("Abstract method in callgraph");
implemented.add(m);
}
}
return implemented;
}
Aggregations