1#ifndef ROSE_BinaryAnalysis_Unparser_Base_H
2#define ROSE_BinaryAnalysis_Unparser_Base_H
3#include <featureTests.h>
4#ifdef ROSE_ENABLE_BINARY_ANALYSIS
6#include <Rose/BinaryAnalysis/BasicTypes.h>
7#include <Rose/BinaryAnalysis/Partitioner2/BasicTypes.h>
8#include <Rose/BinaryAnalysis/Partitioner2/ControlFlowGraph.h>
9#include <Rose/BinaryAnalysis/Partitioner2/FunctionCallGraph.h>
10#include <Rose/BinaryAnalysis/Reachability.h>
11#include <Rose/BinaryAnalysis/RegisterNames.h>
12#include <Rose/BinaryAnalysis/Unparser/EdgeArrows.h>
13#include <Rose/BinaryAnalysis/Unparser/Settings.h>
14#include <Rose/BitFlags.h>
15#include <Rose/Progress.h>
17#include <Sawyer/Map.h>
18#include <Sawyer/Message.h>
19#include <Sawyer/SharedObject.h>
22namespace BinaryAnalysis {
26typedef std::map<uint64_t, std::string>
LabelMap;
32void initDiagnostics();
98 std::vector<Style> stack_;
139 void merge(
const Style &style);
157 n_ = stack_.
push(style);
164 n_ = stack_.
push(first);
208 std::string nextInsnLabel_;
211 const Base &frontUnparser_;
212 std::vector<Reachability::ReasonFlags> cfgVertexReachability_;
217 bool cfgArrowsPointToInsns_;
350 const std::string& nextInsnLabel()
const;
351 void nextInsnLabel(
const std::string&);
426 virtual Ptr copy()
const = 0;
482 std::
string operator()(const Partitioner2::PartitionerConstPtr&,
SgAsmInstruction*) const ;
483 std::
string operator()(const Partitioner2::PartitionerConstPtr&, const Partitioner2::BasicBlockPtr&) const ;
484 std::
string operator()(const Partitioner2::PartitionerConstPtr&, const Partitioner2::DataBlockPtr&) const ;
485 std::
string operator()(const Partitioner2::PartitionerConstPtr&, const Partitioner2::FunctionPtr&) const ;
497 void unparse(std::ostream&, const Partitioner2::PartitionerConstPtr&, const Partitioner2::BasicBlockPtr&) const ;
498 void unparse(std::ostream&, const Partitioner2::PartitionerConstPtr&, const Partitioner2::DataBlockPtr&) const ;
499 void unparse(std::ostream&, const Partitioner2::PartitionerConstPtr&, const Partitioner2::FunctionPtr&) const ;
504 std::
string unparse(const Partitioner2::PartitionerConstPtr&, const Partitioner2::BasicBlockPtr&) const ;
505 std::
string unparse(const Partitioner2::PartitionerConstPtr&, const Partitioner2::DataBlockPtr&) const ;
506 std::
string unparse(const Partitioner2::PartitionerConstPtr&, const Partitioner2::FunctionPtr&) const ;
590 bool isSigned) const;
618 static std::
string leftJustify(const std::
string&,
size_t nchars);
625 static std::
string juxtaposeColumns(const std::vector<std::
string> &content, const std::vector<
size_t> &minWidths,
626 const std::vector<std::pair<std::
string, std::
string> > &colorEscapes,
627 const std::
string &columnSeparator = " ");
635 Partitioner2::ControlFlowGraph::ConstEdgeIterator b);
643 Partitioner2::ControlFlowGraph::ConstEdgeIterator b);
649 static std::vector<Partitioner2::ControlFlowGraph::ConstEdgeIterator>
656 static std::vector<Partitioner2::ControlFlowGraph::ConstEdgeIterator>
664#ifdef ROSE_ENABLE_PYTHON_API
671 explicit PythonBase(
const Base::Ptr &base)
673 ASSERT_not_null(base);
677 return base_->unparse(p);
681 base_->unparse(std::cout, p);
Function call information.
Reason
Predefined bit flags for why something is reachable.
Describes (part of) a physical CPU register.
Convert a register descriptor to a name.
State associated with printing arrows in the margin.
Flags
Flags controlling the finer aspects of margin arrows.
@ POINTABLE_ENTITY_INSIDE
This flag is modified automatically by the emitLinePrefix function.
@ POINTABLE_ENTITY_START
Set this flag when you want the emitLinePrefix function to treat the next possible line as the start ...
@ POINTABLE_ENTITY_END
Set this flag when you want the emitLinePrefix function to treat the next line as the end of a pointa...
@ ALWAYS_RENDER
If set, then emit the prefix area even if we seem to be generating output that the unparser would oth...
void reset()
Reset the marging arrow state.
std::string render(Sawyer::Optional< EdgeArrows::VertexId > currentEntity)
Generate the string to print in the margin.
Sawyer::Optional< EdgeArrows::VertexId > latestEntity
Latest pointable entity that was encountered in the output.
EdgeArrows arrows
The arrows to be displayed.
BitFlags< Flags > flags
Flags that hold and/or control the output state.
Abstract base class for unparsers.
virtual void emitFunctionStackDelta(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
virtual Settings & settings()=0
Property: Settings associated with this unparser.
virtual void emitInstructionPrologue(std::ostream &, SgAsmInstruction *, State &) const
Mid-level unparser function.
virtual void emitBasicBlockSuccessors(std::ostream &, const Partitioner2::BasicBlockPtr &, State &) const
Mid-level unparser function.
void operator()(std::ostream &, const Partitioner2::PartitionerConstPtr &, SgAsmInstruction *) const
Emit the entity to an output stream.
virtual void emitFunction(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
static bool ascendingSourceAddress(Partitioner2::ControlFlowGraph::ConstEdgeIterator a, Partitioner2::ControlFlowGraph::ConstEdgeIterator b)
Return true if edges are in order by source address.
void operator()(std::ostream &, const Partitioner2::PartitionerConstPtr &, const Partitioner2::BasicBlockPtr &) const
Emit the entity to an output stream.
virtual std::vector< std::string > emitInteger(std::ostream &, const Sawyer::Container::BitVector &, State &, bool isSigned) const
Mid-level unparser function.
virtual void emitDataBlockPrologue(std::ostream &, const Partitioner2::DataBlockPtr &, State &) const
Mid-level unparser function.
virtual void emitInstructionOperands(std::ostream &, SgAsmInstruction *, State &) const
Mid-level unparser function.
virtual void emitFunctionReasons(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
virtual void emitTypeName(std::ostream &, SgAsmType *, State &) const
Mid-level unparser function.
void operator()(std::ostream &, const Partitioner2::PartitionerConstPtr &, const Partitioner2::DataBlockPtr &) const
Emit the entity to an output stream.
virtual void emitFunctionCallingConvention(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
virtual void emitInstructionBody(std::ostream &, SgAsmInstruction *, State &) const
Mid-level unparser function.
virtual void emitBasicBlockSharing(std::ostream &, const Partitioner2::BasicBlockPtr &, State &) const
Mid-level unparser function.
virtual void initializeState(State &) const
Finish initializing the unparser state.
virtual void emitFunctionPrologue(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
virtual void emitDataBlock(std::ostream &, const Partitioner2::DataBlockPtr &, State &) const
Mid-level unparser function.
virtual const Settings & settings() const =0
Property: Settings associated with this unparser.
static bool ascendingTargetAddress(Partitioner2::ControlFlowGraph::ConstEdgeIterator a, Partitioner2::ControlFlowGraph::ConstEdgeIterator b)
Return true if edges are in order by target address.
virtual void emitDataBlockEpilogue(std::ostream &, const Partitioner2::DataBlockPtr &, State &) const
Mid-level unparser function.
virtual void emitInstructionEpilogue(std::ostream &, SgAsmInstruction *, State &) const
Mid-level unparser function.
void operator()(std::ostream &, SgAsmInstruction *) const
Emit the entity to an output stream.
virtual void emitCommentBlock(std::ostream &, const std::string &, State &, const std::string &prefix=";;; ") const
Mid-level unparser function.
virtual std::vector< std::string > emitSignedInteger(std::ostream &, const Sawyer::Container::BitVector &, State &) const
Mid-level unparser function.
void settings(const Settings &s)
Property: Settings associated with this unparser.
virtual void emitDataBlockBody(std::ostream &, const Partitioner2::DataBlockPtr &, State &) const
Mid-level unparser function.
virtual void emitBasicBlockComment(std::ostream &, const Partitioner2::BasicBlockPtr &, State &) const
Mid-level unparser function.
static std::vector< Partitioner2::ControlFlowGraph::ConstEdgeIterator > orderedBlockPredecessors(const Partitioner2::PartitionerConstPtr &, const Partitioner2::BasicBlockPtr &)
Ordered incoming CFG edges.
virtual void emitInstructionBytes(std::ostream &, SgAsmInstruction *, State &) const
Mid-level unparser function.
virtual void emitOperand(std::ostream &, SgAsmExpression *, State &) const
Mid-level unparser function.
virtual void emitLinePrefix(std::ostream &, State &) const
Mid-level unparser function.
virtual void emitInstructionAddress(std::ostream &, SgAsmInstruction *, State &) const
Mid-level unparser function.
Ptr nextUnparser() const
Property: Next parser in chain.
void nextUnparser(Ptr next)
Property: Next parser in chain.
virtual void emitBasicBlockPrologue(std::ostream &, const Partitioner2::BasicBlockPtr &, State &) const
Mid-level unparser function.
virtual void emitBasicBlockReachability(std::ostream &, const Partitioner2::BasicBlockPtr &, State &) const
Mid-level unparser function.
virtual std::vector< std::string > emitUnsignedInteger(std::ostream &, const Sawyer::Container::BitVector &, State &) const
Mid-level unparser function.
virtual void emitOperandEpilogue(std::ostream &, SgAsmExpression *, State &) const
Mid-level unparser function.
virtual void emitFunctionMayReturn(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
virtual void emitDataBlockSourceLocation(std::ostream &, const Partitioner2::DataBlockPtr &, State &) const
Mid-level unparser function.
virtual void emitBasicBlockEpilogue(std::ostream &, const Partitioner2::BasicBlockPtr &, State &) const
Mid-level unparser function.
void operator()(std::ostream &, const Partitioner2::PartitionerConstPtr &) const
Emit the entity to an output stream.
virtual bool emitAddress(std::ostream &, rose_addr_t, State &, bool always=true) const
Mid-level unparser function.
virtual void emitInstructionComment(std::ostream &, SgAsmInstruction *, State &) const
Mid-level unparser function.
std::string operator()(const Partitioner2::PartitionerConstPtr &, const Progress::Ptr &=Progress::Ptr()) const
Emit the entity to a string.
virtual void emitExpression(std::ostream &, SgAsmExpression *, State &) const
Mid-level unparser function.
static std::vector< Partitioner2::ControlFlowGraph::ConstEdgeIterator > orderedBlockSuccessors(const Partitioner2::PartitionerConstPtr &, const Partitioner2::BasicBlockPtr &)
Ordered outgoing CFG edges.
void operator()(std::ostream &, const Partitioner2::PartitionerConstPtr &, const Partitioner2::FunctionPtr &) const
Emit the entity to an output stream.
virtual void emitInstructionStackDelta(std::ostream &, SgAsmInstruction *, State &) const
Mid-level unparser function.
virtual void emitBasicBlock(std::ostream &, const Partitioner2::BasicBlockPtr &, State &) const
Mid-level unparser function.
virtual void emitBasicBlockPredecessors(std::ostream &, const Partitioner2::BasicBlockPtr &, State &) const
Mid-level unparser function.
virtual void emitRegister(std::ostream &, RegisterDescriptor, State &) const
Mid-level unparser function.
virtual void emitBasicBlockSourceLocation(std::ostream &, const Partitioner2::BasicBlockPtr &, State &) const
Mid-level unparser function.
virtual void emitFunctionCallers(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
static std::string juxtaposeColumns(const std::vector< std::string > &content, const std::vector< size_t > &minWidths, const std::vector< std::pair< std::string, std::string > > &colorEscapes, const std::string &columnSeparator=" ")
Render a table row.
virtual void emitBasicBlockBody(std::ostream &, const Partitioner2::BasicBlockPtr &, State &) const
Mid-level unparser function.
void unparse(std::ostream &, const Partitioner2::PartitionerConstPtr &, const Progress::Ptr &=Progress::Ptr()) const
High-level unparsing function.
virtual void emitFunctionEpilogue(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
virtual void emitInstruction(std::ostream &, SgAsmInstruction *, State &) const
Mid-level unparser function.
virtual void emitFunctionBody(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
Architecture::BaseConstPtr architecture() const
Property: Architecture.
virtual void emitInstructionMnemonic(std::ostream &, SgAsmInstruction *, State &) const
Mid-level unparser function.
virtual void emitFunctionComment(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
virtual void emitFunctionCallees(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
virtual void emitFunctionSourceLocation(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
virtual void emitInstructionSemantics(std::ostream &, SgAsmInstruction *, State &) const
Mid-level unparser function.
static std::string leftJustify(const std::string &, size_t nchars)
Render a string left justified.
virtual void emitOperandPrologue(std::ostream &, SgAsmExpression *, State &) const
Mid-level unparser function.
virtual void updateIntraFunctionArrows(State &) const
Calculate intra-function arrows.
virtual void emitOperandBody(std::ostream &, SgAsmExpression *, State &) const
Mid-level unparser function.
virtual void emitFunctionNoopAnalysis(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
Analysis to generate arrows from one basic block to another.
void reset()
Reset the analysis.
bool cfgArrowsPointToInsns() const
Property: Whether CFG margin arrows point to instructions.
const std::vector< Reachability::ReasonFlags > cfgVertexReachability() const
Property: Reachability analysis results.
ArrowMargin & intraFunctionBlockArrows()
User-defined intra-function margin arrows.
ArrowMargin & globalBlockArrows()
User-defined arrows to basic blocks across entire output.
ArrowMargin & intraFunctionCfgArrows()
Control flow graph arrows within a function.
std::string reachabilityName(Reachability::ReasonFlags value) const
Assign a reachability name to a reachability value.
const Base & frontUnparser() const
First unparser in the chained list of unparsers.
const ArrowMargin & intraFunctionCfgArrows() const
Control flow graph arrows within a function.
Sawyer::Container::Map< rose_addr_t, std::string > AddrString
Map from address to string.
void thisIsBasicBlockFirstInstruction()
Call this when you're about to output the first instruction of a basic block.
void cfgArrowsPointToInsns(bool b)
Property: Whether CFG margin arrows point to instructions.
const StyleStack & styleStack() const
Property: Stack of styles.
Partitioner2::PartitionerConstPtr partitioner() const
Property: Partitioner, which may be null.
StyleStack & styleStack()
Property: Stack of styles.
Reachability::ReasonFlags isCfgVertexReachable(size_t vertexId) const
Returns reachability based on the cfgVertexReachability property.
void currentPredSuccId(Sawyer::Optional< EdgeArrows::VertexId > id)
Property: ID for CFG edge arrow endpoint.
void reachabilityName(Reachability::Reason value, const std::string &name)
Assign a reachability name to a reachability value.
const ArrowMargin & intraFunctionBlockArrows() const
User-defined intra-function margin arrows.
const Partitioner2::FunctionCallGraph & cg() const
Property: Call grap, which may be empty.
const ArrowMargin & globalBlockArrows() const
User-defined arrows to basic blocks across entire output.
Sawyer::Optional< EdgeArrows::VertexId > currentPredSuccId() const
Property: ID for CFG edge arrow endpoint.
void cfgVertexReachability(const std::vector< Reachability::ReasonFlags > &)
Property: Reachability analysis results.
void thisIsBasicBlockLastInstruction()
Call this when you're about to output the last instruction of a basic block.
Pushes a style and arranges for it to be popped later.
std::string render() const
Render style entry.
StyleGuard(StyleStack &stack, const Style &style)
Push style onto stack.
const Style & previous() const
Style before pushing.
std::string restore() const
Render style exit.
const Style & current() const
Current merged style.
size_t push(const Style &)
Push style onto stack.
const Style & current() const
Merged style.
size_t size() const
Number of styles on the stack.
void reset()
Clear the stack.
void colorization(const Color::Colorization c)
Property: Colorization settings.
Color::Colorization colorization() const
Property: Colorization settings.
void popTo(size_t)
Pop until stack is a certain size.
void pop()
Pop top style from stack.
Stores a vector of enum bit flags.
A general, thread-safe way to report progress made on some task.
Container associating values with keys.
Holds a value or nothing.
Base class for reference counted objects.
Base class for expressions.
Base class for machine instructions.
Base class for binary types.
std::shared_ptr< const Base > BaseConstPtr
Reference counted pointer for Architecture::Base.
std::map< uint64_t, std::string > LabelMap
Map from address to label.
Sawyer::Message::Facility mlog
Diagnostic output for unparsing.
std::string invalidRegister(SgAsmInstruction *, RegisterDescriptor, const RegisterDictionaryPtr &)
Constructs a string to describe the invalid register.
Settings that control unparsing.
Control colored command output.