summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binaryninjaapi.h4
-rw-r--r--binaryninjacore.h4
-rw-r--r--function.cpp25
-rw-r--r--python/function.py28
4 files changed, 61 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 048d6afc..9f600a42 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -8877,6 +8877,10 @@ namespace BinaryNinja {
std::vector<BNAddressRange> GetAddressRanges();
bool GetInstructionContainingAddress(Architecture* arch, uint64_t addr, uint64_t* start);
+
+ Confidence<bool> IsInlinedDuringAnalysis();
+ void SetAutoInlinedDuringAnalysis(Confidence<bool> inlined);
+ void SetUserInlinedDuringAnalysis(Confidence<bool> inlined);
};
/*!
diff --git a/binaryninjacore.h b/binaryninjacore.h
index ad71ced9..9c038104 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -3873,6 +3873,10 @@ extern "C"
BINARYNINJACOREAPI BNRegisterValueWithConfidence BNGetFunctionGlobalPointerValue(BNFunction* func);
BINARYNINJACOREAPI BNRegisterValueWithConfidence BNGetFunctionRegisterValueAtExit(BNFunction* func, uint32_t reg);
+ BINARYNINJACOREAPI BNBoolWithConfidence BNIsFunctionInlinedDuringAnalysis(BNFunction* func);
+ BINARYNINJACOREAPI void BNSetAutoFunctionInlinedDuringAnalysis(BNFunction* func, BNBoolWithConfidence inlined);
+ BINARYNINJACOREAPI void BNSetUserFunctionInlinedDuringAnalysis(BNFunction* func, BNBoolWithConfidence inlined);
+
BINARYNINJACOREAPI bool BNGetInstructionContainingAddress(
BNFunction* func, BNArchitecture* arch, uint64_t addr, uint64_t* start);
diff --git a/function.cpp b/function.cpp
index 12c9d241..ddeaf136 100644
--- a/function.cpp
+++ b/function.cpp
@@ -3044,6 +3044,31 @@ bool Function::GetInstructionContainingAddress(Architecture* arch, uint64_t addr
}
+Confidence<bool> Function::IsInlinedDuringAnalysis()
+{
+ BNBoolWithConfidence result = BNIsFunctionInlinedDuringAnalysis(m_object);
+ return Confidence<bool>(result.value, result.confidence);
+}
+
+
+void Function::SetAutoInlinedDuringAnalysis(Confidence<bool> inlined)
+{
+ BNBoolWithConfidence bc;
+ bc.value = inlined.GetValue();
+ bc.confidence = inlined.GetConfidence();
+ BNSetAutoFunctionInlinedDuringAnalysis(m_object, bc);
+}
+
+
+void Function::SetUserInlinedDuringAnalysis(Confidence<bool> inlined)
+{
+ BNBoolWithConfidence bc;
+ bc.value = inlined.GetValue();
+ bc.confidence = inlined.GetConfidence();
+ BNSetUserFunctionInlinedDuringAnalysis(m_object, bc);
+}
+
+
AdvancedFunctionAnalysisDataRequestor::AdvancedFunctionAnalysisDataRequestor(Function* func) : m_func(func)
{
if (m_func)
diff --git a/python/function.py b/python/function.py
index a6693d85..62895c05 100644
--- a/python/function.py
+++ b/python/function.py
@@ -1413,6 +1413,16 @@ class Function:
core.BNFreeVariableList(data)
return result
+ @property
+ def inline_during_analysis(self) -> 'types.BoolWithConfidence':
+ """Whether the function's IL should be inlined into all callers' IL"""
+ result = core.BNIsFunctionInlinedDuringAnalysis(self.handle)
+ return types.BoolWithConfidence(result.value, confidence=result.confidence)
+
+ @inline_during_analysis.setter
+ def inline_during_analysis(self, value: Union[bool, 'types.BoolWithConfidence']):
+ self.set_user_inline_during_analysis(value)
+
def mark_recent_use(self) -> None:
core.BNMarkFunctionAsRecentlyUsed(self.handle)
@@ -3452,6 +3462,24 @@ class Function:
"""
core.BNUnsplitVariable(self.handle, var.to_BNVariable())
+ def set_auto_inline_during_analysis(self, value: Union[bool, 'types.BoolWithConfidence']):
+ bc = core.BNBoolWithConfidence()
+ bc.value = bool(value)
+ if isinstance(value, types.BoolWithConfidence):
+ bc.confidence = value.confidence
+ else:
+ bc.confidence = core.max_confidence
+ core.BNSetAutoFunctionInlinedDuringAnalysis(self.handle, bc)
+
+ def set_user_inline_during_analysis(self, value: Union[bool, 'types.BoolWithConfidence']):
+ bc = core.BNBoolWithConfidence()
+ bc.value = bool(value)
+ if isinstance(value, types.BoolWithConfidence):
+ bc.confidence = value.confidence
+ else:
+ bc.confidence = core.max_confidence
+ core.BNSetUserFunctionInlinedDuringAnalysis(self.handle, bc)
+
class AdvancedFunctionAnalysisDataRequestor:
def __init__(self, func: Optional['Function'] = None):