use of com.jopdesign.common.code.CallString in project jop by jop-devel.
the class DFATool method getReceivers.
public Set<String> getReceivers(InstructionHandle stmt, CallString cs) {
ContextMap<CallString, Set<String>> map = receivers.getResult().get(stmt);
if (map == null) {
return null;
}
Set<String> retval = new LinkedHashSet<String>();
for (CallString c : map.keySet()) {
if (c.hasSuffix(cs)) {
retval.addAll(map.get(c));
}
}
return retval;
}
use of com.jopdesign.common.code.CallString in project jop by jop-devel.
the class DFATool method runReceiverAnalysis.
public Map<InstructionHandle, ContextMap<CallString, Set<String>>> runReceiverAnalysis(int callstringLength) {
CallStringReceiverTypes recTys = new CallStringReceiverTypes(callstringLength);
@SuppressWarnings({ "unchecked" }) Map<InstructionHandle, ContextMap<CallString, Set<String>>> receiverResults = runAnalysis(recTys);
setReceivers(recTys);
return receiverResults;
}
use of com.jopdesign.common.code.CallString in project jop by jop-devel.
the class ObjectCacheAnalysis method getSaturatedTypes.
/** Traverse vertex set. Collect those types where we could not resolve
* the symbolic object names. (Not too useful in the analysis, but useful
* for debugging)
*/
public HashSet<String> getSaturatedTypes(Segment segment, LocalPointsToResult usedRefs) {
HashSet<String> topTypes = new HashSet<String>();
for (SuperGraphNode n : segment.getNodes()) {
BasicBlock bb = n.getCFGNode().getBasicBlock();
if (bb == null)
continue;
CallString cs = n.getContextCFG().getCallString();
for (InstructionHandle ih : bb.getInstructions()) {
BoundedSet<SymbolicAddress> refs;
if (usedRefs.containsKey(ih)) {
refs = usedRefs.get(ih, cs);
String handleType = getHandleType(project, n.getCfg(), ih);
if (handleType == null)
continue;
if (refs.isSaturated()) {
topTypes.add(handleType);
}
}
}
}
return topTypes;
}
use of com.jopdesign.common.code.CallString in project jop by jop-devel.
the class IPETUtils method buildLocalILPModel.
/**
* Create a max-cost maxflow problem for the given flow graph graph, based on a
* given node to cost mapping.
*
* @param wcetTool A reference to the WCETTool
* @param problemName a unique identifier for the problem (for reporting)
* @param cs context of the method invocation
* @param cfg the graph
* @param nodeWCET cost of nodes
* @return The max-cost maxflow problem
*/
public static IPETSolver buildLocalILPModel(WCETTool wcetTool, String problemName, CallString cs, ControlFlowGraph cfg, CostProvider<CFGNode> nodeWCET, IPETConfig ipetConfig) {
IPETSolver ipetSolver = new IPETSolver(problemName, ipetConfig);
IPETBuilder<CallString> builder = new IPETBuilder<CallString>(wcetTool, cs);
ipetSolver.addConstraints(IPETUtils.structuralFlowConstraintsRoot(cfg.getGraph(), builder));
ipetSolver.addConstraints(IPETUtils.loopBoundConstraints(cfg, builder));
ipetSolver.addConstraints(IPETUtils.infeasibleEdgeConstraints(cfg, builder));
for (CFGNode n : cfg.vertexSet()) {
long nodeCost = nodeWCET.getCost(n);
for (ControlFlowGraph.CFGEdge e : cfg.outgoingEdgesOf(n)) {
ipetSolver.addEdgeCost(builder.newEdge(e), nodeCost);
}
}
return ipetSolver;
}
use of com.jopdesign.common.code.CallString in project jop by jop-devel.
the class AppInfo method findImplementations.
/**
* Find all methods which might get invoked for a given methodRef.
* This does not use the callgraph to eliminate methods. If you want a more precise result,
* use {@link #findImplementations(InvokeSite, CallString)} and use callgraph thinning first.
* <p>
* Note that this method is slightly different from {@link MethodInfo#getImplementations(boolean)}, since
* it returns only methods for subclasses of the invokee class, not of the implementing class.
* </p>
* <p>To handle invocations of super-methods correctly, use {@link #findImplementations(InvokeSite)}
* instead.</p>
*
* @see #findImplementations(InvokeSite)
* @see MethodInfo#overrides(MethodRef, boolean)
* @param invokee the method to resolve.
* @return all possible implementations, including native methods.
*/
public Set<MethodInfo> findImplementations(final MethodRef invokee) {
final Set<MethodInfo> methods = new LinkedHashSet<MethodInfo>();
// 'method' may refer to an inherited MethodInfo or to an interface method if there is no implementation
final MethodInfo method = invokee.getMethodInfo();
if (method != null && (method.isStatic() || method.isPrivate())) {
methods.add(method);
return methods;
}
final String methodSig = invokee.getMethodSignature();
final ClassInfo invokeeClass = invokee.getClassRef().getClassInfo();
if (invokeeClass == null) {
// ok, now, if the target class is unknown, there is not much we can do, so return an empty set
logger.debug("Trying to find implementations of a method in an unknown class " + invokee.toString());
return methods;
}
// Constructors are only called by invokespecial
if ("<init>".equals(invokee.getName())) {
MethodInfo init = invokee.getMethodInfo();
if (init == null) {
throw new JavaClassFormatError("Constructor not found: " + invokee);
}
if (init.isAbstract()) {
throw new JavaClassFormatError("Found abstract constructor, this isn't right..: " + invokee);
}
methods.add(init);
return methods;
}
boolean undefinedBaseMethod = false;
// check if method is defined in the referenced class or in a superclass
if (invokeeClass.getMethodInfo(methodSig) == null) {
// method is inherited, add to implementations
if (method != null && !method.isAbstract()) {
methods.add(method);
} else if (method == null) {
// hm, invoke to an unknown method (maybe excluded or native), what should we do?
if (invokeeClass.isFullyKnown(true)) {
// .. or maybe the method has not been loaded somehow when the MethodRef was created (check!)
throw new JavaClassFormatError("Method implementation not found in superclass: " + invokee.toString());
} else {
// maybe defined in excluded superclass, but we do not know for sure..
// We *must* return an empty set, but lets try to continue for now and
// handle it like an excluded class, and abort only if we find overriding methods
logger.debug("Method implementation not found in incomplete superclass: " + invokee.toString());
undefinedBaseMethod = true;
}
}
}
// now, we have a virtual call on our hands ..
ClassVisitor visitor = new ClassVisitor() {
public boolean visitClass(ClassInfo classInfo) {
// Note: we also handle interface classes here, because they can contain <clinit> methods
MethodInfo m;
if (invokeeClass.isInterface() && !classInfo.isInterface()) {
// If we invoke an interface method, we also need to find inherited methods in implementing
// classes
m = classInfo.getMethodInfoInherited(methodSig, true);
} else {
// If we do not invoke an interface method, 'method' is already the only possible inherited
// method; If the visited class is an interface, it does not inherit implementations.
m = classInfo.getMethodInfo(methodSig);
}
if (m != null) {
if (m.isPrivate() && !classInfo.equals(invokeeClass)) {
// found an overriding method which is private .. this is interesting..
logger.error("Found private method " + m.getMethodSignature() + " in " + classInfo.getClassName() + " overriding non-private method in " + invokee.getClassName());
}
if (!m.isAbstract() && (method == null || m.overrides(method, false))) {
methods.add(m);
}
}
return true;
}
public void finishClass(ClassInfo classInfo) {
}
};
ClassHierarchyTraverser traverser = new ClassHierarchyTraverser(visitor);
traverser.setVisitSubclasses(true, true);
traverser.traverseDown(invokeeClass);
if (undefinedBaseMethod && methods.size() > 0) {
// overriding methods, this we cannot handle for now
throw new JavaClassFormatError("Found overriding methods for " + invokee + " but superclasses are undefined!");
}
return methods;
}
Aggregations