1 #ifndef ROSE_BinaryAnalysis_CallingConvention_H
2 #define ROSE_BinaryAnalysis_CallingConvention_H
3 #include <featureTests.h>
4 #ifdef ROSE_ENABLE_BINARY_ANALYSIS
6 #include <Rose/BinaryAnalysis/BasicTypes.h>
7 #include <Rose/BinaryAnalysis/ConcreteLocation.h>
8 #include <Rose/BinaryAnalysis/Disassembler/BasicTypes.h>
9 #include <Rose/BinaryAnalysis/InstructionSemantics/BaseSemantics.h>
10 #include <Rose/BinaryAnalysis/Partitioner2/BasicTypes.h>
11 #include <Rose/BinaryAnalysis/RegisterParts.h>
12 #include <Rose/BinaryAnalysis/Variables.h>
14 #include <boost/serialization/access.hpp>
15 #include <boost/serialization/set.hpp>
16 #include <boost/serialization/string.hpp>
17 #include <boost/serialization/vector.hpp>
18 #include <boost/serialization/version.hpp>
19 #include <Sawyer/SharedObject.h>
20 #include <Sawyer/SharedPointer.h>
26 namespace BinaryAnalysis {
29 namespace Disassembler {
43 namespace CallingConvention {
94 size_t wordWidth_ = 0;
96 std::vector<ConcreteLocation> nonParameterInputs_;
97 std::vector<ConcreteLocation> inputParameters_;
98 std::vector<ConcreteLocation> outputParameters_;
101 size_t nonParameterStackSize_ = 0;
102 size_t stackAlignment_ = 0;
106 std::set<RegisterDescriptor> calleeSavedRegisters_;
107 std::set<RegisterDescriptor> scratchRegisters_;
111 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
113 friend class boost::serialization::access;
116 void serialize(S &s,
const unsigned version) {
117 s & BOOST_SERIALIZATION_NVP(name_);
118 s & BOOST_SERIALIZATION_NVP(comment_);
119 s & BOOST_SERIALIZATION_NVP(wordWidth_);
120 s & BOOST_SERIALIZATION_NVP(regDict_);
121 s & BOOST_SERIALIZATION_NVP(inputParameters_);
122 s & BOOST_SERIALIZATION_NVP(outputParameters_);
123 s & BOOST_SERIALIZATION_NVP(stackParameterOrder_);
124 s & BOOST_SERIALIZATION_NVP(stackPointerRegister_);
125 s & BOOST_SERIALIZATION_NVP(nonParameterStackSize_);
126 s & BOOST_SERIALIZATION_NVP(stackAlignment_);
127 s & BOOST_SERIALIZATION_NVP(stackDirection_);
128 s & BOOST_SERIALIZATION_NVP(stackCleanup_);
129 s & BOOST_SERIALIZATION_NVP(thisParameter_);
130 s & BOOST_SERIALIZATION_NVP(calleeSavedRegisters_);
131 s & BOOST_SERIALIZATION_NVP(scratchRegisters_);
133 s & BOOST_SERIALIZATION_NVP(returnAddressLocation_);
134 s & BOOST_SERIALIZATION_NVP(instructionPointerRegister_);
200 const std::string&
name()
const {
return name_; }
201 void name(
const std::string &s) { name_ = s; }
211 const std::string&
comment()
const {
return comment_; }
212 void comment(
const std::string &s) { comment_ = s; }
226 ASSERT_require2(nBits > 0 && 0 == (nBits & 7),
"word size must be a positive multiple of eight");
246 nonParameterInputs_.clear();
256 const std::vector<ConcreteLocation>&
inputParameters()
const {
return inputParameters_; }
292 const std::vector<ConcreteLocation>&
outputParameters()
const {
return outputParameters_; }
356 return nonParameterStackSize_;
359 nonParameterStackSize_ = nBytes;
488 void print(std::ostream&)
const;
549 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
551 friend class boost::serialization::access;
554 void serialize(S &s,
const unsigned ) {
555 s & BOOST_SERIALIZATION_NVP(cpu_);
556 s & BOOST_SERIALIZATION_NVP(regDict_);
557 s & BOOST_SERIALIZATION_NVP(defaultCc_);
558 s & BOOST_SERIALIZATION_NVP(hasResults_);
559 s & BOOST_SERIALIZATION_NVP(didConverge_);
560 s & BOOST_SERIALIZATION_NVP(restoredRegisters_);
561 s & BOOST_SERIALIZATION_NVP(inputRegisters_);
562 s & BOOST_SERIALIZATION_NVP(outputRegisters_);
563 s & BOOST_SERIALIZATION_NVP(inputStackParameters_);
564 s & BOOST_SERIALIZATION_NVP(outputStackParameters_);
565 s & BOOST_SERIALIZATION_NVP(stackDelta_);
688 Dictionary
match(
const Dictionary&)
const;
694 void print(std::ostream&,
bool multiLine=
false)
const;
746 std::ostream&
operator<<(std::ostream&,
const Definition&);
void thisParameter(rose_addr_t va)
Property: Object pointer parameter.
size_t wordWidth() const
Property: Word size in bits.
const Dictionary & dictionaryX86()
Common calling conventions for 32-bit x86.
The called function pops all stack parameters.
Stack parameter order is unknown or unspecified.
void analyzeFunction(const Partitioner2::PartitionerConstPtr &, const Sawyer::SharedPointer< Partitioner2::Function > &)
Analyze one function.
StackParameterOrder stackParameterOrder() const
Property: Stack parameter order.
size_t stackAlignment() const
Property: Stack alignment.
void writeArgument(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr &, const Definition::Ptr &, size_t argNumber, const InstructionSemantics::BaseSemantics::SValuePtr &value)
Write a function argument to a semantic state.
const Dictionary & dictionaryM68k()
Common calling conventions for m68k.
static Ptr x86_fastcall(const RegisterDictionaryPtr &)
Constructs a new pre-defined calling convention based on a register dictionary.
static Ptr x86_cdecl(const RegisterDictionaryPtr &)
Constructs a new pre-defined calling convention based on a register dictionary.
Analysis()
Default constructor.
StackDirection stackDirection() const
Property: Direction that stack grows for a push operation.
std::vector< ConcreteLocation > & nonParameterInputs()
Non-parameter inputs.
const Variables::StackVariables & outputStackParameters() const
Output stack parameters.
void wordWidth(size_t nBits)
Property: Word size in bits.
void stackDirection(StackDirection x)
Property: Direction that stack grows for a push operation.
static Ptr x86_32bit_cdecl()
Returns a predefined, cached calling convention.
Stack parameters pushed right to left (C order).
void appendOutputParameter(rose_addr_t va)
Append output parameter.
boost::shared_ptr< RiscOperators > RiscOperatorsPtr
Shared-ownership pointer to a RISC operators object.
const Dictionary & dictionaryAarch64()
Common calling conventions for ARM AArch64.
static Ptr x86_32bit_stdcall()
Allocating constructor.
static Ptr ppc_32bit_ibm()
Allocating constructor.
void thisParameter(RegisterDescriptor reg, int64_t offset)
Property: Object pointer parameter.
A push increments the stack pointer.
const Dictionary & dictionaryPowerpc64()
Common calling conventions for PowerPC-64.
const std::vector< ConcreteLocation > & inputParameters() const
Property: Enumerated input parameters.
Stack parameters pushed left to right (Pascal order).
StackDirection
The direction in which the stack grows.
const Dictionary & dictionaryAmd64()
Common calling conventions for amd64 (x86-64).
Function calling convention.
void appendInputParameter(rose_addr_t va)
Append input parameter.
Definition::Ptr defaultCallingConvention() const
Property: Default calling convention.
void thisParameter(RegisterDescriptor reg)
Property: Object pointer parameter.
void stackCleanup(StackCleanup x)
Property: Who pops stack parameters.
Main namespace for the ROSE library.
RegisterParts inputRegisterParts() const
Compute the set of input registers.
RegisterParts scratchRegisterParts() const
Computes the set of scratch registers.
Holds a set of registers without regard for register boundaries.
StackCleanup stackCleanup() const
Property: Who pops stack parameters.
Sawyer::Optional< int64_t > stackDelta() const
Concrete stack delta.
void print(std::ostream &) const
Print detailed information about this calling convention.
RegisterDictionaryPtr registerDictionary() const
Property: Register dictionary.
boost::shared_ptr< State > StatePtr
Shared-ownership pointer to a semantic state.
bool hasResults() const
Whether a function has been analyzed.
boost::shared_ptr< Dispatcher > DispatcherPtr
Shared-ownership pointer to a semantics instruction dispatcher.
Sawyer::SharedPointer< Definition > DefinitionPtr
Reference counting pointer.
const std::vector< ConcreteLocation > & outputParameters() const
Property: List of output parameters.
void comment(const std::string &s)
Property: Full name of calling convention.
const RegisterParts & calleeSavedRegisters() const
Callee-saved registers.
void stackParameterOrder(StackParameterOrder x)
Property: Stack parameter order.
const RegisterParts & inputRegisters() const
Input registers.
void print(std::ostream &, bool multiLine=false) const
Print information about the analysis results.
const ConcreteLocation & returnAddressLocation() const
Property: Location of return address.
void instructionPointerRegister(RegisterDescriptor x)
Property: Register that points to next instruction to execute.
const Dictionary & dictionaryPowerpc32()
Common calling conventions for PowerPC-32.
std::vector< Definition::Ptr > Dictionary
A ordered collection of calling convention definitions.
const Dictionary & dictionaryMips()
Common calling conventions for MIPS.
Concrete location of data.
Stack parameter cleanup is unknown or unspecified.
const Variables::StackVariables & inputStackParameters() const
Input stack parameters.
const std::set< RegisterDescriptor > & calleeSavedRegisters() const
Property: Callee-saved registers.
Describes (part of) a physical CPU register.
void appendInputParameter(RegisterDescriptor reg)
Append input parameter.
DefinitionPtr Ptr
Reference counting pointer to calling convention definition.
void nonParameterStackSize(size_t nBytes)
Property: Size of non-parameter stack area.
StackParameterOrder
The order that arguments are pushed onto the stack.
bool didConverge() const
Whether the analysis results are valid.
Information about calling conventions.
std::set< RegisterDescriptor > & scratchRegisters()
Property: Scratch registers.
Sawyer::Message::Facility mlog
Facility for diagnostic output.
void clearOutputParameters()
Erase output parameters.
void appendInputParameter(RegisterDescriptor reg, int64_t offset)
Append input parameter.
~Definition()
Allocating constructor.
size_t nonParameterStackSize() const
Property: Size of non-parameter stack area.
RegisterDictionaryPtr registerDictionary() const
Property: Register dictionary.
RegisterParts outputRegisterParts() const
Computes the set of output registers.
bool match(const Definition::Ptr &) const
Determine whether a definition matches.
void appendOutputParameter(const ConcreteLocation &)
Append output parameter.
const RegisterDescriptor stackPointerRegister() const
Property: Register for implied stack parameters.
RegisterParts getUsedRegisterParts() const
Returns all registers mentioned in this definition.
const RegisterParts & outputRegisters() const
Output registers.
InstructionSemantics::BaseSemantics::SValuePtr readReturnValue(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr &, const Definition::Ptr &)
Read the return value that a function is returning.
static Ptr x86_64bit_cdecl()
Allocating constructor.
void name(const std::string &s)
Property: Short name of calling convention.
InstructionSemantics::BaseSemantics::SValuePtr readArgument(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr &, const Definition::Ptr &, size_t argNumber)
Read a function argument from a semantic state.
StackCleanup
Who is responsible for popping stack parameters.
static Ptr x86_stdcall(const RegisterDictionaryPtr &)
Constructs a new pre-defined calling convention based on a register dictionary.
A push decrements the stack pointer.
Base class for reference counted objects.
void clearNonResults()
Clears everything but results.
void initDiagnostics()
Initialize diagnostics.
void simulateFunctionReturn(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr &, const Definition::Ptr &)
Simulate a function return.
void clearResults()
Clear analysis results.
static Ptr instance(size_t wordWidth, const std::string &name, const std::string &comment, const RegisterDictionaryPtr ®s)
Allocating constructor.
void writeReturnValue(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr &, const Definition::Ptr &, const InstructionSemantics::BaseSemantics::SValuePtr &returnValue)
Write a value to a function return semantic state.
Definition()
Default constructor.
const ConcreteLocation & thisParameter() const
Property: Object pointer parameter.
void clearInputParameters()
Erase enumerated input parameters.
void appendOutputParameter(RegisterDescriptor reg)
Append output parameter.
const std::string & name() const
Property: Short name of calling convention.
void stackAlignment(size_t nBytes)
Property: Stack alignment.
RegisterDescriptor instructionPointerRegister() const
Property: Register that points to next instruction to execute.
const Dictionary & dictionaryAarch32()
Common calling conventions for ARM AArch32.
const std::vector< ConcreteLocation > & nonParameterInputs() const
Non-parameter inputs.
void clearParameters()
Erase all parameters.
The caller pops all stack parameters.
RegisterParts calleeSavedRegisterParts() const
Compute the set of callee-saved registers.
void defaultCallingConvention(const Definition::Ptr &x)
Property: Default calling convention.
const std::string & comment() const
Property: Full name of calling convention.
const std::set< RegisterDescriptor > & scratchRegisters() const
Property: Scratch registers.
static Ptr x86_32bit_fastcall()
Allocating constructor.
void thisParameter(const ConcreteLocation &x)
Property: Object pointer parameter.
static Ptr x86_64bit_sysv()
Allocating constructor.
static Ptr x86_64bit_stdcall()
Allocating constructor.
void returnAddressLocation(const ConcreteLocation &x)
Property: Location of return address.
std::ostream & operator<<(std::ostream &, const Definition &)
Print a definition.
static Ptr ppc_ibm(const RegisterDictionaryPtr &)
Constructs a new pre-defined calling convention based on a register dictionary.
std::set< RegisterDescriptor > & calleeSavedRegisters()
Property: Callee-saved registers.
Virtual base class for instruction disassemblers.
void appendInputParameter(const ConcreteLocation &)
Append input parameter.
void stackPointerRegister(RegisterDescriptor r)
Property: Register for implied stack parameters.
void appendOutputParameter(RegisterDescriptor reg, int64_t offset)
Append output parameter.