package xsched.wala.optimizations;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import xsched.analysis.core.AnalysisResult;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.propagation.HeapModel;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
public class Util {
public static Set<InstanceKey> computeInstanceKeysForVariableAtNode(PointerAnalysis pa, CGNode node, Variable variable) {
HeapModel heap = pa.getHeapModel();
Set<InstanceKey> instances = new HashSet<InstanceKey>();
if(variable.isClassInStaticMethod()) {
instances.add(heap.getInstanceKeyForClassObject(variable.method.getDeclaringClass().getReference()));
} else {
PointerKey pointer = heap.getPointerKeyForLocal(node, variable.ssaVariable);
for(InstanceKey instance : pa.getPointsToSet(pointer)) {
instances.add(instance);
}
}
return instances;
}
public static Set<InstanceKey> collectInstanceKeysOfTaskAlsoUsedInParallel(AnalysisResult<CGNode> schedule, CGNode task, Set<InstanceKey> taskInstances, Map<CGNode, Set<InstanceKey>> otherTasks) {
Set<InstanceKey> parallelInstances = new HashSet<InstanceKey>();
for(CGNode parallel : schedule.parallelTasksFor(task)) {
Set<InstanceKey> otherInstances = otherTasks.get(parallel);
parallelInstances.addAll(otherInstances);
}
parallelInstances.retainAll(taskInstances);
return parallelInstances;
}
public static Map<CGNode, Set<InstanceKey>> collectInstanceKeysUsedInParallel(AnalysisResult<CGNode> schedule, Map<CGNode, Set<InstanceKey>> tasks) {
//
Map<CGNode, Set<InstanceKey>> usedInParallelByTask = new HashMap<CGNode, Set<InstanceKey>>();
for(Entry<CGNode, Set<InstanceKey>> entry : tasks.entrySet()) {
CGNode task = entry.getKey();
Set<InstanceKey> taskInstances = entry.getValue();
Set<InstanceKey> usedInParallel = collectInstanceKeysOfTaskAlsoUsedInParallel(schedule, task, taskInstances, tasks);
usedInParallelByTask.put(task, usedInParallel);
}
return usedInParallelByTask;
}
public static Map<CGNode, Set<InstanceKey>> mapToInstanceKeys(Map<CGNode, LocalPointsToInfo> info, Set<InstanceKey> filter) {
Map<CGNode, Set<InstanceKey>> result = new HashMap<CGNode, Set<InstanceKey>>();
for(Entry<CGNode, LocalPointsToInfo> entry : info.entrySet()) {
result.put(entry.getKey(), entry.getValue().allInstanceKeys(filter));
}
return result;
}
public static <T> boolean containsAny(Set<T> one, Set<T> other) {
for(T a : one) {
if(other.contains(a))
return true;
}
return false;
}
}