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();
42 ROSE_DEPRECATED(
"not called by anything");
99 std::vector<Style> stack_;
140 void merge(
const Style &style);
158 n_ = stack_.
push(style);
165 n_ = stack_.
push(first);
210 std::string nextInsnLabel_;
213 const Base &frontUnparser_;
214 std::vector<Reachability::ReasonFlags> cfgVertexReachability_;
219 bool cfgArrowsPointToInsns_;
221 bool isPostInstruction_ =
false;
356 const std::string& nextInsnLabel()
const;
357 void nextInsnLabel(
const std::string&);
365 bool isPostInstruction()
const;
366 void isPostInstruction(
bool);
435 virtual Ptr copy()
const = 0;
492 std::
string operator()(const Partitioner2::PartitionerConstPtr&,
SgAsmInstruction*) const ;
493 std::
string operator()(const Partitioner2::PartitionerConstPtr&,
SgAsmExpression*) const ;
494 std::
string operator()(const Partitioner2::PartitionerConstPtr&, const Partitioner2::BasicBlockPtr&) const ;
495 std::
string operator()(const Partitioner2::PartitionerConstPtr&, const Partitioner2::DataBlockPtr&) const ;
496 std::
string operator()(const Partitioner2::PartitionerConstPtr&, const Partitioner2::FunctionPtr&) const ;
509 void unparse(std::ostream&, const Partitioner2::PartitionerConstPtr&, const Partitioner2::BasicBlockPtr&) const ;
510 void unparse(std::ostream&, const Partitioner2::PartitionerConstPtr&, const Partitioner2::DataBlockPtr&) const ;
511 void unparse(std::ostream&, const Partitioner2::PartitionerConstPtr&, const Partitioner2::FunctionPtr&) const ;
518 std::
string unparse(const Partitioner2::PartitionerConstPtr&, const Partitioner2::BasicBlockPtr&) const ;
519 std::
string unparse(const Partitioner2::PartitionerConstPtr&, const Partitioner2::DataBlockPtr&) const ;
520 std::
string unparse(const Partitioner2::PartitionerConstPtr&, const Partitioner2::FunctionPtr&) const ;
602#ifdef ROSE_ENABLE_ASM_AARCH32
605#ifdef ROSE_ENABLE_ASM_AARCH64
606 virtual std::vector<std::string> emitAarch64AtOperand(std::ostream&, SgAsmAarch64AtOperand*,
State&)
const;
607 virtual std::vector<std::string> emitAarch64BarrierOperand(std::ostream&, SgAsmAarch64BarrierOperand*,
State&)
const;
608 virtual std::vector<std::string> emitAarch64CImmediateOperand(std::ostream&, SgAsmAarch64CImmediateOperand*,
State&)
const;
609 virtual std::vector<std::string> emitAarch64PrefetchOperand(std::ostream&, SgAsmAarch64PrefetchOperand*,
State&)
const;
610 virtual std::vector<std::string> emitAarch64PState(std::ostream&, SgAsmAarch64PState*,
State&)
const;
611 virtual std::vector<std::string> emitAarch64SysMoveOperand(std::ostream&, SgAsmAarch64SysMoveOperand*,
State&)
const;
646 bool isSigned)
const;
674 static std::string
leftJustify(
const std::string&,
size_t nchars);
681 static std::string
juxtaposeColumns(
const std::vector<std::string> &content,
const std::vector<size_t> &minWidths,
682 const std::vector<std::pair<std::string, std::string> > &colorEscapes,
683 const std::string &columnSeparator =
" ");
691 Partitioner2::ControlFlowGraph::ConstEdgeIterator b);
699 Partitioner2::ControlFlowGraph::ConstEdgeIterator b);
705 static std::vector<Partitioner2::ControlFlowGraph::ConstEdgeIterator>
712 static std::vector<Partitioner2::ControlFlowGraph::ConstEdgeIterator>
720#ifdef ROSE_ENABLE_PYTHON_API
727 explicit PythonBase(
const Base::Ptr &base)
729 ASSERT_not_null(base);
732 std::string unparse(
const Partitioner2::PartitionerConstPtr &p)
const {
733 return base_->unparse(p);
736 void print(
const Partitioner2::PartitionerConstPtr &p)
const {
737 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.
Sawyer::Optional< EdgeArrows::EndpointId > latestEntity
Latest pointable entity that was encountered in the output.
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.
EdgeArrows arrows
The arrows to be displayed.
std::string render(Sawyer::Optional< EdgeArrows::EndpointId > currentEntity)
Generate the string to print in the margin.
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 std::vector< std::string > emitExprListExp(std::ostream &, SgAsmExprListExp *, State &) const
Mid-level unparser function.
virtual std::vector< std::string > emitBinaryPreupdate(std::ostream &, SgAsmBinaryPreupdate *, State &) const
Mid-level unparser function.
virtual Settings & settings()=0
Property: Settings associated with this unparser.
virtual std::vector< std::string > emitBinaryDivide(std::ostream &, SgAsmBinaryDivide *, State &) const
Mid-level unparser function.
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 std::vector< std::string > emitFloatValueExpression(std::ostream &, SgAsmFloatValueExpression *, State &) const
Mid-level unparser function.
virtual std::vector< std::string > emitIntegerValueExpression(std::ostream &, SgAsmIntegerValueExpression *, State &) const
Mid-level unparser function.
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 bool emitAddress(std::ostream &, const Sawyer::Container::BitVector &, State &, bool always=true) const
Mid-level unparser function.
virtual std::vector< std::string > emitInteger(std::ostream &, const Sawyer::Container::BitVector &, State &, bool isSigned) const
Mid-level unparser function.
virtual std::vector< std::string > emitBinaryMod(std::ostream &, SgAsmBinaryMod *, State &) const
Mid-level unparser function.
virtual std::vector< std::string > emitBinaryMultiply(std::ostream &, SgAsmBinaryMultiply *, State &) const
Mid-level unparser function.
void operator()(std::ostream &, const Partitioner2::PartitionerConstPtr &, SgAsmExpression *) const
Emit the entity to an output stream.
virtual std::vector< std::string > emitBinarySubtract(std::ostream &, SgAsmBinarySubtract *, State &) const
Mid-level unparser function.
virtual std::vector< std::string > emitUnaryUnsignedExtend(std::ostream &, SgAsmUnaryUnsignedExtend *, State &) const
Mid-level unparser function.
virtual std::vector< std::string > emitUnaryMinus(std::ostream &, SgAsmUnaryMinus *, State &) 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 std::vector< std::string > emitBinaryMsl(std::ostream &, SgAsmBinaryMsl *, State &) const
Mid-level unparser function.
virtual void emitInstructionFrameDelta(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 std::vector< std::string > emitUnaryTruncate(std::ostream &, SgAsmUnaryTruncate *, State &) const
Mid-level unparser function.
virtual void emitFunctionCallingConvention(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
virtual std::vector< std::string > emitBinaryLsl(std::ostream &, SgAsmBinaryLsl *, 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.
virtual std::vector< std::string > emitIndirectRegisterExpression(std::ostream &, SgAsmIndirectRegisterExpression *, State &) const
Mid-level unparser function.
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 std::vector< std::string > emitMemoryReferenceExpression(std::ostream &, SgAsmMemoryReferenceExpression *, 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 std::vector< std::string > emitBinaryPostupdate(std::ostream &, SgAsmBinaryPostupdate *, 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.
virtual std::vector< std::string > emitBinaryAsr(std::ostream &, SgAsmBinaryAsr *, State &) const
Mid-level unparser function.
virtual std::vector< std::string > emitRiscOperation(std::ostream &, SgAsmRiscOperation *, State &) const
Mid-level unparser function.
virtual std::vector< std::string > emitBinaryAdd(std::ostream &, SgAsmBinaryAdd *, 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.
virtual std::vector< std::string > emitUnarySignedExtend(std::ostream &, SgAsmUnarySignedExtend *, 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.
virtual std::vector< std::string > emitBinaryConcat(std::ostream &, SgAsmBinaryConcat *, State &) const
Mid-level unparser function.
void unparse(std::ostream &, const Partitioner2::PartitionerConstPtr &, const Progress::Ptr &=Progress::Ptr()) const
High-level unparsing function.
virtual std::vector< std::string > emitBinaryLsr(std::ostream &, SgAsmBinaryLsr *, State &) const
Mid-level unparser 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 std::vector< std::string > emitDirectRegisterExpression(std::ostream &, SgAsmDirectRegisterExpression *, State &) const
Mid-level unparser function.
virtual void emitFunctionBody(std::ostream &, const Partitioner2::FunctionPtr &, State &) const
Mid-level unparser function.
virtual std::vector< std::string > emitBinaryRor(std::ostream &, SgAsmBinaryRor *, 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 std::vector< std::string > emitStackExpression(std::ostream &, SgAsmStackExpression *, State &) const
Mid-level unparser function.
virtual void emitInstructionSemantics(std::ostream &, SgAsmInstruction *, State &) const
Mid-level unparser function.
virtual std::vector< std::string > emitRegisterNames(std::ostream &, SgAsmRegisterNames *, 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 std::vector< std::string > emitUnaryPlus(std::ostream &, SgAsmUnaryPlus *, 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.
virtual std::vector< std::string > emitByteOrder(std::ostream &, SgAsmByteOrder *, State &) const
Mid-level unparser function.
Renders textual margin arrows.
void reset()
Reset the analysis.
bool cfgArrowsPointToInsns() const
Property: Whether CFG margin arrows point to instructions.
void currentPredSuccId(Sawyer::Optional< EdgeArrows::EndpointId > id)
Property: ID for CFG edge arrow endpoint.
const std::vector< Reachability::ReasonFlags > cfgVertexReachability() const
Property: Reachability analysis results.
Sawyer::Optional< EdgeArrows::EndpointId > currentPredSuccId() const
Property: ID for CFG edge arrow endpoint.
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 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.
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.
Operand referencing a Co-processor.
Expression that adds two operands.
Expression that performs an arithmetic, sign-bit preserving right shift.
Expression that concatenates two values to form a wider value.
Expression that divides the first operand by the second.
Expression that performs a logical left shift operation.
Expression that performs a logical, sign-bit non-preserving right shift.
Expression that returns the remainder when dividing the first operand by the second.
Expression that performs a logical left shift operation filling low-order bits with one.
Expression that multiplies two operands.
Expression that represents an update to a storage location.
Expression that represents an update to a storage location.
Expression that performs a right rotate.
Expression that subtracts the second operand from the first.
Byte order specification.
Expression representing a machine register.
List of expression nodes.
Base class for expressions.
Registers accessed indirectly.
Base class for machine instructions.
Base class for integer values.
Reference to memory locations.
An ordered list of registers.
Static representation of instruction semantics.
Base class for references to a machine register.
Base class for binary types.
Expression represting negation.
Expression representing a (no-op) unary plus operation.
Expression representing sign extending.
Expression representing truncation.
Expression representing unsigned extending.
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.