Skip to content

Instantly share code, notes, and snippets.

@dberlin
Created February 10, 2019 04:31
Show Gist options
  • Save dberlin/28b082b79532e90a9e711a597f8af8e0 to your computer and use it in GitHub Desktop.
Save dberlin/28b082b79532e90a9e711a597f8af8e0 to your computer and use it in GitHub Desktop.
diff --git a/include/retdec/llvmir2hll/graphs/cfg/cfg_traversal.h b/include/retdec/llvmir2hll/graphs/cfg/cfg_traversal.h
index 4905a90..4a9849a 100644
--- a/include/retdec/llvmir2hll/graphs/cfg/cfg_traversal.h
+++ b/include/retdec/llvmir2hll/graphs/cfg/cfg_traversal.h
@@ -7,6 +7,9 @@
#ifndef RETDEC_LLVMIR2HLL_GRAPHS_CFG_CFG_TRAVERSAL_H
#define RETDEC_LLVMIR2HLL_GRAPHS_CFG_CFG_TRAVERSAL_H
+#include <unordered_map>
+#include <unordered_set>
+
#include "retdec/llvmir2hll/graphs/cfg/cfg.h"
#include "retdec/llvmir2hll/support/smart_ptr.h"
#include "retdec/llvmir2hll/support/types.h"
@@ -82,6 +85,9 @@ protected:
/// Should the traversal be stopped?
bool stopTraversal;
+ std::unordered_map<ShPtr<CFG::Node>, unsigned int> nodeIDMap;
+ std::unordered_set<ShPtr<CFG::Node>> visitedNodes;
+
private:
bool performTraversalImpl(ShPtr<CFG::Node> startNode,
CFG::stmt_iterator startStmtIter);
diff --git a/src/llvmir2hll/graphs/cfg/cfg_traversal.cpp b/src/llvmir2hll/graphs/cfg/cfg_traversal.cpp
index 1422d94..122036a 100644
--- a/src/llvmir2hll/graphs/cfg/cfg_traversal.cpp
+++ b/src/llvmir2hll/graphs/cfg/cfg_traversal.cpp
@@ -26,6 +26,9 @@ namespace llvmir2hll {
CFGTraversal::CFGTraversal(ShPtr<CFG> cfg, bool defaultCurrRetVal):
cfg(cfg), currRetVal(defaultCurrRetVal), stopTraversal(false) {
PRECONDITION_NON_NULL(cfg);
+ unsigned int nodeId = 0;
+ for (auto I = cfg->node_begin(), E = cfg->node_end(); I != E; ++I)
+ nodeIDMap[*I] = ++nodeId;
}
/**
@@ -47,14 +50,17 @@ bool CFGTraversal::performTraversal(ShPtr<Statement> startStmt) {
PRECONDITION_NON_NULL(startStmt);
PRECONDITION(!isa<EmptyStmt>(startStmt),
"a CFG traversal cannot start from an empty statement");
-
+ visitedNodes.clear();
+ llvm::errs() << "Visit start\n";
// Initialization.
stopTraversal = false;
CFG::StmtInNode startStmtInNode(cfg->getNodeForStmt(startStmt));
ASSERT_MSG(startStmtInNode.first,
"the statement `" << startStmt << "` is not in the CFG");
- return performTraversalImpl(startStmtInNode.first, startStmtInNode.second);
+ auto retVal = performTraversalImpl(startStmtInNode.first, startStmtInNode.second);
+ llvm::errs() << "Visit end\n";
+ return retVal;
}
/**
@@ -72,6 +78,9 @@ bool CFGTraversal::performTraversalFromSuccessors(ShPtr<Statement> stmt) {
PRECONDITION_NON_NULL(stmt);
PRECONDITION(!isa<EmptyStmt>(stmt),
"a CFG traversal cannot start from an empty statement");
+ visitedNodes.clear();
+ llvm::errs() << "Going from successors\n";
+ llvm::errs() << "Visit start\n";
// Initialization.
stopTraversal = false;
@@ -83,10 +92,14 @@ bool CFGTraversal::performTraversalFromSuccessors(ShPtr<Statement> stmt) {
if (stmtInNode.second != stmtInNode.first->stmt_end()) {
// It has a successor in the same node, so start traversing from the
// successor.
- return performTraversalImpl(stmtInNode.first, ++stmtInNode.second);
+ auto retVal = performTraversalImpl(stmtInNode.first, ++stmtInNode.second);
+ llvm::errs() << "Visit end\n";
+ return retVal;
}
// It is the last statement in the node, so traverse all node successors.
- return traverseNodeSuccessors(stmtInNode.first);
+ auto retVal = traverseNodeSuccessors(stmtInNode.first);
+ llvm::errs() << "Visit end\n";
+ return retVal;
}
/**
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment