C++: generate instructions for destructor calls in IR

This commit is contained in:
Robert Marsh
2024-01-12 21:24:11 +00:00
parent 643817e74e
commit 47720e0998
6 changed files with 123 additions and 64 deletions

View File

@@ -27,7 +27,7 @@ private CallInstruction getTranslatedCallInstruction(Call call) {
* of a higher-level constructor (e.g. the allocator call in a `NewExpr`).
*/
abstract class TranslatedCall extends TranslatedExpr {
final override TranslatedElement getChild(int id) {
final override TranslatedElement getChildInternal(int id) {
// We choose the child's id in the order of evaluation.
// The qualifier is evaluated before the call target, because the value of
// the call target may depend on the value of the qualifier for virtual

View File

@@ -60,6 +60,10 @@ abstract class TranslatedLocalVariableDeclaration extends TranslatedVariableInit
*/
abstract LocalVariable getVariable();
final override TranslatedElement getChild(int id) {
result = TranslatedVariableInitialization.super.getChildInternal(id)
}
final override Type getTargetType() { result = getVariableType(this.getVariable()) }
final override TranslatedInitialization getInitialization() {

View File

@@ -24,6 +24,10 @@ private Element getRealParent(Expr expr) {
result = expr.getParentWithConversions()
or
result.(Destructor).getADestruction() = expr
or
result.(Expr).getAnImplicitDestructorCall() = expr
or
result.(Stmt).getAnImplicitDestructorCall() = expr
}
IRUserVariable getIRUserVariable(Declaration decl, Variable var) {
@@ -105,12 +109,6 @@ private predicate ignoreExprOnly(Expr expr) {
newExpr.getAllocatorCall() = expr
)
or
exists(DeleteOrDeleteArrayExpr deleteExpr |
// Ignore the destructor call as we don't model it yet. Don't ignore
// its arguments, though, as they are the arguments to the deallocator.
deleteExpr.getDestructorCall() = expr
)
or
// The extractor deliberately emits an `ErrorExpr` as the first argument to
// the allocator call, if any, of a `NewOrNewArrayExpr`. That `ErrorExpr`
// should not be translated.
@@ -752,7 +750,10 @@ newtype TTranslatedElement =
not ignoreSideEffects(call) and
// Don't bother with destructor calls for now, since we won't see very many of them in the IR
// until we start injecting implicit destructor calls.
call instanceof ConstructorCall and
(
call instanceof ConstructorCall or
call instanceof DestructorCall
) and
opcode = getASideEffectOpcode(call, -1)
} or
// The side effect that initializes newly-allocated memory.

View File

@@ -75,6 +75,18 @@ abstract class TranslatedExpr extends TranslatedElement {
expr.isGLValueCategory()
}
abstract TranslatedElement getChildInternal(int id);
final override TranslatedElement getChild(int id) {
result = this.getChildInternal(id)
or
exists(int maxChildId, int destructorIndex |
maxChildId = max(int childId | exists(this.getChildInternal(childId))) and
result.(TranslatedExpr).getExpr() = expr.getImplicitDestructorCall(destructorIndex) and
id = maxChildId + 1 + destructorIndex
)
}
final override Locatable getAst() { result = expr }
final override Declaration getFunction() { result = getEnclosingDeclaration(expr) }
@@ -178,7 +190,7 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext,
{
TranslatedConditionValue() { this = TTranslatedConditionValue(expr) }
override TranslatedElement getChild(int id) { id = 0 and result = this.getCondition() }
override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getCondition() }
override Instruction getFirstInstruction(EdgeKind kind) {
result = this.getCondition().getFirstInstruction(kind)
@@ -318,7 +330,9 @@ abstract class TranslatedValueCategoryAdjustment extends TranslatedExpr {
result = this.getOperand().getFirstInstruction(kind)
}
final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() }
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getOperand()
}
final override predicate producesExprResult() {
// A temp object always produces the result of the expression.
@@ -446,7 +460,7 @@ class TranslatedResultCopy extends TranslatedExpr, TTranslatedResultCopy {
result = this.getOperand().getFirstInstruction(kind)
}
override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() }
override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getOperand() }
override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
tag = ResultCopyTag() and
@@ -485,7 +499,7 @@ class TranslatedCommaExpr extends TranslatedNonConstantExpr {
result = this.getLeftOperand().getFirstInstruction(kind)
}
override TranslatedElement getChild(int id) {
override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getLeftOperand()
or
id = 1 and result = this.getRightOperand()
@@ -526,7 +540,9 @@ private int getElementSize(Type type) {
abstract class TranslatedCrementOperation extends TranslatedNonConstantExpr {
override CrementOperation expr;
final override TranslatedElement getChild(int id) { id = 0 and result = this.getLoadedOperand() }
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getLoadedOperand()
}
final override string getInstructionConstantValue(InstructionTag tag) {
tag = CrementConstantTag() and
@@ -695,7 +711,7 @@ class TranslatedArrayExpr extends TranslatedNonConstantExpr {
result = this.getBaseOperand().getFirstInstruction(kind)
}
final override TranslatedElement getChild(int id) {
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getBaseOperand()
or
id = 1 and result = this.getOffsetOperand()
@@ -753,7 +769,9 @@ abstract class TranslatedTransparentExpr extends TranslatedNonConstantExpr {
result = this.getOperand().getFirstInstruction(kind)
}
final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() }
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getOperand()
}
final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() }
@@ -810,7 +828,7 @@ class TranslatedTransparentConversion extends TranslatedTransparentExpr {
class TranslatedThisExpr extends TranslatedNonConstantExpr {
override ThisExpr expr;
final override TranslatedElement getChild(int id) { none() }
final override TranslatedElement getChildInternal(int id) { none() }
final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
tag = ThisAddressTag() and
@@ -855,7 +873,7 @@ class TranslatedThisExpr extends TranslatedNonConstantExpr {
abstract class TranslatedVariableAccess extends TranslatedNonConstantExpr {
override VariableAccess expr;
final override TranslatedElement getChild(int id) {
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getQualifier() // Might not exist
}
@@ -962,7 +980,7 @@ class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExp
result = this.getInstruction(StructuredBindingAccessTag())
}
override TranslatedElement getChild(int id) {
override TranslatedElement getChildInternal(int id) {
// Structured bindings cannot be qualified.
none()
}
@@ -1010,7 +1028,7 @@ class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExp
class TranslatedFunctionAccess extends TranslatedNonConstantExpr {
override FunctionAccess expr;
override TranslatedElement getChild(int id) {
override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getQualifier() // Might not exist
}
@@ -1077,7 +1095,7 @@ abstract class TranslatedConstantExpr extends TranslatedCoreExpr, TTranslatedVal
kind instanceof GotoEdge
}
final override TranslatedElement getChild(int id) { none() }
final override TranslatedElement getChildInternal(int id) { none() }
final override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) }
@@ -1154,7 +1172,9 @@ class TranslatedUnaryExpr extends TranslatedSingleInstructionExpr {
result = this.getOperand().getFirstInstruction(kind)
}
final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() }
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getOperand()
}
final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) {
tag = OnlyInstructionTag() and
@@ -1195,7 +1215,9 @@ abstract class TranslatedConversion extends TranslatedNonConstantExpr {
result = this.getOperand().getFirstInstruction(kind)
}
final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() }
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getOperand()
}
final TranslatedExpr getOperand() { result = getTranslatedExpr(expr.getExpr()) }
}
@@ -1432,7 +1454,7 @@ class TranslatedBinaryOperation extends TranslatedSingleInstructionExpr {
result = this.getLeftOperand().getFirstInstruction(kind)
}
final override TranslatedElement getChild(int id) {
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getLeftOperand()
or
id = 1 and result = this.getRightOperand()
@@ -1518,7 +1540,7 @@ class TranslatedBinaryOperation extends TranslatedSingleInstructionExpr {
class TranslatedAssignExpr extends TranslatedNonConstantExpr {
override AssignExpr expr;
final override TranslatedElement getChild(int id) {
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getLeftOperand()
or
id = 1 and result = this.getRightOperand()
@@ -1592,7 +1614,7 @@ class TranslatedAssignExpr extends TranslatedNonConstantExpr {
class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr {
override BlockAssignExpr expr;
final override TranslatedElement getChild(int id) {
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getLeftOperand()
or
id = 1 and result = this.getRightOperand()
@@ -1661,7 +1683,7 @@ class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr {
class TranslatedAssignOperation extends TranslatedNonConstantExpr {
override AssignOperation expr;
final override TranslatedElement getChild(int id) {
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getLoadedLeftOperand()
or
id = 1 and result = this.getRightOperand()
@@ -1911,7 +1933,7 @@ class TranslatedConstantAllocationSize extends TranslatedAllocationSize {
result = this.getParent().getChildSuccessor(this, kind)
}
final override TranslatedElement getChild(int id) { none() }
final override TranslatedElement getChildInternal(int id) { none() }
final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() }
@@ -1966,7 +1988,7 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize {
result = this.getParent().getChildSuccessor(this, kind)
}
final override TranslatedElement getChild(int id) { id = 0 and result = this.getExtent() }
final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getExtent() }
final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) {
child = this.getExtent() and
@@ -2167,7 +2189,9 @@ abstract class StructorCallContext extends TranslatedElement {
class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, StructorCallContext {
override DestructorFieldDestruction expr;
final override TranslatedElement getChild(int id) { id = 0 and result = this.getDestructorCall() }
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getDestructorCall()
}
final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
tag = OnlyInstructionTag() and
@@ -2415,7 +2439,7 @@ abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr {
class TranslatedTernaryConditionalExpr extends TranslatedConditionalExpr, ConditionContext {
TranslatedTernaryConditionalExpr() { not expr.isTwoOperand() }
final override TranslatedElement getChild(int id) {
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getCondition()
or
id = 1 and result = this.getThen()
@@ -2470,7 +2494,7 @@ class TranslatedTernaryConditionalExpr extends TranslatedConditionalExpr, Condit
class TranslatedBinaryConditionalExpr extends TranslatedConditionalExpr {
TranslatedBinaryConditionalExpr() { expr.isTwoOperand() }
final override TranslatedElement getChild(int id) {
final override TranslatedElement getChildInternal(int id) {
// We only truly have two children, because our "condition" and "then" are the same as far as
// the extractor is concerned.
id = 0 and result = this.getCondition()
@@ -2554,6 +2578,10 @@ class TranslatedTemporaryObjectExpr extends TranslatedNonConstantExpr,
override Type getTargetType() { result = expr.getType() }
final override TranslatedElement getChildInternal(int id) {
result = TranslatedVariableInitialization.super.getChildInternal(id)
}
final override TranslatedInitialization getInitialization() {
result = getTranslatedInitialization(expr.getExpr())
}
@@ -2599,6 +2627,10 @@ abstract class TranslatedThrowExpr extends TranslatedNonConstantExpr {
class TranslatedThrowValueExpr extends TranslatedThrowExpr, TranslatedVariableInitialization {
TranslatedThrowValueExpr() { not expr instanceof ReThrowExpr }
final override TranslatedElement getChildInternal(int id) {
result = TranslatedVariableInitialization.super.getChildInternal(id)
}
override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
TranslatedThrowExpr.super.hasInstruction(opcode, tag, resultType)
or
@@ -2658,7 +2690,7 @@ class TranslatedThrowValueExpr extends TranslatedThrowExpr, TranslatedVariableIn
class TranslatedReThrowExpr extends TranslatedThrowExpr {
override ReThrowExpr expr;
override TranslatedElement getChild(int id) { none() }
override TranslatedElement getChildInternal(int id) { none() }
override Instruction getFirstInstruction(EdgeKind kind) {
result = this.getInstruction(ThrowTag()) and
@@ -2696,7 +2728,7 @@ class TranslatedBuiltInOperation extends TranslatedNonConstantExpr {
)
}
final override TranslatedElement getChild(int id) {
final override TranslatedElement getChildInternal(int id) {
result = getTranslatedExpr(expr.getChild(id).getFullyConverted())
}
@@ -2812,7 +2844,7 @@ class TranslatedVarArgsStart extends TranslatedNonConstantExpr {
final override Instruction getResult() { none() }
final override TranslatedElement getChild(int id) { id = 0 and result = this.getVAList() }
final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getVAList() }
private TranslatedExpr getVAList() {
result = getTranslatedExpr(expr.getVAList().getFullyConverted())
@@ -2885,7 +2917,7 @@ class TranslatedVarArg extends TranslatedNonConstantExpr {
final override Instruction getResult() { result = this.getInstruction(VarArgsArgAddressTag()) }
final override TranslatedElement getChild(int id) { id = 0 and result = this.getVAList() }
final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getVAList() }
private TranslatedExpr getVAList() {
result = getTranslatedExpr(expr.getVAList().getFullyConverted())
@@ -2957,7 +2989,7 @@ class TranslatedVarArgsEnd extends TranslatedNonConstantExpr {
final override Instruction getResult() { none() }
final override TranslatedElement getChild(int id) { id = 0 and result = this.getVAList() }
final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getVAList() }
private TranslatedExpr getVAList() {
result = getTranslatedExpr(expr.getVAList().getFullyConverted())
@@ -3003,7 +3035,7 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr {
final override Instruction getResult() { result = this.getInstruction(VarArgsVAListStoreTag()) }
final override TranslatedElement getChild(int id) {
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getDestinationVAList()
or
id = 1 and result = this.getSourceVAList()
@@ -3059,7 +3091,7 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr {
abstract class TranslatedNewOrNewArrayExpr extends TranslatedNonConstantExpr, InitializationContext {
override NewOrNewArrayExpr expr;
final override TranslatedElement getChild(int id) {
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getAllocatorCall()
or
id = 1 and result = this.getInitialization()
@@ -3149,7 +3181,7 @@ class TranslatedConditionDeclExpr extends TranslatedNonConstantExpr {
result = this.getDecl().getFirstInstruction(kind)
}
final override TranslatedElement getChild(int id) {
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getDecl()
or
id = 1 and result = this.getConditionExpr()
@@ -3189,7 +3221,9 @@ class TranslatedLambdaExpr extends TranslatedNonConstantExpr, InitializationCont
kind instanceof GotoEdge
}
final override TranslatedElement getChild(int id) { id = 0 and result = this.getInitialization() }
final override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getInitialization()
}
override Instruction getResult() { result = this.getInstruction(LoadTag()) }
@@ -3280,7 +3314,7 @@ class TranslatedStmtExpr extends TranslatedNonConstantExpr {
result = this.getStmt().getFirstInstruction(kind)
}
final override TranslatedElement getChild(int id) { id = 0 and result = this.getStmt() }
final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getStmt() }
override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) {
tag instanceof OnlyInstructionTag and
@@ -3318,7 +3352,7 @@ class TranslatedErrorExpr extends TranslatedSingleInstructionExpr {
kind instanceof GotoEdge
}
final override TranslatedElement getChild(int id) { none() }
final override TranslatedElement getChildInternal(int id) { none() }
final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) {
tag = OnlyInstructionTag() and
@@ -3412,7 +3446,7 @@ class TranslatedAssumeExpr extends TranslatedSingleInstructionExpr {
kind instanceof GotoEdge
}
final override TranslatedElement getChild(int id) { none() }
final override TranslatedElement getChildInternal(int id) { none() }
final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) {
tag = OnlyInstructionTag() and

View File

@@ -35,7 +35,7 @@ abstract class InitializationContext extends TranslatedElement {
* declarations, `return` statements, and `throw` expressions.
*/
abstract class TranslatedVariableInitialization extends TranslatedElement, InitializationContext {
final override TranslatedElement getChild(int id) { id = 0 and result = this.getInitialization() }
TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() }
final override Instruction getFirstInstruction(EdgeKind kind) {
result = this.getInstruction(InitializerVariableAddressTag()) and

View File

@@ -235,6 +235,18 @@ abstract class TranslatedStmt extends TranslatedElement, TTranslatedStmt {
TranslatedStmt() { this = TTranslatedStmt(stmt) }
abstract TranslatedElement getChildInternal(int id);
final override TranslatedElement getChild(int id) {
result = this.getChildInternal(id)
or
exists(int maxChildId, int destructorIndex |
maxChildId = max(int childId | exists(this.getChildInternal(childId))) and
result.(TranslatedExpr).getExpr() = stmt.getImplicitDestructorCall(destructorIndex) and
id = maxChildId + 1 + destructorIndex
)
}
final override string toString() { result = stmt.toString() }
final override Locatable getAst() { result = stmt }
@@ -252,7 +264,7 @@ class TranslatedEmptyStmt extends TranslatedStmt {
stmt instanceof SwitchCase
}
override TranslatedElement getChild(int id) { none() }
override TranslatedElement getChildInternal(int id) { none() }
override Instruction getFirstInstruction(EdgeKind kind) {
result = this.getInstruction(OnlyInstructionTag()) and
@@ -281,7 +293,7 @@ class TranslatedEmptyStmt extends TranslatedStmt {
class TranslatedDeclStmt extends TranslatedStmt {
override DeclStmt stmt;
override TranslatedElement getChild(int id) { result = this.getDeclarationEntry(id) }
override TranslatedElement getChildInternal(int id) { result = this.getDeclarationEntry(id) }
override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
none()
@@ -335,7 +347,7 @@ class TranslatedExprStmt extends TranslatedStmt {
TranslatedExpr getExpr() { result = getTranslatedExpr(stmt.getExpr().getFullyConverted()) }
override TranslatedElement getChild(int id) { id = 0 and result = this.getExpr() }
override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getExpr() }
override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
none()
@@ -371,6 +383,10 @@ class TranslatedReturnValueStmt extends TranslatedReturnStmt, TranslatedVariable
result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind)
}
final override TranslatedElement getChildInternal(int id) {
result = TranslatedVariableInitialization.super.getChildInternal(id)
}
final override Type getTargetType() { result = this.getEnclosingFunction().getReturnType() }
final override TranslatedInitialization getInitialization() {
@@ -390,7 +406,7 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt {
stmt.hasExpr() and not hasReturnValue(stmt.getEnclosingFunction())
}
override TranslatedElement getChild(int id) {
override TranslatedElement getChildInternal(int id) {
id = 0 and
result = this.getExpr()
}
@@ -428,7 +444,7 @@ class TranslatedReturnVoidStmt extends TranslatedReturnStmt {
not stmt.hasExpr() and not hasReturnValue(stmt.getEnclosingFunction())
}
override TranslatedElement getChild(int id) { none() }
override TranslatedElement getChildInternal(int id) { none() }
override Instruction getFirstInstruction(EdgeKind kind) {
result = this.getInstruction(OnlyInstructionTag()) and
@@ -464,6 +480,10 @@ class TranslatedNoValueReturnStmt extends TranslatedReturnStmt, TranslatedVariab
result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind)
}
final override TranslatedElement getChildInternal(int id) {
result = TranslatedVariableInitialization.super.getChildInternal(id)
}
final override Type getTargetType() { result = this.getEnclosingFunction().getReturnType() }
final override TranslatedInitialization getInitialization() { none() }
@@ -518,7 +538,7 @@ private class TryOrMicrosoftTryStmt extends Stmt {
class TranslatedTryStmt extends TranslatedStmt {
override TryOrMicrosoftTryStmt stmt;
override TranslatedElement getChild(int id) {
override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getBody()
or
result = this.getHandler(id - 1)
@@ -581,7 +601,7 @@ class TranslatedTryStmt extends TranslatedStmt {
class TranslatedBlock extends TranslatedStmt {
override BlockStmt stmt;
override TranslatedElement getChild(int id) { result = this.getStmt(id) }
override TranslatedElement getChildInternal(int id) { result = this.getStmt(id) }
override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
this.isEmpty() and
@@ -623,7 +643,7 @@ class TranslatedBlock extends TranslatedStmt {
abstract class TranslatedHandler extends TranslatedStmt {
override Handler stmt;
override TranslatedElement getChild(int id) { id = 1 and result = this.getBlock() }
override TranslatedElement getChildInternal(int id) { id = 1 and result = this.getBlock() }
override Instruction getFirstInstruction(EdgeKind kind) {
result = this.getInstruction(CatchTag()) and
@@ -656,8 +676,8 @@ class TranslatedCatchByTypeHandler extends TranslatedHandler {
resultType = getVoidType()
}
override TranslatedElement getChild(int id) {
result = super.getChild(id)
override TranslatedElement getChildInternal(int id) {
result = super.getChildInternal(id)
or
id = 0 and result = this.getParameter()
}
@@ -717,7 +737,7 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext {
else result = this.getFirstConditionInstruction(kind)
}
override TranslatedElement getChild(int id) {
override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getInitialization()
or
id = 1 and result = this.getCondition()
@@ -791,7 +811,7 @@ abstract class TranslatedLoop extends TranslatedStmt, ConditionContext {
final predicate hasCondition() { exists(stmt.getCondition()) }
override TranslatedElement getChild(int id) {
override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getCondition()
or
id = 1 and result = this.getBody()
@@ -842,7 +862,7 @@ class TranslatedDoStmt extends TranslatedLoop {
class TranslatedForStmt extends TranslatedLoop {
override ForStmt stmt;
override TranslatedElement getChild(int id) {
override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getInitialization()
or
id = 1 and result = this.getCondition()
@@ -893,7 +913,7 @@ class TranslatedForStmt extends TranslatedLoop {
class TranslatedRangeBasedForStmt extends TranslatedStmt, ConditionContext {
override RangeBasedForStmt stmt;
override TranslatedElement getChild(int id) {
override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getRangeVariableDeclStmt()
or
// Note: `__begin` and `__end` are declared by the same `DeclStmt`
@@ -987,7 +1007,7 @@ class TranslatedJumpStmt extends TranslatedStmt {
kind instanceof GotoEdge
}
override TranslatedElement getChild(int id) { none() }
override TranslatedElement getChildInternal(int id) { none() }
override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
tag = OnlyInstructionTag() and
@@ -1031,7 +1051,7 @@ class TranslatedSwitchStmt extends TranslatedStmt {
else result = this.getFirstExprInstruction(kind)
}
override TranslatedElement getChild(int id) {
override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getInitialization()
or
id = 1 and result = this.getExpr()
@@ -1086,7 +1106,7 @@ class TranslatedSwitchStmt extends TranslatedStmt {
class TranslatedAsmStmt extends TranslatedStmt {
override AsmStmt stmt;
override TranslatedExpr getChild(int id) {
override TranslatedExpr getChildInternal(int id) {
result = getTranslatedExpr(stmt.getChild(id).(Expr).getFullyConverted())
}
@@ -1108,7 +1128,7 @@ class TranslatedAsmStmt extends TranslatedStmt {
exists(int index |
tag = AsmTag() and
operandTag = asmOperand(index) and
result = this.getChild(index).getResult()
result = this.getChildInternal(index).getResult()
)
}
@@ -1140,7 +1160,7 @@ class TranslatedAsmStmt extends TranslatedStmt {
class TranslatedVlaDimensionStmt extends TranslatedStmt {
override VlaDimensionStmt stmt;
override TranslatedExpr getChild(int id) {
override TranslatedExpr getChildInternal(int id) {
id = 0 and
result = getTranslatedExpr(stmt.getDimensionExpr().getFullyConverted())
}
@@ -1164,7 +1184,7 @@ class TranslatedVlaDimensionStmt extends TranslatedStmt {
class TranslatedVlaDeclarationStmt extends TranslatedStmt {
override VlaDeclStmt stmt;
override TranslatedExpr getChild(int id) { none() }
override TranslatedExpr getChildInternal(int id) { none() }
override Instruction getFirstInstruction(EdgeKind kind) {
result = this.getInstruction(OnlyInstructionTag()) and