expose copy propagation records to allow better source position mapping even when copy propagation has occurred.

This commit is contained in:
Julian Dolby 2018-05-09 18:10:20 -04:00
parent 6b2db3e190
commit a3a6ce3f51
2 changed files with 52 additions and 19 deletions

View File

@ -13,6 +13,7 @@ package com.ibm.wala.cast.ir.ssa;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import com.ibm.wala.cast.ir.ssa.SSAConversion.SSAInformation;
import com.ibm.wala.cast.loader.AstMethod; import com.ibm.wala.cast.loader.AstMethod;
import com.ibm.wala.cast.loader.AstMethod.LexicalInformation; import com.ibm.wala.cast.loader.AstMethod.LexicalInformation;
import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position;
@ -73,7 +74,7 @@ public class AstIRFactory<T extends IMethod> implements IRFactory<T> {
public static class AstIR extends IR { public static class AstIR extends IR {
private final LexicalInformation lexicalInfo; private final LexicalInformation lexicalInfo;
private final SSA2LocalMap localMap; private final SSAConversion.SSAInformation localMap;
public LexicalInformation lexicalInfo() { public LexicalInformation lexicalInfo() {
return lexicalInfo; return lexicalInfo;
@ -100,7 +101,7 @@ public class AstIRFactory<T extends IMethod> implements IRFactory<T> {
} }
@Override @Override
protected SSA2LocalMap getLocalMap() { public SSAInformation getLocalMap() {
return localMap; return localMap;
} }

View File

@ -12,7 +12,6 @@ package com.ibm.wala.cast.ir.ssa;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -20,7 +19,6 @@ import com.ibm.wala.cast.ir.ssa.analysis.LiveAnalysis;
import com.ibm.wala.cast.loader.AstMethod; import com.ibm.wala.cast.loader.AstMethod;
import com.ibm.wala.cast.loader.AstMethod.DebuggingInformation; import com.ibm.wala.cast.loader.AstMethod.DebuggingInformation;
import com.ibm.wala.cast.loader.AstMethod.LexicalInformation; import com.ibm.wala.cast.loader.AstMethod.LexicalInformation;
import com.ibm.wala.ssa.IR.SSA2LocalMap;
import com.ibm.wala.ssa.SSACFG; import com.ibm.wala.ssa.SSACFG;
import com.ibm.wala.ssa.SSAInstruction; import com.ibm.wala.ssa.SSAInstruction;
import com.ibm.wala.ssa.SSAOptions; import com.ibm.wala.ssa.SSAOptions;
@ -62,7 +60,7 @@ public class SSAConversion extends AbstractSSAConversion {
private final LiveAnalysis.Result liveness; private final LiveAnalysis.Result liveness;
private SSA2LocalMap computedLocalMap; private SSAInformation computedLocalMap;
private Map<Integer,Integer> assignments = HashMapFactory.make(); private Map<Integer,Integer> assignments = HashMapFactory.make();
@ -74,11 +72,19 @@ public class SSAConversion extends AbstractSSAConversion {
private final ArrayList<CopyPropagationRecord> R[]; private final ArrayList<CopyPropagationRecord> R[];
private static class UseRecord { public static class UseRecord {
final int instructionIndex; final int instructionIndex;
final int useNumber; final int useNumber;
public int getInstructionIndex() {
return instructionIndex;
}
public int getUseNumber() {
return useNumber;
}
private UseRecord(int instructionIndex, int useNumber) { private UseRecord(int instructionIndex, int useNumber) {
this.useNumber = useNumber; this.useNumber = useNumber;
this.instructionIndex = instructionIndex; this.instructionIndex = instructionIndex;
@ -101,7 +107,7 @@ public class SSAConversion extends AbstractSSAConversion {
} }
} }
private class PhiUseRecord { public class PhiUseRecord {
final int BBnumber; final int BBnumber;
final int phiNumber; final int phiNumber;
@ -114,6 +120,18 @@ public class SSAConversion extends AbstractSSAConversion {
this.useNumber = useNumber; this.useNumber = useNumber;
} }
public int getBBnumber() {
return BBnumber;
}
public int getPhiNumber() {
return phiNumber;
}
public int getUseNumber() {
return useNumber;
}
@Override @Override
public String toString() { public String toString() {
return "[use " + useNumber + " of " + phiNumber + " of block " + BBnumber + "]"; return "[use " + useNumber + " of " + phiNumber + " of block " + BBnumber + "]";
@ -131,7 +149,7 @@ public class SSAConversion extends AbstractSSAConversion {
} }
} }
private class CopyPropagationRecord { public class CopyPropagationRecord {
final int rhs; final int rhs;
final int instructionIndex; final int instructionIndex;
@ -140,6 +158,22 @@ public class SSAConversion extends AbstractSSAConversion {
private final Set<CopyPropagationRecord> childRecords = HashSetFactory.make(1); private final Set<CopyPropagationRecord> childRecords = HashSetFactory.make(1);
public int getRhs() {
return rhs;
}
public int getInstructionIndex() {
return instructionIndex;
}
public Set<Object> getRenamedUses() {
return renamedUses;
}
public Set<CopyPropagationRecord> getChildRecords() {
return childRecords;
}
@Override @Override
public String toString() { public String toString() {
StringBuffer sb = new StringBuffer("<vn " + rhs + " at " + instructionIndex); StringBuffer sb = new StringBuffer("<vn " + rhs + " at " + instructionIndex);
@ -246,19 +280,19 @@ public class SSAConversion extends AbstractSSAConversion {
} }
public static void undoCopyPropagation(AstIRFactory.AstIR ir, int instruction, int use) { public static void undoCopyPropagation(AstIRFactory.AstIR ir, int instruction, int use) {
SSAInformation info = (SSAInformation) ir.getLocalMap(); SSAInformation info = ir.getLocalMap();
info.undoCopyPropagation(instruction, use); info.undoCopyPropagation(instruction, use);
} }
public static void copyUse(AstIRFactory.AstIR ir, int fromInst, int fromUse, int toInst, int toUse) { public static void copyUse(AstIRFactory.AstIR ir, int fromInst, int fromUse, int toInst, int toUse) {
SSAInformation info = (SSAInformation) ir.getLocalMap(); SSAInformation info = ir.getLocalMap();
info.copyUse(fromInst, fromUse, toInst, toUse); info.copyUse(fromInst, fromUse, toInst, toUse);
} }
// //
// SSA2LocalMap implementation for SSAConversion // SSA2LocalMap implementation for SSAConversion
// //
private class SSAInformation implements com.ibm.wala.ssa.IR.SSA2LocalMap { public class SSAInformation implements com.ibm.wala.ssa.IR.SSA2LocalMap {
private final String[][] computedNames = new String[valueMap.length][]; private final String[][] computedNames = new String[valueMap.length][];
@Override @Override
@ -303,7 +337,7 @@ public class SSAConversion extends AbstractSSAConversion {
} }
} }
private Map<Object, CopyPropagationRecord> getCopyHistory() { public Map<Object, CopyPropagationRecord> getCopyHistory() {
return copyPropagationMap; return copyPropagationMap;
} }
@ -519,10 +553,8 @@ public class SSAConversion extends AbstractSSAConversion {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private SSAConversion(AstMethod M, AstIRFactory.AstIR ir, SSAOptions options) { private SSAConversion(AstMethod M, AstIRFactory.AstIR ir, SSAOptions options) {
super(ir, options); super(ir, options);
HashMap<Object, CopyPropagationRecord> m = HashMapFactory.make(); Map<Object, CopyPropagationRecord> m = HashMapFactory.make();
this.copyPropagationMap = (ir.getLocalMap() instanceof SSAInformation) ? ((SSAInformation) ir.getLocalMap()).getCopyHistory() this.copyPropagationMap = (ir.getLocalMap() != null) ? ir.getLocalMap().getCopyHistory() : m;
: m;
this.ir = ir; this.ir = ir;
this.debugInfo = M.debugInfo(); this.debugInfo = M.debugInfo();
this.lexicalInfo = ir.lexicalInfo(); this.lexicalInfo = ir.lexicalInfo();
@ -605,7 +637,7 @@ public class SSAConversion extends AbstractSSAConversion {
super.fail(v); super.fail(v);
} }
public SSA2LocalMap getComputedLocalMap() { public SSAInformation getComputedLocalMap() {
return computedLocalMap; return computedLocalMap;
} }
@ -655,11 +687,11 @@ public class SSAConversion extends AbstractSSAConversion {
return foundTwo; return foundTwo;
} }
public static SSA2LocalMap convert(AstMethod M, AstIRFactory.AstIR ir, SSAOptions options) { public static SSAInformation convert(AstMethod M, AstIRFactory.AstIR ir, SSAOptions options) {
return convert(M, ir, options, valuesToConvert(ir)); return convert(M, ir, options, valuesToConvert(ir));
} }
public static SSA2LocalMap convert(AstMethod M, final AstIRFactory.AstIR ir, SSAOptions options, final IntSet values) { public static SSAInformation convert(AstMethod M, final AstIRFactory.AstIR ir, SSAOptions options, final IntSet values) {
try { try {
if (DEBUG) { if (DEBUG) {
System.err.println(("starting conversion for " + values)); System.err.println(("starting conversion for " + values));