-
Notifications
You must be signed in to change notification settings - Fork 9
Graph Matching: Algorithm
Sandeep Dasgupta edited this page Aug 26, 2019
·
4 revisions
/* Node stucture of x86-data-flow graph*/
struct x86Node {
NodeInfo nodeInfo;
vector<x86Node> parents;
};
/* Variable Matching Info*/
class VarBBMatcher {
private:
map<x86Node, set<MatchedInfo>> _var_matches;
map<x86BB, set<LLVM::BasicBlock>> _bb_matches;
public:
struct MatchedInfo {
LLVMNode candidate;
int confidence;
};
static void addMatchingInfo(x86Node node, vector<MatchedInfo> info) {
for (auto i : info) {
_var_matches[node].insert(i);
_bb_matches[node->parent].insert(i.parent);
}
}
// Returns the LLVM basic block used for searching the LLVM varibales
// corresponding to x86Node node.
// Return values: If the parent x86 BB of node is Entry, then return the
// coresponding entry LLVM BB.
// Else return all the yet unmatched LLVM BBs
vector<LLVM::BasicBlock> getLLVMBB(x86Node node);
};
/*
main_driver is responsible for matching the data-flow
sub-graphs for each instruction in x86 code
*/
void main_driver(x86Code code /*The x86 code*/) {
for (each instruction I : Instruction in code(following the control flow)) {
for (x86Node node : dataflow graph of I in topological order) {
matchNode(node)
}
}
}
void matchNode(x86Node node) {
if (Matches.exists(node) == false) {
VarBBMatcher.addMatchingInfo(node,
findCandidateLLVMNodes(node, node.parents));
}
}
typedef vector<LLVMNode> tuple;
MatchedInfo findCandidateLLVMNodes(x86Node node, vector<x86Node> parents) {
set<MatchedInfo> retval;
if (parents.size() == 0) {
auto LLVMBBs = node.getLLVMBB();
for (auto LLVMBB : LLVMBBs) {
retval.append(findCandidateLLVMNodesInBB(node, BB));
}
return retval;
}
if (some parents have no candidates) {
//find the latest parents having candidate LLVM nodes
}
// If 'node' has n parents and each having O(m) LLVM node candidates,
// then explore all the nm candidate tuples to check which ones has a path
// to node
for (each candidate tuple `t` of parents) {
for (each child of node) {
if (isReachable(t, child)) {
retval.append(t);
}
}
return accumMatches;
}
/*
Return true if each of the members of tuple t can reach a
LLVM node corresponding to x86Node node.
*/
bool isReachable(tuple t, x86Node node) {
if(node == NULL) return false;
if(not reachable) {
for (each child of node) {
return isReachable(t, child);
} else {
return false;
}
}
test