Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 6 additions & 8 deletions pybind/AE.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -734,14 +734,12 @@ void bind_abstract_state(py::module& m) {
return self.getTrace().count(node) > 0;
}, py::arg("node"))

// Def/Use site queries.
.def("getUseSitesOfObjVar", &AbstractInterpretation::getUseSitesOfObjVar,
py::arg("obj"), py::arg("node"))
.def("getUseSitesOfValVar", &AbstractInterpretation::getUseSitesOfValVar, py::arg("var"))
.def("getDefSiteOfValVar", &AbstractInterpretation::getDefSiteOfValVar,
py::arg("var"), py::return_value_policy::reference)
.def("getDefSiteOfObjVar", &AbstractInterpretation::getDefSiteOfObjVar,
py::arg("obj"), py::arg("node"), py::return_value_policy::reference)
// Def/Use site queries used to live on AbstractInterpretation but
// moved to FullSparseAbstractInterpretation in upstream PR #1812
// (sparse-AE refactor). They aren't part of the dense base class
// public API any more, and pysvf has no FullSparseAbstractInterpretation
// binding yet, so they're dropped here. Equivalent SVFG-based
// queries are available on the SVFG class directly.

// Top-level driver methods.
.def("analyse", &AbstractInterpretation::analyse)
Expand Down
26 changes: 17 additions & 9 deletions pybind/Graphs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -942,18 +942,26 @@ void bind_svfg(py::module& m) {
.def("hasFormalINSVFGNodes", [](SVFG& svfg, const FunObjVar* fun) { return svfg.hasFormalINSVFGNodes(fun); }, py::arg("fun"), "Check if there are FormalIN SVFG nodes for a given function")
.def("getSVFGNode", [](SVFG& svfg, NodeID id) -> SVFGNode* { return svfg.getSVFGNode(id); }, py::arg("id"), py::return_value_policy::reference, "Get an SVFG node by ID")
.def("hasSVFGNode", [](SVFG& svfg, NodeID id) { return svfg.hasSVFGNode(id); }, py::arg("id"), "Check if an SVFG node exists")
.def("getDefSiteOfValVar", [](SVFG& svfg, const ValVar* var) { return svfg.getDefSiteOfValVar(var); }, py::arg("var"), py::return_value_policy::reference, "Get the definition site of a value variable")
.def("getDefSiteOfObjVar", [](SVFG& svfg, const ObjVar* obj, const ICFGNode* node) { return svfg.getDefSiteOfObjVar(obj, node); }, py::arg("obj"), py::arg("node"), py::return_value_policy::reference, "Get the definition site of an object variable")
// Upstream PR #1812 follow-up retyped these from ICFGNode to SVFGNode.
// The SVFGNode is the SVFG-internal representation of a def/use site;
// callers can map back to ICFGNode via SVFGNode::getICFGNode() if
// they need ICFG-side information.
.def("getDefSiteOfValVar", [](SVFG& svfg, const ValVar* var) { return svfg.getDefSiteOfValVar(var); }, py::arg("var"), py::return_value_policy::reference, "Get the SVFG definition site of a value variable")
.def("getDefSiteOfObjVar", [](SVFG& svfg, const ObjVar* obj, const SVFGNode* node) {
Set<const SVFGNode*> sites = svfg.getDefSiteOfObjVar(obj, node);
std::vector<const SVFGNode*> result(sites.begin(), sites.end());
return result;
}, py::arg("obj"), py::arg("node"), py::return_value_policy::reference, "Get the SVFG definition sites of an object variable reaching this SVFG node")
.def("getUseSitesOfValVar", [](SVFG& svfg, const ValVar* var) {
Set<const ICFGNode*> sites = svfg.getUseSitesOfValVar(var);
std::vector<const ICFGNode*> result(sites.begin(), sites.end());
Set<const SVFGNode*> sites = svfg.getUseSitesOfValVar(var);
std::vector<const SVFGNode*> result(sites.begin(), sites.end());
return result;
}, py::arg("var"), py::return_value_policy::reference, "Get the use sites of a value variable")
.def("getUseSitesOfObjVar", [](SVFG& svfg, const ObjVar* obj, const ICFGNode* node) {
Set<const ICFGNode*> sites = svfg.getUseSitesOfObjVar(obj, node);
std::vector<const ICFGNode*> result(sites.begin(), sites.end());
}, py::arg("var"), py::return_value_policy::reference, "Get the SVFG use sites of a value variable")
.def("getUseSitesOfObjVar", [](SVFG& svfg, const ObjVar* obj, const SVFGNode* node) {
Set<const SVFGNode*> sites = svfg.getUseSitesOfObjVar(obj, node);
std::vector<const SVFGNode*> result(sites.begin(), sites.end());
return result;
}, py::arg("obj"), py::arg("node"), py::return_value_policy::reference, "Get the use sites of an object variable")
}, py::arg("obj"), py::arg("node"), py::return_value_policy::reference, "Get the SVFG use sites of an object variable starting from this SVFG def-site node")
.def("isFunEntrySVFGNode", [](SVFG& svfg, const SVFGNode* node) { return svfg.isFunEntrySVFGNode(node); }, py::arg("node"), py::return_value_policy::reference, "Check if the SVFG node is a function entry node, returns the function or nullptr")
.def("isCallSiteRetSVFGNode", [](SVFG& svfg, const SVFGNode* node) { return svfg.isCallSiteRetSVFGNode(node); }, py::arg("node"), py::return_value_policy::reference, "Check if the SVFG node is a call site return node, returns the call site or nullptr");
}
Expand Down
21 changes: 8 additions & 13 deletions pysvf/pysvf.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -1719,14 +1719,14 @@ class SVFG(VFG):
"""Get an SVFG node by ID"""
def hasSVFGNode(self, id: int) -> bool: ...
"""Check if an SVFG node exists"""
def getDefSiteOfValVar(self, var: ValVar) -> ICFGNode: ...
"""Get the definition site of a value variable"""
def getDefSiteOfObjVar(self, obj: ObjVar, node: ICFGNode) -> ICFGNode: ...
"""Get the definition site of an object variable"""
def getUseSitesOfValVar(self, var: ValVar) -> List[ICFGNode]: ...
"""Get the use sites of a value variable"""
def getUseSitesOfObjVar(self, obj: ObjVar, node: ICFGNode) -> List[ICFGNode]: ...
"""Get the use sites of an object variable"""
def getDefSiteOfValVar(self, var: ValVar) -> "VFGNode": ...
"""Get the SVFG definition site of a value variable"""
def getDefSiteOfObjVar(self, obj: ObjVar, node: "VFGNode") -> List["VFGNode"]: ...
"""Get the SVFG definition sites of an object variable reaching this SVFG node"""
def getUseSitesOfValVar(self, var: ValVar) -> List["VFGNode"]: ...
"""Get the SVFG use sites of a value variable"""
def getUseSitesOfObjVar(self, obj: ObjVar, node: "VFGNode") -> List["VFGNode"]: ...
"""Get the SVFG use sites of an object variable starting from this SVFG def-site node"""
def isFunEntrySVFGNode(self, node: VFGNode) -> Optional[FunObjVar]: ...
"""Check if the SVFG node is a function entry node, returns the function or nullptr"""
def isCallSiteRetSVFGNode(self, node: VFGNode) -> Optional[CallICFGNode]: ...
Expand Down Expand Up @@ -2022,11 +2022,6 @@ class AbstractInterpretation:
def __setitem__(self, node: 'ICFGNode', state: AbstractState) -> None: ...
def __contains__(self, node: 'ICFGNode') -> bool: ...

def getUseSitesOfObjVar(self, obj: 'ObjVar', node: 'ICFGNode') -> set: ...
def getUseSitesOfValVar(self, var: 'ValVar') -> set: ...
def getDefSiteOfValVar(self, var: 'ValVar') -> 'ICFGNode': ...
def getDefSiteOfObjVar(self, obj: 'ObjVar', node: 'ICFGNode') -> 'ICFGNode': ...

def analyse(self) -> None: ...
def analyzeFromAllProgEntries(self) -> None: ...
def runOnModule(self) -> None: ...
Expand Down
Loading