summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binaryninjaapi.h3
-rw-r--r--binaryninjacore.h11
-rw-r--r--function.cpp20
-rw-r--r--python/function.py12
-rwxr-xr-xsuite/generator.py1
-rw-r--r--ui/flowgraphwidget.h4
-rw-r--r--ui/linearview.h4
7 files changed, 54 insertions, 1 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 85c9c51b..224ea01c 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -3234,6 +3234,9 @@ __attribute__ ((format (printf, 1, 2)))
std::string GetGotoLabelName(uint64_t labelId);
void SetGotoLabelName(uint64_t labelId, const std::string& name);
+
+ BNDeadStoreElimination GetVariableDeadStoreElimination(const Variable& var);
+ void SetVariableDeadStoreElimination(const Variable& var, BNDeadStoreElimination mode);
};
class AdvancedFunctionAnalysisDataRequestor
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 4eab7a44..72f661a9 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -2441,6 +2441,13 @@ extern "C"
void* ctx;
};
+ enum BNDeadStoreElimination
+ {
+ DefaultDeadStoreElimination,
+ PreventDeadStoreElimination,
+ AllowDeadStoreElimination
+ };
+
BINARYNINJACOREAPI char* BNAllocString(const char* contents);
BINARYNINJACOREAPI void BNFreeString(char* str);
BINARYNINJACOREAPI char** BNAllocStringList(const char** contents, size_t size);
@@ -3275,6 +3282,10 @@ __attribute__ ((format (printf, 1, 2)))
BINARYNINJACOREAPI char* BNGetVariableName(BNFunction* func, const BNVariable* var);
BINARYNINJACOREAPI uint64_t BNToVariableIdentifier(const BNVariable* var);
BINARYNINJACOREAPI BNVariable BNFromVariableIdentifier(uint64_t id);
+ BINARYNINJACOREAPI BNDeadStoreElimination BNGetFunctionVariableDeadStoreElimination(BNFunction* func,
+ const BNVariable* var);
+ BINARYNINJACOREAPI void BNSetFunctionVariableDeadStoreElimination(BNFunction* func,
+ const BNVariable* var, BNDeadStoreElimination mode);
BINARYNINJACOREAPI BNReferenceSource* BNGetFunctionCallSites(BNFunction* func, size_t* count);
BINARYNINJACOREAPI uint64_t* BNGetCallees(BNBinaryView* view, BNReferenceSource* callSite, size_t* count);
diff --git a/function.cpp b/function.cpp
index 2daf5522..340f1e53 100644
--- a/function.cpp
+++ b/function.cpp
@@ -1900,6 +1900,26 @@ void Function::SetGotoLabelName(uint64_t labelId, const std::string& name)
}
+BNDeadStoreElimination Function::GetVariableDeadStoreElimination(const Variable& var)
+{
+ BNVariable varData;
+ varData.type = var.type;
+ varData.index = var.index;
+ varData.storage = var.storage;
+ return BNGetFunctionVariableDeadStoreElimination(m_object, &varData);
+}
+
+
+void Function::SetVariableDeadStoreElimination(const Variable& var, BNDeadStoreElimination mode)
+{
+ BNVariable varData;
+ varData.type = var.type;
+ varData.index = var.index;
+ varData.storage = var.storage;
+ BNSetFunctionVariableDeadStoreElimination(m_object, &varData, mode);
+}
+
+
AdvancedFunctionAnalysisDataRequestor::AdvancedFunctionAnalysisDataRequestor(Function* func): m_func(func)
{
if (m_func)
diff --git a/python/function.py b/python/function.py
index e98f7191..d986fcca 100644
--- a/python/function.py
+++ b/python/function.py
@@ -35,7 +35,7 @@ from binaryninja import types
from binaryninja.enums import (AnalysisSkipReason, FunctionGraphType, BranchType, SymbolType, InstructionTextTokenType,
HighlightStandardColor, HighlightColorStyle, RegisterValueType, ImplicitRegisterExtend,
DisassemblyOption, IntegerDisplayType, InstructionTextTokenContext, VariableSourceType,
- FunctionAnalysisSkipOverride, MediumLevelILOperation)
+ FunctionAnalysisSkipOverride, MediumLevelILOperation, DeadStoreElimination)
# 2-3 compatibility
from binaryninja import range
@@ -926,6 +926,16 @@ class Variable(object):
v.storage = self._storage
return v
+ @property
+ def dead_store_elimination(self):
+ if self._function is not None and self._identifier is not None:
+ return DeadStoreElimination(core.BNGetFunctionVariableDeadStoreElimination(self._function.handle, self.to_BNVariable()))
+ return None
+
+ @dead_store_elimination.setter
+ def dead_store_elimination(self, value):
+ core.BNSetFunctionVariableDeadStoreElimination(self._function.handle, self.to_BNVariable(), value)
+
@classmethod
def from_identifier(self, func, identifier, name=None, var_type=None):
var = core.BNFromVariableIdentifier(identifier)
diff --git a/suite/generator.py b/suite/generator.py
index 63ae64ff..75a83ad6 100755
--- a/suite/generator.py
+++ b/suite/generator.py
@@ -174,6 +174,7 @@ class OracleTestFile:
class UnitTestFile:
binary_test_options = {}
binary_test_options['binaries/test_corpus/pe_thumb'] = {'analysis.experimental.alternateTypePropagation' : True}
+ binary_test_options['binaries/test_corpus/quick3dcoreplugin.dll'] = {'analysis.experimental.alternateTypePropagation' : True}
def __init__(self, filename, outdir, test_store):
self.filename = filename
diff --git a/ui/flowgraphwidget.h b/ui/flowgraphwidget.h
index fc19c42c..7a2d6add 100644
--- a/ui/flowgraphwidget.h
+++ b/ui/flowgraphwidget.h
@@ -140,6 +140,8 @@ class BINARYNINJAUIAPI FlowGraphWidget: public QAbstractScrollArea, public View,
bool updatePositionForNode(FlowGraphNodeRef oldNode, FlowGraphNodeRef newNode, CursorPosition& pos);
void recenterUpdatedGraph(FlowGraphRef oldGraph, int oldXOfs, int oldYOfs);
+ BNDeadStoreElimination getCurrentVariableDeadStoreElimination();
+
protected:
virtual void paintEvent(QPaintEvent* event) override;
virtual void resizeEvent(QResizeEvent* event) override;
@@ -340,4 +342,6 @@ private Q_SLOTS:
void editInstruction();
void instrEditDoneEvent();
+
+ void setCurrentVariableDeadStoreElimination(BNDeadStoreElimination elimination);
};
diff --git a/ui/linearview.h b/ui/linearview.h
index 3bd446be..7498bdef 100644
--- a/ui/linearview.h
+++ b/ui/linearview.h
@@ -209,6 +209,8 @@ class BINARYNINJAUIAPI LinearView: public QAbstractScrollArea, public View, publ
void getCurrentOffsetByTypeInternal(TypeRef resType, uint64_t baseAddr, uint64_t& begin, uint64_t& end,
bool singleLine, std::set<TypeRef>& seen);
+ BNDeadStoreElimination getCurrentVariableDeadStoreElimination();
+
private Q_SLOTS:
void adjustSize(int width, int height);
void viewInHexEditor();
@@ -274,6 +276,8 @@ private Q_SLOTS:
void editInstruction();
void instrEditDoneEvent();
+ void setCurrentVariableDeadStoreElimination(BNDeadStoreElimination elimination);
+
Q_SIGNALS:
void notifyResizeEvent(int width, int height);