From a41107404c5c7c21ac7a3f67b52d327b7de14250 Mon Sep 17 00:00:00 2001 From: bjjwwang Date: Sat, 11 Apr 2026 23:20:10 +1000 Subject: [PATCH] Fix CallPE API breakage: adapt to phi-like MultiOpndStmt refactor CallPE was refactored from AssignStmt to MultiOpndStmt in SVF upstream. Replace getLHSVarID()/getRHSVarID() with getResID()/getOpVarID(i) and iterate over all operands with join semantics matching SVF's own AE. Co-Authored-By: Claude Opus 4.6 (1M context) --- Assignment-3/CPP/Assignment_3.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/Assignment-3/CPP/Assignment_3.cpp b/Assignment-3/CPP/Assignment_3.cpp index dcb5c57..55417d2 100644 --- a/Assignment-3/CPP/Assignment_3.cpp +++ b/Assignment-3/CPP/Assignment_3.cpp @@ -254,13 +254,23 @@ void AbstractExecution::updateStateOnCmp(const CmpStmt* cmp) { } } -/// Abstract state updates on an CallPE -void AbstractExecution::updateStateOnCall(const CallPE* call) { - const ICFGNode* node = call->getICFGNode(); +/// Abstract state updates on an CallPE (phi-like: formal = join(actual1@cs1, actual2@cs2, ...)) +void AbstractExecution::updateStateOnCall(const CallPE* callPE) { + const ICFGNode* node = callPE->getICFGNode(); AbstractState& as = getAbsStateFromTrace(node); - NodeID lhs = call->getLHSVarID(); - NodeID rhs = call->getRHSVarID(); - as[lhs] = as[rhs]; + NodeID res = callPE->getResID(); + AbstractValue rhs; + for (u32_t i = 0; i < callPE->getOpVarNum(); i++) + { + NodeID curId = callPE->getOpVarID(i); + const ICFGNode* opICFGNode = callPE->getOpCallICFGNode(i); + if (postAbsTrace.count(opICFGNode)) + { + AbstractState& opAs = postAbsTrace[opICFGNode]; + rhs.join_with(opAs[curId]); + } + } + as[res] = rhs; } /// Abstract state updates on an RetPE