ROSE 0.11.145.339
DataDependence.h
1#ifndef ROSE_BinaryAnalysis_DataDependence_H
2#define ROSE_BinaryAnalysis_DataDependence_H
3#include <featureTests.h>
4#ifdef ROSE_ENABLE_BINARY_ANALYSIS
5
6#include <Rose/BinaryAnalysis/AbstractLocation.h>
7#include <Rose/BinaryAnalysis/BasicTypes.h>
8
9#include <Sawyer/Graph.h>
10
12
13namespace Rose {
14namespace BinaryAnalysis {
15namespace DataDependence {
16
18void initDiagnostics();
19
20class Vertex {
21public:
22 enum class Type {
23 NORMAL,
24 EMPTY_SOURCE,
25 EMPTY_TARGET,
26 };
27
28private:
29 Type type_ = Type::NORMAL;
30 AbstractLocation location_;
31public:
32 ~Vertex();
33 explicit Vertex(Type);
34 explicit Vertex(const AbstractLocation&);
36 Vertex(const InstructionSemantics::BaseSemantics::SValuePtr &address, size_t nBitsInValue);
38 const InstructionSemantics::BaseSemantics::SValuePtr &registerOffset, size_t nBitsInValue);
39 static Vertex emptyTarget();
40 static Vertex emptySource();
41 Type type() const;
42 const AbstractLocation& location() const;
43 std::string toString() const;
44};
45
46class VertexKey {
47 uint64_t hash_ = 0;
48public:
49 VertexKey() = delete;
50 explicit VertexKey(const Vertex&);
51 bool operator<(const VertexKey&) const;
52};
53
54class Edge {
55 SgAsmInstruction *insn_ = nullptr;
56public:
57 Edge() = delete;
58 explicit Edge(SgAsmInstruction*);
59 SgAsmInstruction *instruction() const;
60};
61
62class Graph: public Sawyer::Container::Graph<Vertex, Edge, VertexKey> {
63private:
65public:
66 using Subgraphs = std::map<Address, std::vector<Graph::ConstEdgeIterator>>;
67
68private:
70 ConstVertexIterator emptySource_, emptyTarget_;
71
72public:
73 ~Graph();
74 Graph() = delete;
75 Graph(const Graph&);
76 Graph& operator=(const Graph&);
78
79public:
80 bool edgeExists(VertexIterator, VertexIterator, SgAsmInstruction*) const;
81 void toGraphviz(std::ostream&) const;
82 ConstVertexIterator emptySource() const;
83 ConstVertexIterator emptyTarget() const;
84 Architecture::BaseConstPtr architecture() const;
85
86private:
87 std::set<Address> controlFlowSuccessors(Address) const;
88 Subgraphs makeGraphvizSubgraphs() const;
89 void emitGraphvizLocationVertices(std::ostream&) const;
90 void emitGraphvizInstructionVertices(std::ostream&, const Subgraphs&) const;
91 void emitGraphvizDataFlowEdges(std::ostream&) const;
92 void emitGraphvizControlFlowEdges(std::ostream&, const Subgraphs&) const;
93};
94
96
97
98std::ostream& operator<<(std::ostream&, const Graph&);
99
100} // namespace
101} // namespace
102} // namespace
103
104#endif
105#endif
Describes (part of) a physical CPU register.
Graph containing user-defined vertices and edges.
Definition Graph.h:634
Collection of streams.
Definition Message.h:1606
Base class for machine instructions.
std::shared_ptr< const Base > BaseConstPtr
Reference counted pointer for Architecture::Base.
std::uint64_t Address
Address.
Definition Address.h:11
ROSE_DLL_API Sawyer::Message::Facility mlog
Diagnostic facility for the ROSE library as a whole.
Definition sageBuilder.C:58
The ROSE library.