From 7802bb46c1cb6139ac882532b6e8314f3aacb9c3 Mon Sep 17 00:00:00 2001 From: yuleisui Date: Wed, 29 Oct 2025 19:46:23 +1100 Subject: [PATCH] unify BaseObjVar type with SVFVar type --- svf-llvm/lib/SVFIRBuilder.cpp | 23 ++++++------- svf/include/SVFIR/SVFIR.h | 48 +++++++++++++------------- svf/include/SVFIR/SVFStatements.h | 6 +++- svf/include/SVFIR/SVFVariables.h | 50 ++++++++++++---------------- svf/lib/SVFIR/PAGBuilderFromFile.cpp | 2 +- svf/lib/SVFIR/SVFVariables.cpp | 4 +-- 6 files changed, 63 insertions(+), 70 deletions(-) diff --git a/svf-llvm/lib/SVFIRBuilder.cpp b/svf-llvm/lib/SVFIRBuilder.cpp index 9168faed1..63479ab14 100644 --- a/svf-llvm/lib/SVFIRBuilder.cpp +++ b/svf-llvm/lib/SVFIRBuilder.cpp @@ -339,7 +339,7 @@ void SVFIRBuilder::createFunObjVars() DBOUT(DPAGBuild, outs() << "add obj node " << id << "\n"); // Check if the value is a function and add a function object node - pag->addFunObjNode(id, pag->getObjTypeInfo(id), llvmModuleSet()->getSVFType(fun->getType()), nullptr); + pag->addFunObjNode(id, pag->getObjTypeInfo(id), nullptr); llvmModuleSet()->LLVMFun2FunObjVar[fun] = cast(pag->getGNode(id)); FunObjVar *funObjVar = SVFUtil::cast(pag->getGNode(id)); @@ -403,52 +403,49 @@ void SVFIRBuilder::initialiseBaseObjVars() else if (LLVMUtil::isHeapObj(llvmValue)) { NodeID id = llvmModuleSet()->getObjectNode(iter->first); - pag->addHeapObjNode(iter->second, pag->getObjTypeInfo(id), llvmModuleSet()->getSVFType(llvmValue->getType()), icfgNode); + pag->addHeapObjNode(iter->second, pag->getObjTypeInfo(id), icfgNode); } // Check if the value is an alloca instruction and add a stack object node else if (LLVMUtil::isStackObj(llvmValue)) { NodeID id = llvmModuleSet()->getObjectNode(iter->first); - pag->addStackObjNode(iter->second, pag->getObjTypeInfo(id), llvmModuleSet()->getSVFType(llvmValue->getType()), icfgNode); + pag->addStackObjNode(iter->second, pag->getObjTypeInfo(id), icfgNode); } else if (auto fpValue = SVFUtil::dyn_cast(llvmValue)) { NodeID id = llvmModuleSet()->getObjectNode(iter->first); - pag->addConstantFPObjNode(iter->second, pag->getObjTypeInfo(id), LLVMUtil::getDoubleValue(fpValue), llvmModuleSet()->getSVFType(llvmValue->getType()), icfgNode); + pag->addConstantFPObjNode(iter->second, pag->getObjTypeInfo(id), LLVMUtil::getDoubleValue(fpValue), icfgNode); } else if (auto intValue = SVFUtil::dyn_cast(llvmValue)) { NodeID id = llvmModuleSet()->getObjectNode(iter->first); - pag->addConstantIntObjNode(iter->second, pag->getObjTypeInfo(id), LLVMUtil::getIntegerValue(intValue), llvmModuleSet()->getSVFType(llvmValue->getType()), icfgNode); + pag->addConstantIntObjNode(iter->second, pag->getObjTypeInfo(id), LLVMUtil::getIntegerValue(intValue), icfgNode); } else if (SVFUtil::isa(llvmValue)) { NodeID id = llvmModuleSet()->getObjectNode(iter->first); - pag->addConstantNullPtrObjNode(iter->second, pag->getObjTypeInfo(id), llvmModuleSet()->getSVFType(llvmValue->getType()), icfgNode); + pag->addConstantNullPtrObjNode(iter->second, pag->getObjTypeInfo(id), icfgNode); } else if (SVFUtil::isa(llvmValue)) { NodeID id = llvmModuleSet()->getObjectNode(iter->first); - pag->addGlobalObjNode(iter->second, - pag->getObjTypeInfo(id), - llvmModuleSet()->getSVFType(llvmValue->getType()), icfgNode); + pag->addGlobalObjNode(iter->second, pag->getObjTypeInfo(id), icfgNode); } else if (SVFUtil::isa(llvmValue)) { NodeID id = llvmModuleSet()->getObjectNode(iter->first); - pag->addConstantDataObjNode(iter->second, pag->getObjTypeInfo(id), llvmModuleSet()->getSVFType(llvmValue->getType()), icfgNode); + pag->addConstantDataObjNode(iter->second, pag->getObjTypeInfo(id), icfgNode); } else if (SVFUtil::isa(llvmValue)) { NodeID id = llvmModuleSet()->getObjectNode(iter->first); - pag->addConstantAggObjNode(iter->second, pag->getObjTypeInfo(id), llvmModuleSet()->getSVFType(llvmValue->getType()), icfgNode); + pag->addConstantAggObjNode(iter->second, pag->getObjTypeInfo(id), icfgNode); } // Add a generic object node for other types of values else { NodeID id = llvmModuleSet()->getObjectNode(iter->first); - pag->addObjNode(iter->second, - pag->getObjTypeInfo(id), llvmModuleSet()->getSVFType(llvmValue->getType()), icfgNode); + pag->addObjNode(iter->second, pag->getObjTypeInfo(id), icfgNode); } llvmModuleSet()->addToSVFVar2LLVMValueMap(llvmValue, pag->getGNode(iter->second)); } diff --git a/svf/include/SVFIR/SVFIR.h b/svf/include/SVFIR/SVFIR.h index ab9334417..89e82ec5c 100644 --- a/svf/include/SVFIR/SVFIR.h +++ b/svf/include/SVFIR/SVFIR.h @@ -614,79 +614,79 @@ class SVFIR : public IRGraph /// Add a memory obj node - inline NodeID addObjNode(NodeID i, ObjTypeInfo* ti, const SVFType* type, const ICFGNode* node) + inline NodeID addObjNode(NodeID i, ObjTypeInfo* ti, const ICFGNode* node) { - return addFIObjNode( i, ti, type, node); + return addFIObjNode( i, ti, node); } /** * Creates and adds a heap object node to the SVFIR */ - inline NodeID addHeapObjNode(NodeID i, ObjTypeInfo* ti, const SVFType* type, const ICFGNode* node) + inline NodeID addHeapObjNode(NodeID i, ObjTypeInfo* ti, const ICFGNode* node) { memToFieldsMap[i].set(i); - HeapObjVar *heapObj = new HeapObjVar(i, ti, type, node); + HeapObjVar *heapObj = new HeapObjVar(i, ti, node); return addObjNode(heapObj); } /** * Creates and adds a stack object node to the SVFIR */ - inline NodeID addStackObjNode(NodeID i, ObjTypeInfo* ti, const SVFType* type, const ICFGNode* node) + inline NodeID addStackObjNode(NodeID i, ObjTypeInfo* ti, const ICFGNode* node) { memToFieldsMap[i].set(i); - StackObjVar *stackObj = new StackObjVar(i, ti, type, node); + StackObjVar *stackObj = new StackObjVar(i, ti, node); return addObjNode(stackObj); } - NodeID addFunObjNode(NodeID id, ObjTypeInfo* ti, const SVFType* type, const ICFGNode* node) + NodeID addFunObjNode(NodeID id, ObjTypeInfo* ti, const ICFGNode* node) { memToFieldsMap[id].set(id); - FunObjVar* funObj = new FunObjVar(id, ti, type, node); + FunObjVar* funObj = new FunObjVar(id, ti, node); return addObjNode(funObj); } - inline NodeID addConstantFPObjNode(NodeID i, ObjTypeInfo* ti, double dval, const SVFType* type, const ICFGNode* node) + inline NodeID addConstantFPObjNode(NodeID i, ObjTypeInfo* ti, double dval, const ICFGNode* node) { memToFieldsMap[i].set(i); - ConstFPObjVar* conObj = new ConstFPObjVar(i, dval, ti, type, node); + ConstFPObjVar* conObj = new ConstFPObjVar(i, dval, ti, node); return addObjNode(conObj); } - inline NodeID addConstantIntObjNode(NodeID i, ObjTypeInfo* ti, const std::pair& intValue, const SVFType* type, const ICFGNode* node) + inline NodeID addConstantIntObjNode(NodeID i, ObjTypeInfo* ti, const std::pair& intValue, const ICFGNode* node) { memToFieldsMap[i].set(i); ConstIntObjVar* conObj = - new ConstIntObjVar(i, intValue.first, intValue.second, ti, type, node); + new ConstIntObjVar(i, intValue.first, intValue.second, ti, node); return addObjNode(conObj); } - inline NodeID addConstantNullPtrObjNode(const NodeID i, ObjTypeInfo* ti, const SVFType* type, const ICFGNode* node) + inline NodeID addConstantNullPtrObjNode(const NodeID i, ObjTypeInfo* ti, const ICFGNode* node) { memToFieldsMap[i].set(i); - ConstNullPtrObjVar* conObj = new ConstNullPtrObjVar(i, ti, type, node); + ConstNullPtrObjVar* conObj = new ConstNullPtrObjVar(i, ti, node); return addObjNode(conObj); } - inline NodeID addGlobalObjNode(const NodeID i, ObjTypeInfo* ti, const SVFType* type, const ICFGNode* node) + inline NodeID addGlobalObjNode(const NodeID i, ObjTypeInfo* ti, const ICFGNode* node) { memToFieldsMap[i].set(i); - GlobalObjVar* gObj = new GlobalObjVar(i, ti, type, node); + GlobalObjVar* gObj = new GlobalObjVar(i, ti, node); return addObjNode(gObj); } - inline NodeID addConstantAggObjNode(const NodeID i, ObjTypeInfo* ti, const SVFType* type, const ICFGNode* node) + inline NodeID addConstantAggObjNode(const NodeID i, ObjTypeInfo* ti, const ICFGNode* node) { memToFieldsMap[i].set(i); - ConstAggObjVar* conObj = new ConstAggObjVar(i, ti, type, node); + ConstAggObjVar* conObj = new ConstAggObjVar(i, ti, node); return addObjNode(conObj); } - inline NodeID addConstantDataObjNode(const NodeID i, ObjTypeInfo* ti, const SVFType* type, const ICFGNode* node) + inline NodeID addConstantDataObjNode(const NodeID i, ObjTypeInfo* ti, const ICFGNode* node) { memToFieldsMap[i].set(i); - ConstDataObjVar* conObj = new ConstDataObjVar(i, ti, type, node); + ConstDataObjVar* conObj = new ConstDataObjVar(i, ti, node); return addObjNode(conObj); } @@ -708,10 +708,10 @@ class SVFIR : public IRGraph /// Add a field obj node, this method can only invoked by getGepObjVar NodeID addGepObjNode(const BaseObjVar* baseObj, const APOffset& apOffset, const NodeID gepId); /// Add a field-insensitive node, this method can only invoked by getFIGepObjNode - NodeID addFIObjNode(NodeID i, ObjTypeInfo* ti, const SVFType* type, const ICFGNode* node) + NodeID addFIObjNode(NodeID i, ObjTypeInfo* ti, const ICFGNode* node) { memToFieldsMap[i].set(i); - BaseObjVar* baseObj = new BaseObjVar(i, ti, type, node); + BaseObjVar* baseObj = new BaseObjVar(i, ti, node); return addObjNode(baseObj); } @@ -730,11 +730,11 @@ class SVFIR : public IRGraph { ObjTypeInfo* ti = createObjTypeInfo(type); idToObjTypeInfoMap()[i] = ti; - return addObjNode(new DummyObjVar(i, ti, nullptr, type)); + return addObjNode(new DummyObjVar(i, ti, nullptr)); } else { - return addObjNode(new DummyObjVar(i, getObjTypeInfo(i), nullptr, type)); + return addObjNode(new DummyObjVar(i, getObjTypeInfo(i), nullptr)); } } diff --git a/svf/include/SVFIR/SVFStatements.h b/svf/include/SVFIR/SVFStatements.h index 73d66d6d0..3717e1f6c 100644 --- a/svf/include/SVFIR/SVFStatements.h +++ b/svf/include/SVFIR/SVFStatements.h @@ -129,7 +129,7 @@ class SVFStmt : public GenericPAGEdgeTy return edgeId; } /// Whether src and dst nodes are both of pointer type - bool isPTAEdge() const; + virtual bool isPTAEdge() const; /// Get/set methods for llvm instruction //@{ @@ -343,6 +343,10 @@ class AddrStmt: public AssignStmt return arrSize; } + virtual bool isPTAEdge() const override + { + return true; + } }; /*! diff --git a/svf/include/SVFIR/SVFVariables.h b/svf/include/SVFIR/SVFVariables.h index bc5e2d1ca..044eaa21c 100644 --- a/svf/include/SVFIR/SVFVariables.h +++ b/svf/include/SVFIR/SVFVariables.h @@ -533,9 +533,8 @@ class BaseObjVar : public ObjVar //@} /// Constructor - BaseObjVar(NodeID i, ObjTypeInfo* ti, - const SVFType* svfType, const ICFGNode* node, PNODEK ty = BaseObjNode) - : ObjVar(i, svfType, ty), typeInfo(ti), icfgNode(node) + BaseObjVar(NodeID i, ObjTypeInfo* ti, const ICFGNode* node, PNODEK ty = BaseObjNode) + : ObjVar(i, ti->getType(), ty), typeInfo(ti), icfgNode(node) { } @@ -564,12 +563,6 @@ class BaseObjVar : public ObjVar return id; } - /// Get obj type - const SVFType* getType() const - { - return typeInfo->getType(); - } - /// Get the number of elements of this object u32_t getNumOfElements() const { @@ -832,8 +825,8 @@ class HeapObjVar: public BaseObjVar //@} /// Constructor - HeapObjVar(NodeID i, ObjTypeInfo* ti, const SVFType* svfType, const ICFGNode* node): - BaseObjVar(i, ti, svfType, node, HeapObjNode) + HeapObjVar(NodeID i, ObjTypeInfo* ti, const ICFGNode* node): + BaseObjVar(i, ti, node, HeapObjNode) { } @@ -888,8 +881,8 @@ class StackObjVar: public BaseObjVar //@} /// Constructor - StackObjVar(NodeID i, ObjTypeInfo* ti, const SVFType* svfType, const ICFGNode* node): - BaseObjVar(i, ti, svfType, node, StackObjNode) + StackObjVar(NodeID i, ObjTypeInfo* ti, const ICFGNode* node): + BaseObjVar(i, ti, node, StackObjNode) { } @@ -962,7 +955,7 @@ class FunObjVar : public BaseObjVar //@} /// Constructor - FunObjVar(NodeID i, ObjTypeInfo* ti, const SVFType* svfType, const ICFGNode* node); + FunObjVar(NodeID i, ObjTypeInfo* ti, const ICFGNode* node); virtual ~FunObjVar() @@ -1599,8 +1592,8 @@ class GlobalObjVar : public BaseObjVar //@} /// Constructor - GlobalObjVar(NodeID i, ObjTypeInfo* ti, const SVFType* svfType, const ICFGNode* node, - PNODEK ty = GlobalObjNode): BaseObjVar(i, ti, svfType, node, ty) + GlobalObjVar(NodeID i, ObjTypeInfo* ti, const ICFGNode* node, + PNODEK ty = GlobalObjNode): BaseObjVar(i, ti, node, ty) { } @@ -1643,8 +1636,8 @@ class ConstAggObjVar : public BaseObjVar //@} /// Constructor - ConstAggObjVar(NodeID i, ObjTypeInfo* ti, const SVFType* svfType, const ICFGNode* node) - : BaseObjVar(i, ti, svfType, node, ConstAggObjNode) + ConstAggObjVar(NodeID i, ObjTypeInfo* ti, const ICFGNode* node) + : BaseObjVar(i, ti, node, ConstAggObjNode) { } @@ -1695,8 +1688,8 @@ class ConstDataObjVar : public BaseObjVar //@} /// Constructor - ConstDataObjVar(NodeID i, ObjTypeInfo* ti, const SVFType* svfType, const ICFGNode* node, PNODEK ty = ConstDataObjNode) - : BaseObjVar(i, ti, svfType, node, ty) + ConstDataObjVar(NodeID i, ObjTypeInfo* ti, const ICFGNode* node, PNODEK ty = ConstDataObjNode) + : BaseObjVar(i, ti, node, ty) { } @@ -1756,8 +1749,8 @@ class ConstFPObjVar : public ConstDataObjVar //@} /// Constructor - ConstFPObjVar(NodeID i, double dv, ObjTypeInfo* ti, const SVFType* svfType, const ICFGNode* node) - : ConstDataObjVar(i, ti, svfType, node, ConstFPObjNode), dval(dv) + ConstFPObjVar(NodeID i, double dv, ObjTypeInfo* ti, const ICFGNode* node) + : ConstDataObjVar(i, ti, node, ConstFPObjNode), dval(dv) { } @@ -1825,12 +1818,11 @@ class ConstIntObjVar : public ConstDataObjVar //@} /// Constructor - ConstIntObjVar(NodeID i, s64_t sv, u64_t zv, ObjTypeInfo* ti, const SVFType* svfType, const ICFGNode* node) - : ConstDataObjVar(i, ti, svfType, node, ConstIntObjNode), zval(zv), sval(sv) + ConstIntObjVar(NodeID i, s64_t sv, u64_t zv, ObjTypeInfo* ti, const ICFGNode* node) + : ConstDataObjVar(i, ti, node, ConstIntObjNode), zval(zv), sval(sv) { } - virtual const std::string toString() const; }; @@ -1874,8 +1866,8 @@ class ConstNullPtrObjVar : public ConstDataObjVar //@} /// Constructor - ConstNullPtrObjVar(NodeID i, ObjTypeInfo* ti, const SVFType* svfType, const ICFGNode* node) - : ConstDataObjVar(i, ti, svfType, node, ConstNullptrObjNode) + ConstNullPtrObjVar(NodeID i, ObjTypeInfo* ti, const ICFGNode* node) + : ConstDataObjVar(i, ti, node, ConstNullptrObjNode) { } virtual bool isConstDataOrAggDataButNotNullPtr() const @@ -2073,8 +2065,8 @@ class DummyObjVar: public BaseObjVar //@} /// Constructor - DummyObjVar(NodeID i, ObjTypeInfo* ti, const ICFGNode* node, const SVFType* svfType = SVFType::getSVFPtrType()) - : BaseObjVar(i, ti, svfType, node, DummyObjNode) + DummyObjVar(NodeID i, ObjTypeInfo* ti, const ICFGNode* node) + : BaseObjVar(i, ti, node, DummyObjNode) { } diff --git a/svf/lib/SVFIR/PAGBuilderFromFile.cpp b/svf/lib/SVFIR/PAGBuilderFromFile.cpp index ebf11e03f..eec286abe 100644 --- a/svf/lib/SVFIR/PAGBuilderFromFile.cpp +++ b/svf/lib/SVFIR/PAGBuilderFromFile.cpp @@ -93,7 +93,7 @@ SVFIR* PAGBuilderFromFile::build() pag->addDummyValNode(nodeId, nullptr); else if (nodetype == "o") { - pag->addFIObjNode(nodeId, pag->createObjTypeInfo(nullptr), SVFType::getSVFPtrType(), nullptr); + pag->addFIObjNode(nodeId, pag->createObjTypeInfo(nullptr), nullptr); } else assert(false && "format not support, pls specify node type"); diff --git a/svf/lib/SVFIR/SVFVariables.cpp b/svf/lib/SVFIR/SVFVariables.cpp index d8a49f7fe..2e6447ff6 100644 --- a/svf/lib/SVFIR/SVFVariables.cpp +++ b/svf/lib/SVFIR/SVFVariables.cpp @@ -440,8 +440,8 @@ const std::string ConstNullPtrObjVar::toString() const return rawstr.str(); } -FunObjVar::FunObjVar(NodeID i, ObjTypeInfo* ti, const SVFType* svfType, const ICFGNode* node) - : BaseObjVar(i, ti, svfType, node, FunObjNode) +FunObjVar::FunObjVar(NodeID i, ObjTypeInfo* ti, const ICFGNode* node) + : BaseObjVar(i, ti, node, FunObjNode) { }