From ce05772fd9e2a80f3e63842c3c3d16f530a98e8b Mon Sep 17 00:00:00 2001 From: bjjwwang Date: Wed, 8 Jan 2025 15:24:44 +1100 Subject: [PATCH 1/6] fix a bug of int128 --- svf-llvm/include/SVF-LLVM/LLVMUtil.h | 26 ++++++++++++++++++++++++++ svf-llvm/lib/SVFIRBuilder.cpp | 13 ++++++++++--- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/svf-llvm/include/SVF-LLVM/LLVMUtil.h b/svf-llvm/include/SVF-LLVM/LLVMUtil.h index 02597722d5..bda7298dae 100644 --- a/svf-llvm/include/SVF-LLVM/LLVMUtil.h +++ b/svf-llvm/include/SVF-LLVM/LLVMUtil.h @@ -52,6 +52,32 @@ inline bool isCallSite(const Value* val) return SVFUtil::isa(val); } +inline double getDoubleValue(const ConstantFP* fpValue) { + double dval = 0; + if (fpValue->isNormalFP()) + { + const llvm::fltSemantics& semantics = fpValue->getValueAPF().getSemantics(); + if (&semantics == &llvm::APFloat::IEEEhalf() || + &semantics == &llvm::APFloat::IEEEsingle() || + &semantics == &llvm::APFloat::IEEEdouble() || + &semantics == &llvm::APFloat::IEEEquad() || + &semantics == &llvm::APFloat::x87DoubleExtended()) + { + dval = fpValue->getValueAPF().convertToDouble(); + } + else + { + assert (false && "Unsupported floating point type"); + abort(); + } + } + else + { + // other cfp type, like isZero(), isInfinity(), isNegative(), etc. + // do nothing + } + return dval; +} /// Return LLVM callsite given a value inline const CallBase* getLLVMCallSite(const Value* value) diff --git a/svf-llvm/lib/SVFIRBuilder.cpp b/svf-llvm/lib/SVFIRBuilder.cpp index 9e1955870f..3786258c31 100644 --- a/svf-llvm/lib/SVFIRBuilder.cpp +++ b/svf-llvm/lib/SVFIRBuilder.cpp @@ -247,13 +247,16 @@ void SVFIRBuilder::initialiseNodes() } else if (auto fpValue = SVFUtil::dyn_cast(llvmValue)) { - pag->addConstantFPValNode(iter->first, fpValue->getValueAPF().convertToDouble(), iter->second, icfgNode); + pag->addConstantFPValNode(iter->first, LLVMUtil::getDoubleValue(fpValue), iter->second, icfgNode); llvmModuleSet()->addToLLVMVal2SVFVarMap( fpValue, pag->getGNode(iter->second)); } else if (auto intValue = SVFUtil::dyn_cast(llvmValue)) { - pag->addConstantIntValNode(iter->first, intValue->getSExtValue(), intValue->getZExtValue(), iter->second, icfgNode); + if (intValue->getBitWidth() <= 64 && intValue->getBitWidth() >= 1) + pag->addConstantIntValNode(iter->first, intValue->getSExtValue(), intValue->getZExtValue(), iter->second, icfgNode); + else + pag->addConstantIntValNode(iter->first, 0, 0, iter->second, icfgNode); llvmModuleSet()->addToLLVMVal2SVFVarMap( intValue, pag->getGNode(iter->second)); } @@ -322,13 +325,17 @@ void SVFIRBuilder::initialiseNodes() } else if (auto fpValue = SVFUtil::dyn_cast(llvmValue)) { - pag->addConstantFPObjNode(iter->first, fpValue->getValueAPF().convertToDouble(), iter->second); + pag->addConstantFPObjNode(iter->first, LLVMUtil::getDoubleValue(fpValue), iter->second); llvmModuleSet()->addToLLVMVal2SVFVarMap( fpValue, pag->getGNode(iter->second)); } else if (auto intValue = SVFUtil::dyn_cast(llvmValue)) { pag->addConstantIntObjNode(iter->first, intValue->getSExtValue(), intValue->getZExtValue(), iter->second); + if (intValue->getBitWidth() <= 64 && intValue->getBitWidth() >= 1) + pag->addConstantIntObjNode(iter->first, intValue->getSExtValue(), intValue->getZExtValue(), iter->second); + else + pag->addConstantIntObjNode(iter->first, 0, 0, iter->second); llvmModuleSet()->addToLLVMVal2SVFVarMap( intValue, pag->getGNode(iter->second)); } From 49f4a482220f04ffde1a8c3338c8e91b4ebb7179 Mon Sep 17 00:00:00 2001 From: bjjwwang Date: Wed, 8 Jan 2025 15:51:51 +1100 Subject: [PATCH 2/6] wrap integer value function --- svf-llvm/include/SVF-LLVM/LLVMUtil.h | 7 +++++++ svf-llvm/lib/SVFIRBuilder.cpp | 11 ++--------- svf-llvm/lib/SVFIRExtAPI.cpp | 2 +- svf/include/SVFIR/SVFIR.h | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/svf-llvm/include/SVF-LLVM/LLVMUtil.h b/svf-llvm/include/SVF-LLVM/LLVMUtil.h index bda7298dae..428d91269a 100644 --- a/svf-llvm/include/SVF-LLVM/LLVMUtil.h +++ b/svf-llvm/include/SVF-LLVM/LLVMUtil.h @@ -79,6 +79,13 @@ inline double getDoubleValue(const ConstantFP* fpValue) { return dval; } +inline std::pair getIntegerValue(const ConstantInt* intValue) { + if (intValue->getBitWidth() <= 64 && intValue->getBitWidth() >= 1) + return std::make_pair(intValue->getSExtValue(), intValue->getZExtValue()); + else + return std::make_pair(0,0); +} + /// Return LLVM callsite given a value inline const CallBase* getLLVMCallSite(const Value* value) { diff --git a/svf-llvm/lib/SVFIRBuilder.cpp b/svf-llvm/lib/SVFIRBuilder.cpp index 3786258c31..2c87155e81 100644 --- a/svf-llvm/lib/SVFIRBuilder.cpp +++ b/svf-llvm/lib/SVFIRBuilder.cpp @@ -253,10 +253,7 @@ void SVFIRBuilder::initialiseNodes() } else if (auto intValue = SVFUtil::dyn_cast(llvmValue)) { - if (intValue->getBitWidth() <= 64 && intValue->getBitWidth() >= 1) - pag->addConstantIntValNode(iter->first, intValue->getSExtValue(), intValue->getZExtValue(), iter->second, icfgNode); - else - pag->addConstantIntValNode(iter->first, 0, 0, iter->second, icfgNode); + pag->addConstantIntValNode(iter->first, LLVMUtil::getIntegerValue(intValue), iter->second, icfgNode); llvmModuleSet()->addToLLVMVal2SVFVarMap( intValue, pag->getGNode(iter->second)); } @@ -331,11 +328,7 @@ void SVFIRBuilder::initialiseNodes() } else if (auto intValue = SVFUtil::dyn_cast(llvmValue)) { - pag->addConstantIntObjNode(iter->first, intValue->getSExtValue(), intValue->getZExtValue(), iter->second); - if (intValue->getBitWidth() <= 64 && intValue->getBitWidth() >= 1) - pag->addConstantIntObjNode(iter->first, intValue->getSExtValue(), intValue->getZExtValue(), iter->second); - else - pag->addConstantIntObjNode(iter->first, 0, 0, iter->second); + pag->addConstantIntObjNode(iter->first, LLVMUtil::getIntegerValue(intValue), iter->second); llvmModuleSet()->addToLLVMVal2SVFVarMap( intValue, pag->getGNode(iter->second)); } diff --git a/svf-llvm/lib/SVFIRExtAPI.cpp b/svf-llvm/lib/SVFIRExtAPI.cpp index 1b67f9f9fd..093a13bc5b 100644 --- a/svf-llvm/lib/SVFIRExtAPI.cpp +++ b/svf-llvm/lib/SVFIRExtAPI.cpp @@ -64,7 +64,7 @@ const Type* SVFIRBuilder::getBaseTypeAndFlattenedFields(const Value* V, std::vec { SymbolTableBuilder builder(pag->getSymbolInfo()); builder.collectSym(offset); - pag->addConstantIntValNode(svfOffset, offset->getSExtValue(), offset->getZExtValue(), pag->getSymbolInfo()->getValSym(svfOffset), nullptr); + pag->addConstantIntValNode(svfOffset, std::make_pair(offset->getSExtValue(), offset->getZExtValue()), pag->getSymbolInfo()->getValSym(svfOffset), nullptr); } ls.addOffsetVarAndGepTypePair(getPAG()->getGNode(getPAG()->getValueNode(svfOffset)), nullptr); fields.push_back(ls); diff --git a/svf/include/SVFIR/SVFIR.h b/svf/include/SVFIR/SVFIR.h index 913ce3d7fd..258f274d63 100644 --- a/svf/include/SVFIR/SVFIR.h +++ b/svf/include/SVFIR/SVFIR.h @@ -585,10 +585,10 @@ class SVFIR : public IRGraph return addNode(node, i); } - inline NodeID addConstantIntValNode(const SVFValue* curInst, s64_t sval, u64_t zval, const NodeID i, + inline NodeID addConstantIntValNode(const SVFValue* curInst, std::pair intValue, const NodeID i, const ICFGNode* icfgNode) { - SVFVar* node = new ConstantIntValVar(curInst, sval, zval, i, icfgNode); + SVFVar* node = new ConstantIntValVar(curInst, intValue.first, intValue.second, i, icfgNode); return addNode(node, i); } @@ -656,12 +656,12 @@ class SVFIR : public IRGraph } - inline NodeID addConstantIntObjNode(const SVFValue* curInst, s64_t sval, u64_t zval, const NodeID i) { + inline NodeID addConstantIntObjNode(const SVFValue* curInst, std::pair intValue, const NodeID i) { const MemObj* mem = getMemObj(curInst); NodeID base = mem->getId(); memToFieldsMap[base].set(mem->getId()); ConstantIntObjVar* node = - new ConstantIntObjVar(curInst, sval, zval, mem->getId(), mem); + new ConstantIntObjVar(curInst, intValue.first, intValue.second, mem->getId(), mem); return addObjNode(curInst, node, mem->getId()); } From 75be14769189d9dcbef635a2550fdfd01b2503a2 Mon Sep 17 00:00:00 2001 From: bjjwwang Date: Wed, 8 Jan 2025 19:32:39 +1100 Subject: [PATCH 3/6] revise the std::make_pair --- svf-llvm/lib/SVFIRBuilder.cpp | 6 ++++-- svf-llvm/lib/SVFIRExtAPI.cpp | 2 +- svf/include/SVFIR/SVFIR.h | 8 ++++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/svf-llvm/lib/SVFIRBuilder.cpp b/svf-llvm/lib/SVFIRBuilder.cpp index 2c87155e81..798c95dd55 100644 --- a/svf-llvm/lib/SVFIRBuilder.cpp +++ b/svf-llvm/lib/SVFIRBuilder.cpp @@ -253,7 +253,8 @@ void SVFIRBuilder::initialiseNodes() } else if (auto intValue = SVFUtil::dyn_cast(llvmValue)) { - pag->addConstantIntValNode(iter->first, LLVMUtil::getIntegerValue(intValue), iter->second, icfgNode); + std::pair intVal = LLVMUtil::getIntegerValue(intValue); + pag->addConstantIntValNode(iter->first, intVal.first, intVal.second, iter->second, icfgNode); llvmModuleSet()->addToLLVMVal2SVFVarMap( intValue, pag->getGNode(iter->second)); } @@ -328,7 +329,8 @@ void SVFIRBuilder::initialiseNodes() } else if (auto intValue = SVFUtil::dyn_cast(llvmValue)) { - pag->addConstantIntObjNode(iter->first, LLVMUtil::getIntegerValue(intValue), iter->second); + std::pair intVal = LLVMUtil::getIntegerValue(intValue); + pag->addConstantIntObjNode(iter->first, intVal.first, intVal.second, iter->second); llvmModuleSet()->addToLLVMVal2SVFVarMap( intValue, pag->getGNode(iter->second)); } diff --git a/svf-llvm/lib/SVFIRExtAPI.cpp b/svf-llvm/lib/SVFIRExtAPI.cpp index 093a13bc5b..1b67f9f9fd 100644 --- a/svf-llvm/lib/SVFIRExtAPI.cpp +++ b/svf-llvm/lib/SVFIRExtAPI.cpp @@ -64,7 +64,7 @@ const Type* SVFIRBuilder::getBaseTypeAndFlattenedFields(const Value* V, std::vec { SymbolTableBuilder builder(pag->getSymbolInfo()); builder.collectSym(offset); - pag->addConstantIntValNode(svfOffset, std::make_pair(offset->getSExtValue(), offset->getZExtValue()), pag->getSymbolInfo()->getValSym(svfOffset), nullptr); + pag->addConstantIntValNode(svfOffset, offset->getSExtValue(), offset->getZExtValue(), pag->getSymbolInfo()->getValSym(svfOffset), nullptr); } ls.addOffsetVarAndGepTypePair(getPAG()->getGNode(getPAG()->getValueNode(svfOffset)), nullptr); fields.push_back(ls); diff --git a/svf/include/SVFIR/SVFIR.h b/svf/include/SVFIR/SVFIR.h index 603d072d9b..d31b4c82ee 100644 --- a/svf/include/SVFIR/SVFIR.h +++ b/svf/include/SVFIR/SVFIR.h @@ -585,10 +585,10 @@ class SVFIR : public IRGraph return addNode(node, i); } - inline NodeID addConstantIntValNode(const SVFValue* curInst, std::pair intValue, const NodeID i, + inline NodeID addConstantIntValNode(const SVFValue* curInst, s64_t sval, u64_t zval, const NodeID i, const ICFGNode* icfgNode) { - SVFVar* node = new ConstantIntValVar(curInst, intValue.first, intValue.second, i, icfgNode); + SVFVar* node = new ConstantIntValVar(curInst, sval, zval, i, icfgNode); return addNode(node, i); } @@ -656,12 +656,12 @@ class SVFIR : public IRGraph } - inline NodeID addConstantIntObjNode(const SVFValue* curInst, std::pair intValue, const NodeID i) { + inline NodeID addConstantIntObjNode(const SVFValue* curInst, s64_t sval, u64_t zval, const NodeID i) { const MemObj* mem = getMemObj(curInst); NodeID base = mem->getId(); memToFieldsMap[base].set(mem->getId()); ConstantIntObjVar* node = - new ConstantIntObjVar(curInst, intValue.first, intValue.second, mem->getId(), mem); + new ConstantIntObjVar(curInst, sval, zval, mem->getId(), mem); return addObjNode(curInst, node, mem->getId()); } From 5b82bf70f1e5065343a32dde7e56217dcddac436 Mon Sep 17 00:00:00 2001 From: bjjwwang Date: Wed, 8 Jan 2025 19:44:42 +1100 Subject: [PATCH 4/6] Revert "revise the std::make_pair" This reverts commit 75be14769189d9dcbef635a2550fdfd01b2503a2. --- svf-llvm/lib/SVFIRBuilder.cpp | 6 ++---- svf-llvm/lib/SVFIRExtAPI.cpp | 2 +- svf/include/SVFIR/SVFIR.h | 8 ++++---- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/svf-llvm/lib/SVFIRBuilder.cpp b/svf-llvm/lib/SVFIRBuilder.cpp index 798c95dd55..2c87155e81 100644 --- a/svf-llvm/lib/SVFIRBuilder.cpp +++ b/svf-llvm/lib/SVFIRBuilder.cpp @@ -253,8 +253,7 @@ void SVFIRBuilder::initialiseNodes() } else if (auto intValue = SVFUtil::dyn_cast(llvmValue)) { - std::pair intVal = LLVMUtil::getIntegerValue(intValue); - pag->addConstantIntValNode(iter->first, intVal.first, intVal.second, iter->second, icfgNode); + pag->addConstantIntValNode(iter->first, LLVMUtil::getIntegerValue(intValue), iter->second, icfgNode); llvmModuleSet()->addToLLVMVal2SVFVarMap( intValue, pag->getGNode(iter->second)); } @@ -329,8 +328,7 @@ void SVFIRBuilder::initialiseNodes() } else if (auto intValue = SVFUtil::dyn_cast(llvmValue)) { - std::pair intVal = LLVMUtil::getIntegerValue(intValue); - pag->addConstantIntObjNode(iter->first, intVal.first, intVal.second, iter->second); + pag->addConstantIntObjNode(iter->first, LLVMUtil::getIntegerValue(intValue), iter->second); llvmModuleSet()->addToLLVMVal2SVFVarMap( intValue, pag->getGNode(iter->second)); } diff --git a/svf-llvm/lib/SVFIRExtAPI.cpp b/svf-llvm/lib/SVFIRExtAPI.cpp index 1b67f9f9fd..093a13bc5b 100644 --- a/svf-llvm/lib/SVFIRExtAPI.cpp +++ b/svf-llvm/lib/SVFIRExtAPI.cpp @@ -64,7 +64,7 @@ const Type* SVFIRBuilder::getBaseTypeAndFlattenedFields(const Value* V, std::vec { SymbolTableBuilder builder(pag->getSymbolInfo()); builder.collectSym(offset); - pag->addConstantIntValNode(svfOffset, offset->getSExtValue(), offset->getZExtValue(), pag->getSymbolInfo()->getValSym(svfOffset), nullptr); + pag->addConstantIntValNode(svfOffset, std::make_pair(offset->getSExtValue(), offset->getZExtValue()), pag->getSymbolInfo()->getValSym(svfOffset), nullptr); } ls.addOffsetVarAndGepTypePair(getPAG()->getGNode(getPAG()->getValueNode(svfOffset)), nullptr); fields.push_back(ls); diff --git a/svf/include/SVFIR/SVFIR.h b/svf/include/SVFIR/SVFIR.h index d31b4c82ee..603d072d9b 100644 --- a/svf/include/SVFIR/SVFIR.h +++ b/svf/include/SVFIR/SVFIR.h @@ -585,10 +585,10 @@ class SVFIR : public IRGraph return addNode(node, i); } - inline NodeID addConstantIntValNode(const SVFValue* curInst, s64_t sval, u64_t zval, const NodeID i, + inline NodeID addConstantIntValNode(const SVFValue* curInst, std::pair intValue, const NodeID i, const ICFGNode* icfgNode) { - SVFVar* node = new ConstantIntValVar(curInst, sval, zval, i, icfgNode); + SVFVar* node = new ConstantIntValVar(curInst, intValue.first, intValue.second, i, icfgNode); return addNode(node, i); } @@ -656,12 +656,12 @@ class SVFIR : public IRGraph } - inline NodeID addConstantIntObjNode(const SVFValue* curInst, s64_t sval, u64_t zval, const NodeID i) { + inline NodeID addConstantIntObjNode(const SVFValue* curInst, std::pair intValue, const NodeID i) { const MemObj* mem = getMemObj(curInst); NodeID base = mem->getId(); memToFieldsMap[base].set(mem->getId()); ConstantIntObjVar* node = - new ConstantIntObjVar(curInst, sval, zval, mem->getId(), mem); + new ConstantIntObjVar(curInst, intValue.first, intValue.second, mem->getId(), mem); return addObjNode(curInst, node, mem->getId()); } From e0d631fc78c77eeb48adec2f0293a90607f398af Mon Sep 17 00:00:00 2001 From: bjjwwang Date: Wed, 8 Jan 2025 19:57:26 +1100 Subject: [PATCH 5/6] fix addConstantIntObjNode and addConstantIntValNode --- svf-llvm/lib/SVFIRExtAPI.cpp | 2 +- svf/include/SVFIR/SVFIR.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/svf-llvm/lib/SVFIRExtAPI.cpp b/svf-llvm/lib/SVFIRExtAPI.cpp index 093a13bc5b..61bdf3ad91 100644 --- a/svf-llvm/lib/SVFIRExtAPI.cpp +++ b/svf-llvm/lib/SVFIRExtAPI.cpp @@ -64,7 +64,7 @@ const Type* SVFIRBuilder::getBaseTypeAndFlattenedFields(const Value* V, std::vec { SymbolTableBuilder builder(pag->getSymbolInfo()); builder.collectSym(offset); - pag->addConstantIntValNode(svfOffset, std::make_pair(offset->getSExtValue(), offset->getZExtValue()), pag->getSymbolInfo()->getValSym(svfOffset), nullptr); + pag->addConstantIntValNode(svfOffset, LLVMUtil::getIntegerValue(offset), pag->getSymbolInfo()->getValSym(svfOffset), nullptr); } ls.addOffsetVarAndGepTypePair(getPAG()->getGNode(getPAG()->getValueNode(svfOffset)), nullptr); fields.push_back(ls); diff --git a/svf/include/SVFIR/SVFIR.h b/svf/include/SVFIR/SVFIR.h index 603d072d9b..999ef8f675 100644 --- a/svf/include/SVFIR/SVFIR.h +++ b/svf/include/SVFIR/SVFIR.h @@ -585,7 +585,7 @@ class SVFIR : public IRGraph return addNode(node, i); } - inline NodeID addConstantIntValNode(const SVFValue* curInst, std::pair intValue, const NodeID i, + inline NodeID addConstantIntValNode(const SVFValue* curInst, const std::pair& intValue, const NodeID i, const ICFGNode* icfgNode) { SVFVar* node = new ConstantIntValVar(curInst, intValue.first, intValue.second, i, icfgNode); @@ -656,7 +656,7 @@ class SVFIR : public IRGraph } - inline NodeID addConstantIntObjNode(const SVFValue* curInst, std::pair intValue, const NodeID i) { + inline NodeID addConstantIntObjNode(const SVFValue* curInst, const std::pair& intValue, const NodeID i) { const MemObj* mem = getMemObj(curInst); NodeID base = mem->getId(); memToFieldsMap[base].set(mem->getId()); From f0d2c2ab4a7ae9df2437ee73b9249af13cb84b8a Mon Sep 17 00:00:00 2001 From: bjjwwang Date: Wed, 8 Jan 2025 21:01:00 +1100 Subject: [PATCH 6/6] remove getSExt ZExt in SVF-LLVM --- svf-llvm/lib/CppUtil.cpp | 2 +- svf-llvm/lib/DCHG.cpp | 2 +- svf-llvm/lib/ICFGBuilder.cpp | 2 +- svf-llvm/lib/LLVMModule.cpp | 3 +-- svf-llvm/lib/ObjTypeInference.cpp | 2 +- svf-llvm/lib/SVFIRBuilder.cpp | 10 +++++----- svf-llvm/lib/SVFIRExtAPI.cpp | 3 ++- svf-llvm/lib/SymbolTableBuilder.cpp | 6 +++--- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/svf-llvm/lib/CppUtil.cpp b/svf-llvm/lib/CppUtil.cpp index f443613553..b940ffb303 100644 --- a/svf-llvm/lib/CppUtil.cpp +++ b/svf-llvm/lib/CppUtil.cpp @@ -661,7 +661,7 @@ s32_t cppUtil::getVCallIdx(const CallBase* cs) } else { - idx_value = (s32_t)idx->getSExtValue(); + idx_value = LLVMUtil::getIntegerValue(idx).first; } return idx_value; } diff --git a/svf-llvm/lib/DCHG.cpp b/svf-llvm/lib/DCHG.cpp index 27b8186d7f..6d1f72734b 100644 --- a/svf-llvm/lib/DCHG.cpp +++ b/svf-llvm/lib/DCHG.cpp @@ -1087,7 +1087,7 @@ std::string DCHGraph::diTypeToStr(const DIType *t) int64_t count = -1; if (const ConstantInt* ci = sr->getCount().dyn_cast()) { - count = ci->getSExtValue(); + count = LLVMUtil::getIntegerValue(ci).first; } ss << "[" << count << "]"; diff --git a/svf-llvm/lib/ICFGBuilder.cpp b/svf-llvm/lib/ICFGBuilder.cpp index ae89788287..9ad6ac6c7a 100644 --- a/svf-llvm/lib/ICFGBuilder.cpp +++ b/svf-llvm/lib/ICFGBuilder.cpp @@ -196,7 +196,7 @@ void ICFGBuilder::processFunBody(WorkList& worklist) /// default case is set to -1; s64_t val = -1; if (condVal && condVal->getBitWidth() <= 64) - val = condVal->getSExtValue(); + val = LLVMUtil::getIntegerValue(condVal).first; icfg->addConditionalIntraEdge(srcNode, dstNode,val); } else diff --git a/svf-llvm/lib/LLVMModule.cpp b/svf-llvm/lib/LLVMModule.cpp index 015ecd05dd..8a9b7e0abc 100644 --- a/svf-llvm/lib/LLVMModule.cpp +++ b/svf-llvm/lib/LLVMModule.cpp @@ -704,8 +704,7 @@ std::vector LLVMModuleSet::getLLVMGlobalFunctions(const Global if (priority && func) { - queue.push(LLVMGlobalFunction(priority - ->getZExtValue(), + queue.push(LLVMGlobalFunction(LLVMUtil::getIntegerValue(priority).second, func)); } } diff --git a/svf-llvm/lib/ObjTypeInference.cpp b/svf-llvm/lib/ObjTypeInference.cpp index f3bbea53d2..b2b6a5bb88 100644 --- a/svf-llvm/lib/ObjTypeInference.cpp +++ b/svf-llvm/lib/ObjTypeInference.cpp @@ -628,7 +628,7 @@ void ObjTypeInference::validateTypeCheck(const CallBase *cs) SVFUtil::dyn_cast(cs->getOperand(1)); assert(pInt && "the second argument is a integer"); u32_t iTyNum = objTyToNumFields(objType); - if (iTyNum >= pInt->getZExtValue()) + if (iTyNum >= LLVMUtil::getIntegerValue(pInt).second) SVFUtil::outs() << SVFUtil::sucMsg("\t SUCCESS :") << dumpValueAndDbgInfo(cs) << SVFUtil::pasMsg(" TYPE: ") << dumpType(objType) << "\n"; diff --git a/svf-llvm/lib/SVFIRBuilder.cpp b/svf-llvm/lib/SVFIRBuilder.cpp index 2c87155e81..a9469fa1ca 100644 --- a/svf-llvm/lib/SVFIRBuilder.cpp +++ b/svf-llvm/lib/SVFIRBuilder.cpp @@ -457,9 +457,9 @@ bool SVFIRBuilder::computeGepOffset(const User *V, AccessPath& ap) // but we can distinguish different field of an array of struct, e.g. s[1].f1 is different from s[0].f2 if(const ArrayType* arrTy = SVFUtil::dyn_cast(gepTy)) { - if(!op || (arrTy->getArrayNumElements() <= (u32_t)op->getSExtValue())) + if(!op || (arrTy->getArrayNumElements() <= (u32_t)LLVMUtil::getIntegerValue(op).first)) continue; - APOffset idx = op->getSExtValue(); + APOffset idx = (u32_t)LLVMUtil::getIntegerValue(op).first; u32_t offset = pag->getSymbolInfo()->getFlattenedElemIdx(llvmModuleSet()->getSVFType(arrTy), idx); ap.setFldIdx(ap.getConstantStructFldIdx() + offset); } @@ -467,7 +467,7 @@ bool SVFIRBuilder::computeGepOffset(const User *V, AccessPath& ap) { assert(op && "non-const offset accessing a struct"); //The actual index - APOffset idx = op->getSExtValue(); + APOffset idx = (u32_t)LLVMUtil::getIntegerValue(op).first; u32_t offset = pag->getSymbolInfo()->getFlattenedElemIdx(llvmModuleSet()->getSVFType(ST), idx); ap.setFldIdx(ap.getConstantStructFldIdx() + offset); } @@ -1176,7 +1176,7 @@ void SVFIRBuilder::visitSwitchInst(SwitchInst &inst) /// default case is set to -1; s64_t val = -1; if (condVal && condVal->getBitWidth() <= 64) - val = condVal->getSExtValue(); + val = (u32_t)LLVMUtil::getIntegerValue(condVal).first; const ICFGNode* icfgNode = llvmModuleSet()->getICFGNode(succInst); successors.push_back(std::make_pair(icfgNode, val)); } @@ -1297,7 +1297,7 @@ const Value* SVFIRBuilder::getBaseValueForExtArg(const Value* V) for (bridge_gep_iterator gi = bridge_gep_begin(gep), ge = bridge_gep_end(gep); gi != ge; ++gi) { if(const ConstantInt* op = SVFUtil::dyn_cast(gi.getOperand())) - totalidx += op->getSExtValue(); + totalidx += LLVMUtil::getIntegerValue(op).first; } if(totalidx == 0 && !SVFUtil::isa(value->getType())) value = gep->getPointerOperand(); diff --git a/svf-llvm/lib/SVFIRExtAPI.cpp b/svf-llvm/lib/SVFIRExtAPI.cpp index 61bdf3ad91..3c55368c89 100644 --- a/svf-llvm/lib/SVFIRExtAPI.cpp +++ b/svf-llvm/lib/SVFIRExtAPI.cpp @@ -50,7 +50,8 @@ const Type* SVFIRBuilder::getBaseTypeAndFlattenedFields(const Value* V, std::vec /// use user-specified size for this copy operation if the size is a constaint int if(szValue && SVFUtil::isa(szValue)) { - numOfElems = (numOfElems > SVFUtil::cast(szValue)->getSExtValue()) ? SVFUtil::cast(szValue)->getSExtValue() : numOfElems; + auto szIntVal = LLVMUtil::getIntegerValue(SVFUtil::cast(szValue)); + numOfElems = (numOfElems > szIntVal.first) ? szIntVal.first : numOfElems; } LLVMContext& context = LLVMModuleSet::getLLVMModuleSet()->getContext(); diff --git a/svf-llvm/lib/SymbolTableBuilder.cpp b/svf-llvm/lib/SymbolTableBuilder.cpp index cb07b92f78..2e0a136ff9 100644 --- a/svf-llvm/lib/SymbolTableBuilder.cpp +++ b/svf-llvm/lib/SymbolTableBuilder.cpp @@ -781,7 +781,7 @@ u32_t SymbolTableBuilder::analyzeHeapAllocByteSize(const Value* val) llvm::dyn_cast(arg)) { // Multiply the constant Value if all Args are const - product *= constIntArg->getZExtValue(); + product *= LLVMUtil::getIntegerValue(constIntArg).second; } else { @@ -871,8 +871,8 @@ void SymbolTableBuilder::initTypeInfo(ObjTypeInfo* typeinfo, const Value* val, /// In most cases, `NumElements` is not specified in the instruction, which means there is only one element (objSize=1). if(const ConstantInt* sz = SVFUtil::dyn_cast(allocaInst->getArraySize())) { - elemNum = sz->getZExtValue() * getNumOfElements(objTy); - byteSize = sz->getZExtValue() * typeinfo->getType()->getByteSize(); + elemNum = LLVMUtil::getIntegerValue(sz).second * getNumOfElements(objTy); + byteSize = LLVMUtil::getIntegerValue(sz).second * typeinfo->getType()->getByteSize(); } /// if ArraySize is not constant, byteSize is not static determined. else