1 #ifndef ROSE_BinaryAnalysis_StackDelta_H
2 #define ROSE_BinaryAnalysis_StackDelta_H
3 #include <featureTests.h>
4 #ifdef ROSE_ENABLE_BINARY_ANALYSIS
6 #include <BaseSemantics2.h>
7 #include <Disassembler.h>
8 #include <Sawyer/Map.h>
10 #include <boost/serialization/access.hpp>
16 namespace Partitioner2 {
19 class InterproceduralPredicate;
26 namespace StackDelta {
58 InstructionSemantics2::BaseSemantics::SValuePtr> SValuePair;
68 SValuePair functionStackPtrs_;
69 InstructionSemantics2::BaseSemantics::SValuePtr functionDelta_;
71 SValuePairPerAddress bblockStackPtrs_;
72 DeltasPerAddress bblockDeltas_;
74 SValuePairPerAddress insnStackPtrs_;
75 DeltasPerAddress insnDeltas_;
77 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
79 friend class boost::serialization::access;
82 void serialize(S &s,
const unsigned ) {
83 s & BOOST_SERIALIZATION_NVP(cpu_);
84 s & BOOST_SERIALIZATION_NVP(initialConcreteStackPointer_);
85 s & BOOST_SERIALIZATION_NVP(hasResults_);
86 s & BOOST_SERIALIZATION_NVP(didConverge_);
87 s & BOOST_SERIALIZATION_NVP(functionStackPtrs_);
88 s & BOOST_SERIALIZATION_NVP(functionDelta_);
89 s & BOOST_SERIALIZATION_NVP(bblockStackPtrs_);
90 s & BOOST_SERIALIZATION_NVP(bblockDeltas_);
91 s & BOOST_SERIALIZATION_NVP(insnStackPtrs_);
92 s & BOOST_SERIALIZATION_NVP(insnDeltas_);
103 : hasResults_(false), didConverge_(false) {}
109 : hasResults_(false), didConverge_(false) {
121 : cpu_(cpu), hasResults_(false), didConverge_(false) {}
187 InstructionSemantics2::BaseSemantics::SValuePtr
functionStackDelta()
const {
return functionDelta_; }
205 InstructionSemantics2::BaseSemantics::SValuePtr
basicBlockStackDelta(rose_addr_t basicBlockAddress)
const;
274 static int64_t
toInt(
const InstructionSemantics2::BaseSemantics::SValuePtr&);
277 void print(std::ostream&)
const;
282 const InstructionSemantics2::BaseSemantics::SValuePtr &spIn,
283 const InstructionSemantics2::BaseSemantics::SValuePtr &spOut,
284 const InstructionSemantics2::BaseSemantics::SValuePtr &delta);
290 std::ostream& operator<<(std::ostream&,
const Analysis&);
void initDiagnostics()
Initialize diagnostics.
Analysis()
Default constructor.
static int64_t toInt(const InstructionSemantics2::BaseSemantics::SValuePtr &)
Convert a symbolic value to an integer.
InstructionSemantics2::BaseSemantics::SValuePtr basicBlockOutputStackDeltaWrtFunction(rose_addr_t basicBlockAddress) const
Stack delta for block w.r.t.
InstructionSemantics2::BaseSemantics::SValuePtr functionStackDelta() const
Stack delta for an analyzed function.
void initialConcreteStackPointer(const Sawyer::Optional< rose_addr_t > &val)
Property: Initial value to use for stack pointers.
static void clearAstStackDeltas(SgNode *)
Clear AST stack deltas.
Analysis(const InstructionSemantics2::BaseSemantics::DispatcherPtr &cpu)
Construct an analysis using a specified dispatcher.
Base class for machine instructions.
void print(std::ostream &) const
Print multi-line value to specified stream.
int64_t instructionStackDeltaConcrete(SgAsmInstruction *) const
Concrete stack delta for an instruction.
InstructionSemantics2::BaseSemantics::DispatcherPtr cpu() const
Virtual CPU used for analysis.
Represents a synthesized function.
bool didConverge() const
Whether the analysis results are valid.
Analysis(Disassembler *d)
Construct an analyzer using a specified disassembler.
Main namespace for the ROSE library.
InstructionSemantics2::BaseSemantics::SValuePtr basicBlockStackDelta(rose_addr_t basicBlockAddress) const
Stack delta for an analyzed basic block.
void clearStackPointers()
Clear stack pointers, not deltas.
void analyzeFunction(const Partitioner2::Partitioner &, const Sawyer::SharedPointer< Partitioner2::Function > &, Partitioner2::DataFlow::InterproceduralPredicate &)
Analyze one function.
int64_t basicBlockStackDeltaConcrete(rose_addr_t basicBlockAddress) const
Concrete stack delta for an analyzed basic block.
InstructionSemantics2::BaseSemantics::SValuePtr instructionOutputStackDeltaWrtFunction(SgAsmInstruction *) const
Stack delta for instruction w.r.t.
Reference-counting intrusive smart pointer.
InstructionSemantics2::BaseSemantics::SValuePtr instructionInputStackDeltaWrtFunction(SgAsmInstruction *) const
Stack delta for instruction w.r.t.
Sawyer::Optional< rose_addr_t > initialConcreteStackPointer() const
Property: Initial value to use for stack pointers.
void clearStackDeltas()
Clear stack deltas, not pointers.
boost::shared_ptr< Dispatcher > DispatcherPtr
Shared-ownership pointer to a semantics instruction dispatcher.
int64_t functionStackDeltaConcrete() const
Concrete stack delta for an analyzed function.
InstructionSemantics2::BaseSemantics::SValuePtr instructionStackDelta(SgAsmInstruction *) const
Stack delta for an instruction.
This class represents the base class for all IR nodes within Sage III.
Predicate that decides when to use inter-procedural data-flow.
bool hasResults() const
Whether a function has been analyzed.
SValuePair functionStackPointers() const
Initial and final stack pointers for an analyzed function.
void clearResults()
Clear analysis results.
Sawyer::Message::Facility mlog
Facility for diagnostic output.
Sawyer::SharedPointer< SValue > SValuePtr
Shared-ownership pointer to a semantic value in any domain.
void saveAnalysisResults(SgAsmFunction *) const
Update AST with analysis results.
SValuePair instructionStackPointers(SgAsmInstruction *) const
Initial and final stack ponters for an analyzed instruction.
Partitions instructions into basic blocks and functions.
Virtual base class for instruction disassemblers.
InstructionSemantics2::BaseSemantics::SValuePtr basicBlockInputStackDeltaWrtFunction(rose_addr_t basicBlockAddress) const
Stack delta for block w.r.t.
SValuePair basicBlockStackPointers(rose_addr_t basicBlockAddress) const
Initial and final stack pointers for a basic block.
void clearNonResults()
Clears everything but results.