summaryrefslogtreecommitdiff
path: root/basicblock.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'basicblock.cpp')
-rw-r--r--basicblock.cpp309
1 files changed, 306 insertions, 3 deletions
diff --git a/basicblock.cpp b/basicblock.cpp
index 5acf41d7..d8ae0f65 100644
--- a/basicblock.cpp
+++ b/basicblock.cpp
@@ -24,6 +24,54 @@ using namespace BinaryNinja;
using namespace std;
+DisassemblySettings::DisassemblySettings()
+{
+ m_object = BNCreateDisassemblySettings();
+}
+
+
+DisassemblySettings::DisassemblySettings(BNDisassemblySettings* settings)
+{
+ m_object = settings;
+}
+
+
+bool DisassemblySettings::IsOptionSet(BNDisassemblyOption option) const
+{
+ return BNIsDisassemblySettingsOptionSet(m_object, option);
+}
+
+
+void DisassemblySettings::SetOption(BNDisassemblyOption option, bool state)
+{
+ BNSetDisassemblySettingsOption(m_object, option, state);
+}
+
+
+size_t DisassemblySettings::GetWidth() const
+{
+ return BNGetDisassemblyWidth(m_object);
+}
+
+
+void DisassemblySettings::SetWidth(size_t width)
+{
+ BNSetDisassemblyWidth(m_object, width);
+}
+
+
+size_t DisassemblySettings::GetMaximumSymbolWidth() const
+{
+ return BNGetDisassemblyMaximumSymbolWidth(m_object);
+}
+
+
+void DisassemblySettings::SetMaximumSymbolWidth(size_t width)
+{
+ BNSetDisassemblyMaximumSymbolWidth(m_object, width);
+}
+
+
BasicBlock::BasicBlock(BNBasicBlock* block)
{
m_object = block;
@@ -60,6 +108,12 @@ uint64_t BasicBlock::GetLength() const
}
+size_t BasicBlock::GetIndex() const
+{
+ return BNGetBasicBlockIndex(m_object);
+}
+
+
vector<BasicBlockEdge> BasicBlock::GetOutgoingEdges() const
{
size_t count;
@@ -70,12 +124,30 @@ vector<BasicBlockEdge> BasicBlock::GetOutgoingEdges() const
{
BasicBlockEdge edge;
edge.type = array[i].type;
- edge.target = array[i].target;
- edge.arch = array[i].arch ? new CoreArchitecture(array[i].arch) : nullptr;
+ edge.target = array[i].target ? new BasicBlock(BNNewBasicBlockReference(array[i].target)) : nullptr;
+ result.push_back(edge);
+ }
+
+ BNFreeBasicBlockEdgeList(array, count);
+ return result;
+}
+
+
+vector<BasicBlockEdge> BasicBlock::GetIncomingEdges() const
+{
+ size_t count;
+ BNBasicBlockEdge* array = BNGetBasicBlockIncomingEdges(m_object, &count);
+
+ vector<BasicBlockEdge> result;
+ for (size_t i = 0; i < count; i++)
+ {
+ BasicBlockEdge edge;
+ edge.type = array[i].type;
+ edge.target = array[i].target ? new BasicBlock(BNNewBasicBlockReference(array[i].target)) : nullptr;
result.push_back(edge);
}
- BNFreeBasicBlockOutgoingEdgeList(array);
+ BNFreeBasicBlockEdgeList(array, count);
return result;
}
@@ -86,6 +158,91 @@ bool BasicBlock::HasUndeterminedOutgoingEdges() const
}
+set<Ref<BasicBlock>> BasicBlock::GetDominators() const
+{
+ size_t count;
+ BNBasicBlock** blocks = BNGetBasicBlockDominators(m_object, &count);
+
+ set<Ref<BasicBlock>> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(new BasicBlock(BNNewBasicBlockReference(blocks[i])));
+
+ BNFreeBasicBlockList(blocks, count);
+ return result;
+}
+
+
+set<Ref<BasicBlock>> BasicBlock::GetStrictDominators() const
+{
+ size_t count;
+ BNBasicBlock** blocks = BNGetBasicBlockStrictDominators(m_object, &count);
+
+ set<Ref<BasicBlock>> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(new BasicBlock(BNNewBasicBlockReference(blocks[i])));
+
+ BNFreeBasicBlockList(blocks, count);
+ return result;
+}
+
+
+Ref<BasicBlock> BasicBlock::GetImmediateDominator() const
+{
+ BNBasicBlock* result = BNGetBasicBlockImmediateDominator(m_object);
+ if (!result)
+ return nullptr;
+ return new BasicBlock(result);
+}
+
+
+set<Ref<BasicBlock>> BasicBlock::GetDominatorTreeChildren() const
+{
+ size_t count;
+ BNBasicBlock** blocks = BNGetBasicBlockDominatorTreeChildren(m_object, &count);
+
+ set<Ref<BasicBlock>> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(new BasicBlock(BNNewBasicBlockReference(blocks[i])));
+
+ BNFreeBasicBlockList(blocks, count);
+ return result;
+}
+
+
+set<Ref<BasicBlock>> BasicBlock::GetDominanceFrontier() const
+{
+ size_t count;
+ BNBasicBlock** blocks = BNGetBasicBlockDominanceFrontier(m_object, &count);
+
+ set<Ref<BasicBlock>> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(new BasicBlock(BNNewBasicBlockReference(blocks[i])));
+
+ BNFreeBasicBlockList(blocks, count);
+ return result;
+}
+
+
+set<Ref<BasicBlock>> BasicBlock::GetIteratedDominanceFrontier(const set<Ref<BasicBlock>>& blocks)
+{
+ BNBasicBlock** blockSet = new BNBasicBlock*[blocks.size()];
+ size_t i = 0;
+ for (auto& j : blocks)
+ blockSet[i++] = j->GetObject();
+
+ size_t count;
+ BNBasicBlock** resultBlocks = BNGetBasicBlockIteratedDominanceFrontier(blockSet, blocks.size(), &count);
+ delete[] blockSet;
+
+ set<Ref<BasicBlock>> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(new BasicBlock(BNNewBasicBlockReference(resultBlocks[i])));
+
+ BNFreeBasicBlockList(resultBlocks, count);
+ return result;
+}
+
+
void BasicBlock::MarkRecentUse()
{
BNMarkBasicBlockAsRecentlyUsed(m_object);
@@ -96,3 +253,149 @@ vector<vector<InstructionTextToken>> BasicBlock::GetAnnotations()
{
return GetFunction()->GetBlockAnnotations(GetArchitecture(), GetStart());
}
+
+
+vector<DisassemblyTextLine> BasicBlock::GetDisassemblyText(DisassemblySettings* settings)
+{
+ size_t count;
+ BNDisassemblyTextLine* lines = BNGetBasicBlockDisassemblyText(m_object, settings->GetObject(), &count);
+
+ vector<DisassemblyTextLine> result;
+ for (size_t i = 0; i < count; i++)
+ {
+ DisassemblyTextLine line;
+ line.addr = lines[i].addr;
+ for (size_t j = 0; j < lines[i].count; j++)
+ {
+ InstructionTextToken token;
+ token.type = lines[i].tokens[j].type;
+ token.text = lines[i].tokens[j].text;
+ token.value = lines[i].tokens[j].value;
+ token.size = lines[i].tokens[j].size;
+ token.operand = lines[i].tokens[j].operand;
+ token.context = lines[i].tokens[j].context;
+ token.address = lines[i].tokens[j].address;
+ line.tokens.push_back(token);
+ }
+ result.push_back(line);
+ }
+
+ BNFreeDisassemblyTextLines(lines, count);
+ return result;
+}
+
+
+BNHighlightColor BasicBlock::GetBasicBlockHighlight()
+{
+ return BNGetBasicBlockHighlight(m_object);
+}
+
+
+void BasicBlock::SetAutoBasicBlockHighlight(BNHighlightColor color)
+{
+ BNSetAutoBasicBlockHighlight(m_object, color);
+}
+
+
+void BasicBlock::SetAutoBasicBlockHighlight(BNHighlightStandardColor color, uint8_t alpha)
+{
+ BNHighlightColor hc;
+ hc.style = StandardHighlightColor;
+ hc.color = color;
+ hc.mixColor = NoHighlightColor;
+ hc.mix = 0;
+ hc.r = 0;
+ hc.g = 0;
+ hc.b = 0;
+ hc.alpha = alpha;
+ SetAutoBasicBlockHighlight(hc);
+}
+
+
+void BasicBlock::SetAutoBasicBlockHighlight(BNHighlightStandardColor color, BNHighlightStandardColor mixColor,
+ uint8_t mix, uint8_t alpha)
+{
+ BNHighlightColor hc;
+ hc.style = MixedHighlightColor;
+ hc.color = color;
+ hc.mixColor = mixColor;
+ hc.mix = mix;
+ hc.r = 0;
+ hc.g = 0;
+ hc.b = 0;
+ hc.alpha = alpha;
+ SetAutoBasicBlockHighlight(hc);
+}
+
+
+void BasicBlock::SetAutoBasicBlockHighlight(uint8_t r, uint8_t g, uint8_t b, uint8_t alpha)
+{
+ BNHighlightColor hc;
+ hc.style = CustomHighlightColor;
+ hc.color = NoHighlightColor;
+ hc.mixColor = NoHighlightColor;
+ hc.mix = 0;
+ hc.r = r;
+ hc.g = g;
+ hc.b = b;
+ hc.alpha = alpha;
+ SetAutoBasicBlockHighlight(hc);
+}
+
+
+void BasicBlock::SetUserBasicBlockHighlight(BNHighlightColor color)
+{
+ BNSetUserBasicBlockHighlight(m_object, color);
+}
+
+
+void BasicBlock::SetUserBasicBlockHighlight(BNHighlightStandardColor color, uint8_t alpha)
+{
+ BNHighlightColor hc;
+ hc.style = StandardHighlightColor;
+ hc.color = color;
+ hc.mixColor = NoHighlightColor;
+ hc.mix = 0;
+ hc.r = 0;
+ hc.g = 0;
+ hc.b = 0;
+ hc.alpha = alpha;
+ SetUserBasicBlockHighlight(hc);
+}
+
+
+void BasicBlock::SetUserBasicBlockHighlight(BNHighlightStandardColor color, BNHighlightStandardColor mixColor,
+ uint8_t mix, uint8_t alpha)
+{
+ BNHighlightColor hc;
+ hc.style = MixedHighlightColor;
+ hc.color = color;
+ hc.mixColor = mixColor;
+ hc.mix = mix;
+ hc.r = 0;
+ hc.g = 0;
+ hc.b = 0;
+ hc.alpha = alpha;
+ SetUserBasicBlockHighlight(hc);
+}
+
+
+void BasicBlock::SetUserBasicBlockHighlight(uint8_t r, uint8_t g, uint8_t b, uint8_t alpha)
+{
+ BNHighlightColor hc;
+ hc.style = CustomHighlightColor;
+ hc.color = NoHighlightColor;
+ hc.mixColor = NoHighlightColor;
+ hc.mix = 0;
+ hc.r = r;
+ hc.g = g;
+ hc.b = b;
+ hc.alpha = alpha;
+ SetUserBasicBlockHighlight(hc);
+}
+
+
+bool BasicBlock::IsBackEdge(BasicBlock* source, BasicBlock* target)
+{
+ return source->GetDominators().count(target) != 0;
+}