summaryrefslogtreecommitdiff
path: root/main.cpp
diff options
context:
space:
mode:
authorOxore <oxore@protonmail.com>2023-04-23 19:17:01 +0300
committerOxore <oxore@protonmail.com>2023-04-23 19:17:01 +0300
commite8bc35a6297da6bea1eed833ac25cfebe1fee355 (patch)
tree2bf1b5826036bdc51023181ea8ab70a6fb7e0a8e /main.cpp
parent771b675f2ec83c1b6b2d41d236fc4bd3c368b1cd (diff)
Impl separate xref types call and branch
Diffstat (limited to 'main.cpp')
-rw-r--r--main.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/main.cpp b/main.cpp
index f84c55e..5dd27f5 100644
--- a/main.cpp
+++ b/main.cpp
@@ -82,7 +82,8 @@ void DisasmMap::DisasmAll(const DataBuffer &code, const Settings & s)
auto *ref_node = insertTracedNode(
node->branch_addr, TracedNodeType::kInstruction);
ref_node->Disasm(code, s);
- ref_node->AddReferencedBy(node->offset);
+ ref_node->AddReferencedBy(
+ node->offset, node->is_call ? ReferenceType::kCall : ReferenceType::kBranch);
}
}
}
@@ -115,6 +116,16 @@ static size_t RenderRawDataComment(
return overall_sz;
}
+static const char *ReferenceTypeToString(ReferenceType type)
+{
+ switch (type) {
+ case ReferenceType::kUnknown: return "UNKN";
+ case ReferenceType::kBranch: return "BRANCH";
+ case ReferenceType::kCall: return "CALL";
+ }
+ return "UNKN";
+}
+
static void RenderDisassembly(
FILE *output, const DisasmMap &disasm_map, const DataBuffer &code, const Settings &)
{
@@ -124,11 +135,15 @@ static void RenderDisassembly(
char comment[100]{};
RenderRawDataComment(comment, sizeof(comment) - 1, node->offset, node->size, code);
if (node->ref_by) {
- fprintf(output, "| Referenced by:\n");
+ fprintf(output, "| XREFS:\n");
for (ReferenceNode *ref{node->ref_by}; ref; ref = ref->next) {
+ if (ref->refs_count == 0) {
+ continue;
+ }
fprintf(output, "|");
for (size_t i = 0; i < ref->refs_count; i++) {
- fprintf(output, " @%08x", ref->refs[i]);
+ const ReferenceRecord r = ref->refs[i];
+ fprintf(output, " %s @%08x", ReferenceTypeToString(r.type), r.address);
}
fprintf(output, "\n");
}