From 7598688466960427890036590239565364310171 Mon Sep 17 00:00:00 2001 From: Glenn Smith Date: Thu, 6 Jul 2023 13:40:52 -0400 Subject: Expose function "pure" flag to api and typesystem --- type.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 6 deletions(-) (limited to 'type.cpp') diff --git a/type.cpp b/type.cpp index 5b5811cd..8affdc37 100644 --- a/type.cpp +++ b/type.cpp @@ -635,6 +635,13 @@ Confidence Type::CanReturn() const } +Confidence Type::IsPure() const +{ + BNBoolWithConfidence result = BNIsTypePure(m_object); + return Confidence(result.value, result.confidence); +} + + Ref Type::GetStructure() const { BNStructure* s = BNGetTypeStructure(m_object); @@ -936,9 +943,13 @@ Ref Type::FunctionType(const Confidence>& returnValue, returnRegsConf.count = 0; returnRegsConf.confidence = 0; + BNBoolWithConfidence pureConf; + pureConf.value = false; + pureConf.confidence = 0; + Type* type = new Type(BNCreateFunctionType( &returnValueConf, &callingConventionConf, paramArray, params.size(), &varArgConf, - &canReturnConf, &stackAdjustConf, nullptr, nullptr, 0, &returnRegsConf, NoNameType)); + &canReturnConf, &stackAdjustConf, nullptr, nullptr, 0, &returnRegsConf, NoNameType, &pureConf)); delete[] paramArray; return type; } @@ -952,7 +963,8 @@ Ref Type::FunctionType(const Confidence>& returnValue, const Confidence& stackAdjust, const std::map>& regStackAdjust, const Confidence>& returnRegs, - BNNameType ft) + BNNameType ft, + const Confidence& pure) { BNTypeWithConfidence returnValueConf; returnValueConf.type = returnValue->GetObject(); @@ -1004,10 +1016,14 @@ Ref Type::FunctionType(const Confidence>& returnValue, returnRegsConf.count = returnRegs->size(); returnRegsConf.confidence = returnRegs.GetConfidence(); + BNBoolWithConfidence pureConf; + pureConf.value = pure.GetValue(); + pureConf.confidence = pure.GetConfidence(); + Type* type = new Type(BNCreateFunctionType( &returnValueConf, &callingConventionConf, paramArray, params.size(), &varArgConf, &canReturnConf, &stackAdjustConf, regStackAdjustRegs.data(), - regStackAdjustValues.data(), regStackAdjust.size(), &returnRegsConf, NoNameType)); + regStackAdjustValues.data(), regStackAdjust.size(), &returnRegsConf, NoNameType, &pureConf)); delete[] paramArray; return type; } @@ -1432,6 +1448,13 @@ Confidence TypeBuilder::CanReturn() const } +Confidence TypeBuilder::IsPure() const +{ + BNBoolWithConfidence result = BNIsTypeBuilderPure(m_object); + return Confidence(result.value, result.confidence); +} + + Ref TypeBuilder::GetStructure() const { BNStructure* s = BNGetTypeBuilderStructure(m_object); @@ -1772,9 +1795,13 @@ TypeBuilder TypeBuilder::FunctionType(const Confidence>& returnValue, returnRegsConf.count = 0; returnRegsConf.confidence = 0; + BNBoolWithConfidence pureConf; + pureConf.value = false; + pureConf.confidence = 0; + TypeBuilder type(BNCreateFunctionTypeBuilder( &returnValueConf, &callingConventionConf, paramArray, paramCount, &varArgConf, - &canReturnConf, &stackAdjustConf, nullptr, nullptr, 0, &returnRegsConf, NoNameType)); + &canReturnConf, &stackAdjustConf, nullptr, nullptr, 0, &returnRegsConf, NoNameType, &pureConf)); delete[] paramArray; return type; } @@ -1788,7 +1815,8 @@ TypeBuilder TypeBuilder::FunctionType(const Confidence>& returnValue, const Confidence& stackAdjust, const std::map>& regStackAdjust, const Confidence>& returnRegs, - BNNameType ft) + BNNameType ft, + const Confidence& pure) { BNTypeWithConfidence returnValueConf; returnValueConf.type = returnValue->GetObject(); @@ -1840,10 +1868,14 @@ TypeBuilder TypeBuilder::FunctionType(const Confidence>& returnValue, returnRegsConf.count = returnRegs->size(); returnRegsConf.confidence = returnRegs.GetConfidence(); + BNBoolWithConfidence pureConf; + pureConf.value = pure.GetValue(); + pureConf.confidence = pure.GetConfidence(); + TypeBuilder type(BNCreateFunctionTypeBuilder( &returnValueConf, &callingConventionConf, paramArray, params.size(), &varArgConf, &canReturnConf, &stackAdjustConf, regStackAdjustRegs.data(), - regStackAdjustValues.data(), regStackAdjust.size(), &returnRegsConf, NoNameType)); + regStackAdjustValues.data(), regStackAdjust.size(), &returnRegsConf, NoNameType, &pureConf)); delete[] paramArray; return type; } @@ -1859,6 +1891,16 @@ TypeBuilder& TypeBuilder::SetFunctionCanReturn(const Confidence& canReturn } +TypeBuilder& TypeBuilder::SetPure(const Confidence& pure) +{ + BNBoolWithConfidence bc; + bc.value = pure.GetValue(); + bc.confidence = pure.GetConfidence(); + BNSetTypeBuilderPure(m_object, &bc); + return *this; +} + + TypeBuilder& TypeBuilder::SetParameters(const std::vector& params) { size_t paramCount = 0; -- cgit v1.3.1