91 lines
3.3 KiB
Java
91 lines
3.3 KiB
Java
/*******************************************************************************
|
|
* Copyright (c) 2006 IBM Corporation.
|
|
* All rights reserved. This program and the accompanying materials
|
|
* are made available under the terms of the Eclipse Public License v1.0
|
|
* which accompanies this distribution, and is available at
|
|
* http://www.eclipse.org/legal/epl-v10.html
|
|
*
|
|
* Contributors:
|
|
* IBM Corporation - initial API and implementation
|
|
*******************************************************************************/
|
|
package com.ibm.wala.ipa.slicer;
|
|
|
|
import com.ibm.wala.dataflow.IFDS.IFlowFunction;
|
|
import com.ibm.wala.dataflow.IFDS.IPartiallyBalancedFlowFunctions;
|
|
import com.ibm.wala.dataflow.IFDS.IUnaryFlowFunction;
|
|
import com.ibm.wala.dataflow.IFDS.IdentityFlowFunction;
|
|
import com.ibm.wala.util.debug.Assertions;
|
|
|
|
/**
|
|
* flow functions for flow-sensitive context-sensitive slicer
|
|
*/
|
|
public class SliceFunctions implements IPartiallyBalancedFlowFunctions<Statement> {
|
|
|
|
@Override
|
|
public IUnaryFlowFunction getCallFlowFunction(Statement src, Statement dest, Statement ret) {
|
|
return ReachabilityFunctions.createReachabilityFunctions().getCallFlowFunction(src, dest, ret);
|
|
}
|
|
|
|
@Override
|
|
public IUnaryFlowFunction getCallNoneToReturnFlowFunction(Statement src, Statement dest) {
|
|
if (src == null) {
|
|
throw new IllegalArgumentException("src is null");
|
|
}
|
|
Statement s = src;
|
|
switch (s.getKind()) {
|
|
case NORMAL_RET_CALLER:
|
|
case PARAM_CALLER:
|
|
case EXC_RET_CALLER:
|
|
// uh oh. anything that flows into the missing function will be killed.
|
|
return ReachabilityFunctions.KILL_FLOW;
|
|
case HEAP_PARAM_CALLEE:
|
|
case HEAP_PARAM_CALLER:
|
|
case HEAP_RET_CALLEE:
|
|
case HEAP_RET_CALLER:
|
|
if (dest instanceof HeapStatement) {
|
|
HeapStatement hd = (HeapStatement) dest;
|
|
HeapStatement hs = (HeapStatement) src;
|
|
if (hs.getLocation().equals(hd.getLocation())) {
|
|
return IdentityFlowFunction.identity();
|
|
} else {
|
|
return ReachabilityFunctions.KILL_FLOW;
|
|
}
|
|
} else {
|
|
return ReachabilityFunctions.KILL_FLOW;
|
|
}
|
|
case NORMAL:
|
|
// only control dependence flows into the missing function.
|
|
// this control dependence does not flow back to the caller.
|
|
return ReachabilityFunctions.KILL_FLOW;
|
|
default:
|
|
Assertions.UNREACHABLE(s.getKind().toString());
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public IUnaryFlowFunction getCallToReturnFlowFunction(Statement src, Statement dest) {
|
|
return ReachabilityFunctions.createReachabilityFunctions().getCallToReturnFlowFunction(src, dest);
|
|
}
|
|
|
|
@Override
|
|
public IUnaryFlowFunction getNormalFlowFunction(Statement src, Statement dest) {
|
|
return ReachabilityFunctions.createReachabilityFunctions().getNormalFlowFunction(src, dest);
|
|
}
|
|
|
|
@Override
|
|
public IFlowFunction getReturnFlowFunction(Statement call, Statement src, Statement dest) {
|
|
return ReachabilityFunctions.createReachabilityFunctions().getReturnFlowFunction(call, src, dest);
|
|
}
|
|
|
|
public IFlowFunction getReturnFlowFunction(Statement src, Statement dest) {
|
|
return ReachabilityFunctions.createReachabilityFunctions().getReturnFlowFunction(src, dest);
|
|
}
|
|
|
|
@Override
|
|
public IFlowFunction getUnbalancedReturnFlowFunction(Statement src, Statement dest) {
|
|
return getReturnFlowFunction(src, dest);
|
|
}
|
|
|
|
}
|