C++: Make 'DefImpl' and 'useImpl' abstract.

This commit is contained in:
Mathias Vorreiter Pedersen
2022-12-14 12:14:28 +00:00
parent 5d417d7a69
commit 78b7e12b87
2 changed files with 54 additions and 22 deletions

View File

@@ -192,22 +192,23 @@ private predicate sourceVariableHasBaseAndIndex(SourceVariable v, BaseSourceVari
v.getIndirection() = ind
}
class DefImpl extends DefOrUseImpl, TDefImpl {
abstract class DefImpl extends DefOrUseImpl {
Operand address;
int ind;
DefImpl() { this = TDefImpl(address, ind) }
bindingset[ind]
DefImpl() { any() }
override BaseSourceVariableInstruction getBase() { isDef(_, _, address, result, _, _) }
abstract int getIndirection();
abstract Node0Impl getValue();
abstract predicate isCertain();
Operand getAddressOperand() { result = address }
int getIndirection() { isDef(_, _, address, _, result, ind) }
override int getIndirectionIndex() { result = ind }
Node0Impl getValue() { isDef(_, result, address, _, _, _) }
override string toString() { result = "DefImpl" }
override IRBlock getBlock() { result = this.getAddressOperand().getUse().getBlock() }
@@ -217,15 +218,28 @@ class DefImpl extends DefOrUseImpl, TDefImpl {
final override predicate hasIndexInBlock(IRBlock block, int index) {
this.getAddressOperand().getUse() = block.getInstruction(index)
}
}
private class DirectDef extends DefImpl, TDefImpl {
DirectDef() { this = TDefImpl(address, ind) }
override BaseSourceVariableInstruction getBase() { isDef(_, _, address, result, _, _) }
override int getIndirection() { isDef(_, _, address, _, result, ind) }
override Node0Impl getValue() { isDef(_, result, address, _, _, _) }
override predicate isCertain() { isDef(true, _, address, _, _, ind) }
predicate isCertain() { isDef(true, _, address, _, _, ind) }
}
class UseImpl extends DefOrUseImpl, TUseImpl {
abstract class UseImpl extends DefOrUseImpl {
Operand operand;
int ind;
UseImpl() { this = TUseImpl(operand, ind) }
bindingset[ind]
UseImpl() { any() }
Operand getOperand() { result = operand }
@@ -239,13 +253,21 @@ class UseImpl extends DefOrUseImpl, TUseImpl {
final override Cpp::Location getLocation() { result = operand.getLocation() }
final int getIndirection() { isUse(_, operand, _, result, ind) }
override int getIndirectionIndex() { result = ind }
abstract int getIndirection();
abstract predicate isCertain();
}
private class DirectUse extends UseImpl, TUseImpl {
DirectUse() { this = TUseImpl(operand, ind) }
override int getIndirection() { isUse(_, operand, _, result, ind) }
override BaseSourceVariableInstruction getBase() { isUse(_, operand, result, _, ind) }
predicate isCertain() { isUse(true, operand, _, _, ind) }
override predicate isCertain() { isUse(true, operand, _, _, ind) }
}
/**

View File

@@ -63,18 +63,16 @@ abstract private class DefOrUseImpl extends TDefOrUseImpl {
final SourceVariable getSourceVariable() {
result.getBaseVariable() = this.getBaseSourceVariable()
}
abstract predicate isCertain();
}
class DefImpl extends DefOrUseImpl, TDefImpl {
abstract class DefImpl extends DefOrUseImpl {
Operand address;
DefImpl() { this = TDefImpl(address) }
override BaseSourceVariableInstruction getBase() { isDef(_, _, address, result, _, _) }
Operand getAddressOperand() { result = address }
Node0Impl getValue() { isDef(_, result, address, _, _, _) }
abstract Node0Impl getValue();
override string toString() { result = address.toString() }
@@ -85,15 +83,23 @@ class DefImpl extends DefOrUseImpl, TDefImpl {
final override predicate hasIndexInBlock(IRBlock block, int index) {
this.getAddressOperand().getUse() = block.getInstruction(index)
}
}
private class DirectDef extends DefImpl, TDefImpl {
DirectDef() { this = TDefImpl(address) }
override BaseSourceVariableInstruction getBase() { isDef(_, _, address, result, _, _) }
override Node0Impl getValue() { isDef(_, result, address, _, _, _) }
override predicate isCertain() { isDef(true, _, address, _, _, _) }
predicate isCertain() { isDef(true, _, address, _, _, _) }
}
class UseImpl extends DefOrUseImpl, TUseImpl {
abstract class UseImpl extends DefOrUseImpl {
Operand operand;
UseImpl() { this = TUseImpl(operand) }
Operand getOperand() { result = operand }
override string toString() { result = operand.toString() }
@@ -105,10 +111,14 @@ class UseImpl extends DefOrUseImpl, TUseImpl {
final override IRBlock getBlock() { result = operand.getUse().getBlock() }
final override Cpp::Location getLocation() { result = operand.getLocation() }
}
private class DirectUse extends UseImpl, TUseImpl {
DirectUse() { this = TUseImpl(operand) }
override BaseSourceVariableInstruction getBase() { isUse(_, operand, result, _, _) }
predicate isCertain() { isUse(true, operand, _, _, _) }
override predicate isCertain() { isUse(true, operand, _, _, _) }
}
private module SsaInput implements SsaImplCommon::InputSig {