Skip to content

Commit 24a65b2

Browse files
authored
Devirtualization with proper addresses (#944)
* Devirtualization now uses proper MemoryObjects to represent function addresses ExprSimplifier can simplify comparisons on simple MemoryObjects
1 parent 6b66fb9 commit 24a65b2

File tree

2 files changed

+33
-19
lines changed

2 files changed

+33
-19
lines changed

dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.dat3m.dartagnan.expression.integers.*;
1313
import com.dat3m.dartagnan.expression.misc.ITEExpr;
1414
import com.dat3m.dartagnan.expression.utils.IntegerHelper;
15+
import com.dat3m.dartagnan.program.memory.MemoryObject;
1516
import com.google.common.base.VerifyException;
1617
import com.google.common.collect.ImmutableList;
1718
import com.google.common.collect.Iterables;
@@ -165,6 +166,24 @@ public Expression visitIntCmpExpression(IntCmpExpr cmp) {
165166
return expressions.makeValue(cmpResult);
166167
}
167168

169+
// ------- Operations on memory objects -------
170+
if (left instanceof MemoryObject lMem && right instanceof MemoryObject rMem) {
171+
final boolean sameObj = lMem.equals(rMem);
172+
173+
final Boolean cmpResult = switch (op) {
174+
case EQ -> sameObj;
175+
case NEQ -> !sameObj;
176+
case LT, ULT -> sameObj ? false : null;
177+
case LTE, ULTE -> sameObj ? true : null;
178+
default ->
179+
throw new VerifyException(String.format("Unexpected comparison operator '%s'. Missing normalization?", op));
180+
};
181+
182+
if (cmpResult != null) {
183+
return expressions.makeValue(cmpResult);
184+
}
185+
}
186+
168187
return expressions.makeIntCmp(left, op, right);
169188
}
170189

dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,8 @@
33
import com.dat3m.dartagnan.expression.Expression;
44
import com.dat3m.dartagnan.expression.ExpressionFactory;
55
import com.dat3m.dartagnan.expression.ExpressionVisitor;
6-
import com.dat3m.dartagnan.expression.integers.IntLiteral;
76
import com.dat3m.dartagnan.expression.processing.ExprTransformer;
87
import com.dat3m.dartagnan.expression.processing.ExpressionInspector;
9-
import com.dat3m.dartagnan.expression.type.IntegerType;
10-
import com.dat3m.dartagnan.expression.type.TypeFactory;
118
import com.dat3m.dartagnan.program.Function;
129
import com.dat3m.dartagnan.program.IRHelper;
1310
import com.dat3m.dartagnan.program.Program;
@@ -40,8 +37,6 @@ public class NaiveDevirtualisation implements ProgramProcessor {
4037

4138
private static final Logger logger = LogManager.getLogger(NaiveDevirtualisation.class);
4239

43-
private int nextAvailableFuncAddress = 8; // We use 8-aligned addresses
44-
4540
private NaiveDevirtualisation() {
4641
}
4742

@@ -97,16 +92,16 @@ private void findAndTransformAddressTakenFunctions(
9792
}
9893
}
9994

100-
private boolean assignAddressToFunction(Function func, Map<Function, IntLiteral> func2AddressMap) {
101-
final IntegerType ptrType = TypeFactory.getInstance().getArchType();
102-
final ExpressionFactory expressions = ExpressionFactory.getInstance();
103-
if (!func2AddressMap.containsKey(func)) {
104-
logger.debug("Assigned address \"{}\" to function \"{}\"", nextAvailableFuncAddress, func);
105-
func2AddressMap.put(func, expressions.makeValue(nextAvailableFuncAddress, ptrType));
106-
nextAvailableFuncAddress += 8;
107-
return true;
95+
private boolean assignAddressToFunction(Function func, Map<Function, MemoryObject> func2AddressMap) {
96+
if (func2AddressMap.containsKey(func)) {
97+
return false;
10898
}
109-
return false;
99+
100+
final MemoryObject funcAddr = func.getProgram().getMemory().allocate(1);
101+
funcAddr.setName(String.format("__funcAddr_%s", func.getName()));
102+
func2AddressMap.put(func, funcAddr);
103+
logger.debug("Assigned address to function \"{}\"", func);
104+
return true;
110105
}
111106

112107
private void applyTransformerToEvent(Event e, ExpressionVisitor<Expression> transformer) {
@@ -119,7 +114,7 @@ private void applyTransformerToEvent(Event e, ExpressionVisitor<Expression> tran
119114
}
120115
}
121116

122-
private void devirtualise(Function function, Map<Function, IntLiteral> func2AddressMap) {
117+
private void devirtualise(Function function, Map<Function, MemoryObject> func2AddressMap) {
123118
final ExpressionFactory expressions = ExpressionFactory.getInstance();
124119

125120
int devirtCounter = 0;
@@ -147,8 +142,8 @@ private void devirtualise(Function function, Map<Function, IntLiteral> func2Addr
147142
final Expression funcPtr = call.getCallTarget();
148143
// Construct call table
149144
for (Function possibleTarget : possibleTargets) {
150-
final IntLiteral targetAddress = func2AddressMap.get(possibleTarget);
151-
final Label caseLabel = EventFactory.newLabel(String.format("__Ldevirt_%s#%s", targetAddress.getValue(), devirtCounter));
145+
final MemoryObject targetAddress = func2AddressMap.get(possibleTarget);
146+
final Label caseLabel = EventFactory.newLabel(String.format("__Ldevirt_%s#%s", possibleTarget.getName(), devirtCounter));
152147
final CondJump caseJump = EventFactory.newJump(expressions.makeEQ(funcPtr, targetAddress), caseLabel);
153148
caseLabels.add(caseLabel);
154149
caseJumps.add(caseJump);
@@ -178,7 +173,7 @@ private boolean needsDevirtualization(CallEvent call) {
178173
return !call.isDirectCall();
179174
}
180175

181-
private List<Function> getPossibleTargets(CallEvent call, Map<Function, IntLiteral> func2AddressMap) {
176+
private List<Function> getPossibleTargets(CallEvent call, Map<Function, MemoryObject> func2AddressMap) {
182177
Preconditions.checkArgument(needsDevirtualization(call));
183178
return func2AddressMap.keySet().stream()
184179
.filter(f -> f.getFunctionType() == call.getCallType())
@@ -210,7 +205,7 @@ public Expression visitFunction(Function function) {
210205

211206
private static class FunctionToAddressTransformer extends ExprTransformer {
212207

213-
private final Map<Function, IntLiteral> func2AddressMap = new HashMap<>();
208+
private final Map<Function, MemoryObject> func2AddressMap = new HashMap<>();
214209

215210
@Override
216211
public Expression visitFunction(Function function) {

0 commit comments

Comments
 (0)