Skip to content

Commit 41b027b

Browse files
committed
Add APIs for PossibleValueSet operations
1 parent 352ab7f commit 41b027b

File tree

6 files changed

+763
-123
lines changed

6 files changed

+763
-123
lines changed

binaryninjaapi.h

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8361,7 +8361,7 @@ namespace BinaryNinja {
83618361
BulkSymbolModification(BulkSymbolModification&&) = default;
83628362
BulkSymbolModification& operator=(BulkSymbolModification&&) = default;
83638363

8364-
private:
8364+
private:
83658365
Ref<BinaryView> m_view;
83668366
};
83678367

@@ -12442,6 +12442,27 @@ namespace BinaryNinja {
1244212442
static PossibleValueSet FromAPIObject(BNPossibleValueSet& value);
1244312443
BNPossibleValueSet ToAPIObject() const;
1244412444
static void FreeAPIObject(BNPossibleValueSet* value);
12445+
12446+
PossibleValueSet Add(const PossibleValueSet& other, size_t size) const;
12447+
PossibleValueSet Subtract(const PossibleValueSet& other, size_t size) const;
12448+
PossibleValueSet Multiply(const PossibleValueSet& other, size_t size) const;
12449+
PossibleValueSet SignedDivide(const PossibleValueSet& other, size_t size) const;
12450+
PossibleValueSet UnsignedDivide(const PossibleValueSet& other, size_t size) const;
12451+
PossibleValueSet SignedMod(const PossibleValueSet& other, size_t size) const;
12452+
PossibleValueSet UnsignedMod(const PossibleValueSet& other, size_t size) const;
12453+
PossibleValueSet And(const PossibleValueSet& other, size_t size) const;
12454+
PossibleValueSet Or(const PossibleValueSet& other, size_t size) const;
12455+
PossibleValueSet Xor(const PossibleValueSet& other, size_t size) const;
12456+
PossibleValueSet ShiftLeft(const PossibleValueSet& other, size_t size) const;
12457+
PossibleValueSet LogicalShiftRight(const PossibleValueSet& other, size_t size) const;
12458+
PossibleValueSet ArithShiftRight(const PossibleValueSet& other, size_t size) const;
12459+
PossibleValueSet RotateLeft(const PossibleValueSet& other, size_t size) const;
12460+
PossibleValueSet RotateRight(const PossibleValueSet& other, size_t size) const;
12461+
PossibleValueSet Union(const PossibleValueSet& other, size_t size) const;
12462+
PossibleValueSet Intersection(const PossibleValueSet& other, size_t size) const;
12463+
12464+
PossibleValueSet Negate(size_t size) const;
12465+
PossibleValueSet Not(size_t size) const;
1244512466
};
1244612467

1244712468
class FlowGraph;

binaryninjacore.h

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2883,7 +2883,7 @@ extern "C"
28832883
BNAnalysisState state;
28842884
size_t count, total;
28852885
} BNAnalysisProgress;
2886-
2886+
28872887
BN_ENUM(uint8_t, BNAnalysisMode)
28882888
{
28892889
FullAnalysisMode,
@@ -5097,7 +5097,6 @@ extern "C"
50975097
BNFunction* func, BNArchitecture* arch, uint64_t addr, BNType* functionType, size_t i);
50985098
BINARYNINJACOREAPI BNRegisterValue BNGetParameterValueAtLowLevelILInstruction(
50995099
BNFunction* func, size_t instr, BNType* functionType, size_t i);
5100-
BINARYNINJACOREAPI void BNFreePossibleValueSet(BNPossibleValueSet* value);
51015100
BINARYNINJACOREAPI uint32_t* BNGetRegistersReadByInstruction(
51025101
BNFunction* func, BNArchitecture* arch, uint64_t addr, size_t* count);
51035102
BINARYNINJACOREAPI uint32_t* BNGetRegistersWrittenByInstruction(
@@ -8901,6 +8900,28 @@ extern "C"
89018900
BINARYNINJACOREAPI bool BNStringRecognizerRecognizeImport(BNStringRecognizer* recognizer, BNHighLevelILFunction* il,
89028901
size_t exprIndex, BNType* type, int64_t val, BNDerivedString* out);
89038902

8903+
// PossibleValueSet operations
8904+
BINARYNINJACOREAPI void BNFreePossibleValueSet(BNPossibleValueSet* object);
8905+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetUnion(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8906+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetIntersection(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8907+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetAdd(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8908+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetSubtract(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8909+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetMultiply(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8910+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetSignedDivide(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8911+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetUnsignedDivide(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8912+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetSignedMod(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8913+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetUnsignedMod(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8914+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetAnd(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8915+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetOr(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8916+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetXor(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8917+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetShiftLeft(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8918+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetLogicalShiftRight(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8919+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetArithShiftRight(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8920+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetRotateLeft(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8921+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetRotateRight(const BNPossibleValueSet* object, const BNPossibleValueSet* other, size_t size);
8922+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetNegate(const BNPossibleValueSet* object, size_t size);
8923+
BINARYNINJACOREAPI BNPossibleValueSet BNPossibleValueSetNot(const BNPossibleValueSet* object, size_t size);
8924+
89048925
#ifdef __cplusplus
89058926
}
89068927
#endif

function.cpp

Lines changed: 0 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -418,121 +418,6 @@ RegisterValue RegisterValue::FromAPIObject(const BNRegisterValue& value)
418418
}
419419

420420

421-
PossibleValueSet PossibleValueSet::FromAPIObject(BNPossibleValueSet& value)
422-
{
423-
PossibleValueSet result;
424-
result.state = value.state;
425-
result.value = value.value;
426-
result.offset = value.offset;
427-
result.size = value.size;
428-
if (value.state == LookupTableValue)
429-
{
430-
for (size_t i = 0; i < value.count; i++)
431-
{
432-
LookupTableEntry entry;
433-
entry.fromValues.insert(entry.fromValues.end(), &value.table[i].fromValues[0],
434-
&value.table[i].fromValues[value.table[i].fromCount]);
435-
entry.toValue = value.table[i].toValue;
436-
result.table.push_back(entry);
437-
}
438-
}
439-
else if ((value.state == SignedRangeValue) || (value.state == UnsignedRangeValue))
440-
{
441-
for (size_t i = 0; i < value.count; i++)
442-
result.ranges.push_back(value.ranges[i]);
443-
}
444-
else if ((value.state == InSetOfValues) || (value.state == NotInSetOfValues))
445-
{
446-
for (size_t i = 0; i < value.count; i++)
447-
result.valueSet.insert(value.valueSet[i]);
448-
}
449-
450-
result.count = value.count;
451-
BNFreePossibleValueSet(&value);
452-
return result;
453-
}
454-
455-
456-
BNPossibleValueSet PossibleValueSet::ToAPIObject() const
457-
{
458-
BNPossibleValueSet result;
459-
result.state = state;
460-
result.value = value;
461-
result.offset = offset;
462-
result.size = size;
463-
result.count = 0;
464-
465-
if ((state == SignedRangeValue) || (state == UnsignedRangeValue))
466-
{
467-
result.ranges = new BNValueRange[ranges.size()];
468-
result.count = ranges.size();
469-
for (size_t i = 0; i < ranges.size(); i++)
470-
result.ranges[i] = ranges[i];
471-
}
472-
else
473-
{
474-
result.ranges = nullptr;
475-
}
476-
477-
if (state == LookupTableValue)
478-
{
479-
result.table = new BNLookupTableEntry[table.size()];
480-
result.count = table.size();
481-
for (size_t i = 0; i < table.size(); i++)
482-
{
483-
result.table[i].fromValues = new int64_t[table[i].fromValues.size()];
484-
memcpy(result.table[i].fromValues, &table[i].fromValues[0], sizeof(int64_t) * table[i].fromValues.size());
485-
result.table[i].fromCount = table[i].fromValues.size();
486-
result.table[i].toValue = table[i].toValue;
487-
}
488-
}
489-
else
490-
{
491-
result.table = nullptr;
492-
}
493-
494-
if ((state == InSetOfValues) || (state == NotInSetOfValues))
495-
{
496-
result.valueSet = new int64_t[valueSet.size()];
497-
result.count = valueSet.size();
498-
size_t i = 0;
499-
for (auto j : valueSet)
500-
result.valueSet[i++] = j;
501-
}
502-
else
503-
{
504-
result.valueSet = nullptr;
505-
}
506-
507-
return result;
508-
}
509-
510-
511-
void PossibleValueSet::FreeAPIObject(BNPossibleValueSet* value)
512-
{
513-
switch (value->state)
514-
{
515-
case SignedRangeValue:
516-
case UnsignedRangeValue:
517-
delete[] value->ranges;
518-
break;
519-
case LookupTableValue:
520-
for (size_t i = 0; i < value->count; i ++)
521-
{
522-
delete[] value->table[i].fromValues;
523-
}
524-
delete[] value->table;
525-
break;
526-
case InSetOfValues:
527-
case NotInSetOfValues:
528-
delete[] value->valueSet;
529-
break;
530-
default:
531-
break;
532-
}
533-
}
534-
535-
536421
pair<DataBuffer, BNBuiltinType> Function::GetConstantData(BNRegisterValueType state, uint64_t value, size_t size)
537422
{
538423
BNBuiltinType builtin;

0 commit comments

Comments
 (0)