ROSE  0.11.145.0
ReturnValueUsed.h
1 #ifndef ROSE_BinaryAnalysis_ReturnValueUsed_H
2 #define ROSE_BinaryAnalysis_ReturnValueUsed_H
3 #include <featureTests.h>
4 #ifdef ROSE_ENABLE_BINARY_ANALYSIS
5 
6 #include <Rose/BinaryAnalysis/CallingConvention.h>
7 #include <Rose/BinaryAnalysis/Partitioner2/BasicTypes.h>
8 #include <Rose/BinaryAnalysis/Partitioner2/ControlFlowGraph.h>
9 #include <Rose/BinaryAnalysis/RegisterParts.h>
10 
11 namespace Rose {
12 namespace BinaryAnalysis {
13 
17 namespace ReturnValueUsed {
18 
22 void initDiagnostics();
23 
28 
30 // Miscellaneous small types
32 
34  bool didConverge_; // Are the following data members valid (else only approximations)?
35  std::vector<Partitioner2::FunctionPtr> callees_;
36  RegisterParts returnRegistersUsed_;
37  RegisterParts returnRegistersUnused_;
38 
39 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
40 private:
41  friend class boost::serialization::access;
42 
43  template<class S>
44  void serialize(S & s, const unsigned /*version*/) {
45  s & BOOST_SERIALIZATION_NVP(didConverge_);
46  s & BOOST_SERIALIZATION_NVP(callees_);
47  s & BOOST_SERIALIZATION_NVP(returnRegistersUsed_);
48  s & BOOST_SERIALIZATION_NVP(returnRegistersUnused_);
49  }
50 #endif
51 
52 public:
54  ~CallSiteResults();
55 
63  bool didConverge() const;
64  void didConverge(bool);
68  const std::vector<Partitioner2::FunctionPtr> callees() const;
69 
75  const RegisterParts& returnRegistersUsed() const;
85  const RegisterParts& returnRegistersUnused() const;
90 private:
91  friend class Analysis;
92  void callees(const std::vector<Partitioner2::FunctionPtr>&);
93 };
94 
96 // Main analysis class
98 
99 class Analysis {
100 private:
101  typedef Sawyer::Container::Map<rose_addr_t /*call_site*/, CallSiteResults> CallSiteMap;
102 
103 private:
104  CallingConvention::Definition::Ptr defaultCallingConvention_;
105  CallSiteMap callSites_;
106  bool assumeCallerReturnsValue_;
107 
108 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
109 private:
110  friend class boost::serialization::access;
111 
112  template<class S>
113  void serialize(S &s, const unsigned /*version*/) {
114  s & BOOST_SERIALIZATION_NVP(defaultCallingConvention_);
115  s & BOOST_SERIALIZATION_NVP(callSites_);
116  s & BOOST_SERIALIZATION_NVP(assumeCallerReturnsValue_);
117  }
118 #endif
119 
120 public:
126  Analysis();
127 
128  ~Analysis();
129 
175  bool assumeCallerReturnsValue() const;
176  void assumeCallerReturnsValue(bool);
183  void clearResults();
184 
187  const Partitioner2::ControlFlowGraph::ConstVertexIterator&);
188 
189 private:
190  // Given a control flow graph vertex, if that vertex is a function call basic block then return a list of the known, called
191  // functions.
192  std::vector<Partitioner2::FunctionPtr>
193  findCallees(const Partitioner2::PartitionerConstPtr&, const Partitioner2::ControlFlowGraph::ConstVertexIterator &callSite);
194 
195  // Given a control flow graph vertex, if that vertex is a function call basic block then return a list of all vertices that
196  // are known call-return points for that call.
197  std::vector<Partitioner2::ControlFlowGraph::ConstVertexIterator>
198  findReturnTargets(const Partitioner2::PartitionerConstPtr&,
199  const Partitioner2::ControlFlowGraph::ConstVertexIterator &callSite);
200 };
201 
202 } // namespace
203 } // namespace
204 } // namespace
205 
206 #endif
207 #endif
CallSiteResults analyzeCallSite(const Partitioner2::PartitionerConstPtr &, const Partitioner2::ControlFlowGraph::ConstVertexIterator &)
Analyze a call site to see if a function's return value is used.
Collection of streams.
Definition: Message.h:1606
const RegisterParts & returnRegistersUnused() const
Property: Return registers that are unused in the caller.
CallingConvention::Definition::Ptr defaultCallingConvention() const
Property: Default calling convention.
void initDiagnostics()
Initialize diagnostics.
Main namespace for the ROSE library.
Holds a set of registers without regard for register boundaries.
Definition: RegisterParts.h:28
Sawyer::Message::Facility mlog
Facility for diagnostic output.
void clearResults()
Clear analysis results.
bool assumeCallerReturnsValue() const
Property: Assume caller returns value(s).
bool didConverge() const
Property: Did the analysis converge to a solution.
const RegisterParts & returnRegistersUsed() const
Property: Return registers that are used in the caller.
const std::vector< Partitioner2::FunctionPtr > callees() const
Property: Functions called at this site.
Container associating values with keys.
Definition: Sawyer/Map.h:66