1 #ifndef ROSE_BinaryAnalysis_Unparser_Base_H
2 #define ROSE_BinaryAnalysis_Unparser_Base_H
4 #include <featureTests.h>
5 #ifdef ROSE_ENABLE_BINARY_ANALYSIS
7 #include <Rose/BinaryAnalysis/BasicTypes.h>
8 #include <Rose/BinaryAnalysis/Partitioner2/BasicTypes.h>
9 #include <Rose/BinaryAnalysis/Partitioner2/ControlFlowGraph.h>
10 #include <Rose/BinaryAnalysis/Partitioner2/FunctionCallGraph.h>
11 #include <Rose/BinaryAnalysis/Reachability.h>
12 #include <Rose/BinaryAnalysis/RegisterNames.h>
13 #include <Rose/BinaryAnalysis/Unparser/EdgeArrows.h>
14 #include <Rose/BinaryAnalysis/Unparser/Settings.h>
15 #include <Rose/BitFlags.h>
16 #include <Rose/Progress.h>
18 #include <Sawyer/Map.h>
19 #include <Sawyer/Message.h>
20 #include <Sawyer/SharedObject.h>
23 namespace BinaryAnalysis {
28 typedef std::map<uint64_t, std::string> LabelMap;
58 POINTABLE_ENTITY_START = 0x00000001,
63 POINTABLE_ENTITY_END = 0x00000002,
66 POINTABLE_ENTITY_INSIDE = 0x00000004,
70 ALWAYS_RENDER = 0x00000008
74 BitFlags<Flags> flags;
100 std::vector<Style> stack_;
102 Color::Colorization colorization_;
110 Color::Colorization colorization()
const {
return colorization_; }
111 void colorization(
const Color::Colorization c) { colorization_ = c; }
117 size_t push(
const Style&);
138 const Style& current()
const;
141 void merge(
const Style &style);
156 StyleGuard(StyleStack &stack,
const Style &style)
158 previous_ = stack_.current();
159 n_ = stack_.push(style);
160 current_ = stack_.current();
163 StyleGuard(StyleStack &stack,
const Style &first,
const Style &second)
165 previous_ = stack_.current();
166 n_ = stack_.push(first);
168 current_ = stack_.current();
176 std::string render()
const;
179 std::string restore()
const;
182 const Style& current()
const {
187 const Style& previous()
const {
206 Partitioner2::FunctionCallGraph cg_;
210 std::string nextInsnLabel_;
211 AddrString basicBlockLabels_;
212 RegisterNames registerNames_;
213 const Base &frontUnparser_;
214 std::vector<Reachability::ReasonFlags> cfgVertexReachability_;
216 ArrowMargin intraFunctionCfgArrows_;
217 ArrowMargin intraFunctionBlockArrows_;
218 ArrowMargin globalBlockArrows_;
219 bool cfgArrowsPointToInsns_;
220 StyleStack styleStack_;
229 const Partitioner2::FunctionCallGraph& cg()
const;
237 const std::vector<Reachability::ReasonFlags> cfgVertexReachability()
const;
238 void cfgVertexReachability(
const std::vector<Reachability::ReasonFlags>&);
259 const ArrowMargin& intraFunctionCfgArrows()
const {
return intraFunctionCfgArrows_; }
260 ArrowMargin& intraFunctionCfgArrows() {
return intraFunctionCfgArrows_; }
276 const ArrowMargin& intraFunctionBlockArrows()
const {
return intraFunctionBlockArrows_; }
277 ArrowMargin& intraFunctionBlockArrows() {
return intraFunctionBlockArrows_; }
288 const ArrowMargin& globalBlockArrows()
const {
return globalBlockArrows_; }
289 ArrowMargin& globalBlockArrows() {
return globalBlockArrows_; }
293 void thisIsBasicBlockFirstInstruction();
296 void thisIsBasicBlockLastInstruction();
316 bool cfgArrowsPointToInsns()
const {
return cfgArrowsPointToInsns_; }
317 void cfgArrowsPointToInsns(
bool b) { cfgArrowsPointToInsns_ = b; }
323 const StyleStack& styleStack()
const {
return styleStack_; }
324 StyleStack& styleStack() {
return styleStack_; }
351 const std::string& nextInsnLabel()
const;
352 void nextInsnLabel(
const std::string&);
354 const RegisterNames& registerNames()
const;
355 void registerNames(
const RegisterNames &r);
357 const AddrString& basicBlockLabels()
const;
358 AddrString& basicBlockLabels();
360 const Base& frontUnparser()
const;
422 explicit Base(
const Ptr &nextUnparser);
425 virtual Ptr
copy()
const = 0;
437 virtual const Settings&
settings()
const = 0;
451 Ptr nextUnparser()
const {
return nextUnparser_; }
452 void nextUnparser(Ptr next) { nextUnparser_ = next; }
463 void operator()(
std::ostream&, const Partitioner2::PartitionerConstPtr&,
SgAsmInstruction*) const ;
464 void operator()(
std::ostream&, const Partitioner2::PartitionerConstPtr&, const Partitioner2::BasicBlockPtr&) const ;
465 void operator()(
std::ostream&, const Partitioner2::PartitionerConstPtr&, const Partitioner2::DataBlockPtr&) const ;
466 void operator()(
std::ostream&, const Partitioner2::PartitionerConstPtr&, const Partitioner2::FunctionPtr&) const ;
474 std::
string operator()(const Partitioner2::PartitionerConstPtr&, const Progress::Ptr& = Progress::Ptr()) const ;
475 std::
string operator()(const Partitioner2::PartitionerConstPtr&,
SgAsmInstruction*) const ;
476 std::
string operator()(const Partitioner2::PartitionerConstPtr&, const Partitioner2::BasicBlockPtr&) const ;
477 std::
string operator()(const Partitioner2::PartitionerConstPtr&, const Partitioner2::DataBlockPtr&) const ;
478 std::
string operator()(const Partitioner2::PartitionerConstPtr&, const Partitioner2::FunctionPtr&) const ;
487 void unparse(
std::ostream&, const Partitioner2::PartitionerConstPtr&, const Progress::Ptr& = Progress::Ptr()) const ;
488 void unparse(
std::ostream&, const Partitioner2::PartitionerConstPtr&,
SgAsmInstruction*) const ;
489 void unparse(
std::ostream&, const Partitioner2::PartitionerConstPtr&, const Partitioner2::BasicBlockPtr&) const ;
490 void unparse(
std::ostream&, const Partitioner2::PartitionerConstPtr&, const Partitioner2::DataBlockPtr&) const ;
491 void unparse(
std::ostream&, const Partitioner2::PartitionerConstPtr&, const Partitioner2::FunctionPtr&) const ;
493 std::
string unparse(const Partitioner2::PartitionerConstPtr&, const Progress::Ptr& = Progress::Ptr()) const ;
495 std::
string unparse(const Partitioner2::PartitionerConstPtr&, const Partitioner2::BasicBlockPtr&) const ;
496 std::
string unparse(const Partitioner2::PartitionerConstPtr&, const Partitioner2::DataBlockPtr&) const ;
497 std::
string unparse(const Partitioner2::PartitionerConstPtr&, const Partitioner2::FunctionPtr&) const ;
523 virtual
void emitFunction(
std::ostream&, const Partitioner2::FunctionPtr&, State&) const;
524 virtual
void emitFunctionPrologue(
std::ostream&, const Partitioner2::FunctionPtr&, State&) const;
525 virtual
void emitFunctionBody(
std::ostream&, const Partitioner2::FunctionPtr&, State&) const;
526 virtual
void emitFunctionEpilogue(
std::ostream&, const Partitioner2::FunctionPtr&, State&) const;
528 virtual
void emitFunctionSourceLocation(
std::ostream&, const Partitioner2::FunctionPtr&, State&) const;
529 virtual
void emitFunctionReasons(
std::ostream&, const Partitioner2::FunctionPtr&, State&) const;
530 virtual
void emitFunctionCallers(
std::ostream&, const Partitioner2::FunctionPtr&, State&) const;
531 virtual
void emitFunctionCallees(
std::ostream&, const Partitioner2::FunctionPtr&, State&) const;
532 virtual
void emitFunctionComment(
std::ostream&, const Partitioner2::FunctionPtr&, State&) const;
533 virtual
void emitFunctionStackDelta(
std::ostream&, const Partitioner2::FunctionPtr&, State&) const;
534 virtual
void emitFunctionCallingConvention(
std::ostream&, const Partitioner2::FunctionPtr&, State&) const;
535 virtual
void emitFunctionNoopAnalysis(
std::ostream&, const Partitioner2::FunctionPtr&, State&) const;
536 virtual
void emitFunctionMayReturn(
std::ostream&, const Partitioner2::FunctionPtr&, State&) const;
538 virtual
void emitDataBlockSourceLocation(
std::ostream&, const Partitioner2::DataBlockPtr&, State&) const;
539 virtual
void emitDataBlock(
std::ostream&, const Partitioner2::DataBlockPtr&, State&) const;
540 virtual
void emitDataBlockPrologue(
std::ostream&, const Partitioner2::DataBlockPtr&, State&) const;
541 virtual
void emitDataBlockBody(
std::ostream&, const Partitioner2::DataBlockPtr&, State&) const;
542 virtual
void emitDataBlockEpilogue(
std::ostream&, const Partitioner2::DataBlockPtr&, State&) const;
544 virtual
void emitBasicBlock(
std::ostream&, const Partitioner2::BasicBlockPtr&, State&) const;
545 virtual
void emitBasicBlockPrologue(
std::ostream&, const Partitioner2::BasicBlockPtr&, State&) const;
546 virtual
void emitBasicBlockBody(
std::ostream&, const Partitioner2::BasicBlockPtr&, State&) const;
547 virtual
void emitBasicBlockEpilogue(
std::ostream&, const Partitioner2::BasicBlockPtr&, State&) const;
549 virtual
void emitBasicBlockSourceLocation(
std::ostream&, const Partitioner2::BasicBlockPtr&, State&) const;
550 virtual
void emitBasicBlockComment(
std::ostream&, const Partitioner2::BasicBlockPtr&, State&) const;
551 virtual
void emitBasicBlockSharing(
std::ostream&, const Partitioner2::BasicBlockPtr&, State&) const;
552 virtual
void emitBasicBlockPredecessors(
std::ostream&, const Partitioner2::BasicBlockPtr&, State&) const;
553 virtual
void emitBasicBlockSuccessors(
std::ostream&, const Partitioner2::BasicBlockPtr&, State&) const;
554 virtual
void emitBasicBlockReachability(
std::ostream&, const Partitioner2::BasicBlockPtr&, State&) const;
557 virtual
void emitInstructionPrologue(
std::ostream&, SgAsmInstruction*, State&) const;
558 virtual
void emitInstructionBody(
std::ostream&, SgAsmInstruction*, State&) const;
559 virtual
void emitInstructionEpilogue(
std::ostream&, SgAsmInstruction*, State&) const;
561 virtual
void emitInstructionAddress(
std::ostream&, SgAsmInstruction*, State&) const;
562 virtual
void emitInstructionBytes(
std::ostream&, SgAsmInstruction*, State&) const;
563 virtual
void emitInstructionStackDelta(
std::ostream&, SgAsmInstruction*, State&) const;
564 virtual
void emitInstructionMnemonic(
std::ostream&, SgAsmInstruction*, State&) const;
565 virtual
void emitInstructionOperands(
std::ostream&, SgAsmInstruction*, State&) const;
566 virtual
void emitInstructionComment(
std::ostream&, SgAsmInstruction*, State&) const;
568 virtual
void emitInstructionSemantics(
std::ostream&, SgAsmInstruction*, State&) const;
571 virtual
void emitOperandPrologue(
std::ostream&, SgAsmExpression*, State&) const;
572 virtual
void emitOperandBody(
std::ostream&, SgAsmExpression*, State&) const;
573 virtual
void emitOperandEpilogue(
std::ostream&, SgAsmExpression*, State&) const;
575 virtual
void emitRegister(
std::ostream&, RegisterDescriptor, State&) const;
576 virtual
std::vector<
std::
string> emitUnsignedInteger(
std::ostream&, const
Sawyer::Container::BitVector&, State&) const;
577 virtual
std::vector<
std::
string> emitSignedInteger(
std::ostream&, const
Sawyer::Container::BitVector&, State&) const;
578 virtual
std::vector<
std::
string> emitInteger(
std::ostream&, const
Sawyer::Container::BitVector&, State&,
579 bool isSigned) const;
580 virtual
bool emitAddress(
std::ostream&, rose_addr_t, State&,
bool always=true) const;
581 virtual
bool emitAddress(
std::ostream&, const
Sawyer::Container::BitVector&, State&,
bool always=true) const;
582 virtual
void emitCommentBlock(
std::ostream&, const
std::
string&, State&, const
std::
string &prefix = ";;; ") const;
583 virtual
void emitTypeName(
std::ostream&,
SgAsmType*, State&) const;
585 virtual
void emitLinePrefix(
std::ostream&, State&) const;
595 virtual
void initializeState(State&) const;
602 virtual
void updateIntraFunctionArrows(State&) const;
607 static
std::
string leftJustify(const
std::
string&,
size_t nchars);
614 static
std::
string juxtaposeColumns(const
std::vector<
std::
string> &content, const
std::vector<
size_t> &minWidths,
615 const
std::vector<
std::pair<
std::
string,
std::
string> > &colorEscapes,
616 const
std::
string &columnSeparator = " ");
623 static
bool ascendingSourceAddress(Partitioner2::ControlFlowGraph::ConstEdgeIterator a,
624 Partitioner2::ControlFlowGraph::ConstEdgeIterator b);
631 static
bool ascendingTargetAddress(Partitioner2::ControlFlowGraph::ConstEdgeIterator a,
632 Partitioner2::ControlFlowGraph::ConstEdgeIterator b);
638 static
std::vector<Partitioner2::ControlFlowGraph::ConstEdgeIterator>
639 orderedBlockPredecessors(const Partitioner2::PartitionerConstPtr&, const Partitioner2::BasicBlockPtr&);
645 static
std::vector<Partitioner2::ControlFlowGraph::ConstEdgeIterator>
646 orderedBlockSuccessors(const Partitioner2::PartitionerConstPtr&, const Partitioner2::BasicBlockPtr&);
654 #ifdef ROSE_ENABLE_PYTHON_API
661 explicit PythonBase(
const Base::Ptr &base)
663 ASSERT_not_null(base);
667 return base_->unparse(p);
671 base_->unparse(std::cout, p);
void copy(const Word *src, const BitRange &srcRange, Word *dst, const BitRange &dstRange)
Copy some bits.
Base class for machine instructions.
ROSE_DLL_API Sawyer::Message::Facility mlog
Diagnostic facility for the ROSE library as a whole.
Holds a value or nothing.
void reset()
Reset as if default-constructed.
Sawyer::SharedPointer< RegisterDictionary > RegisterDictionaryPtr
Reference counting pointer.
Settings settings
Command-line settings for the rosebud tool.
Main namespace for the ROSE library.
Reason
Predefined bit flags for why something is reachable.
Name space for the entire library.
Sawyer::SharedPointer< Function > FunctionPtr
Shared-ownership pointer for Function.
Sawyer::SharedPointer< BasicBlock > BasicBlockPtr
Shared-ownersip pointer for BasicBlock.
ROSE_DLL_API void merge(SgProject *project)
Performs sharing of AST nodes followed by linking accross translation units.
void print(const StackVariables &, const Partitioner2::PartitionerConstPtr &, std::ostream &out, const std::string &prefix="")
Print info about multiple local variables.
BitFlags< Reason, uint32_t > ReasonFlags
Bit flags for reachability.
Sawyer::SharedPointer< const Partitioner > PartitionerConstPtr
Shared-ownership pointer for Partitioner.
Base class for expressions.
0x57: "Pop the top operand stack value"
Base class for binary types.
Base class for reference counted objects.
void initDiagnostics()
Initialize diagnostics.
Sawyer::SharedPointer< Node > Ptr
Reference counting pointer.
const char * Flags(int64_t)
Convert Rose::BinaryAnalysis::Unparser::ArrowMargin::Flags enum constant to a string.