1 #ifndef ROSE_BinaryAnalysis_Partitioner2_AddressUsageMap_H
2 #define ROSE_BinaryAnalysis_Partitioner2_AddressUsageMap_H
3 #include <featureTests.h>
4 #ifdef ROSE_ENABLE_BINARY_ANALYSIS
5 #include <Rose/BinaryAnalysis/Partitioner2/BasicTypes.h>
7 #include <Sawyer/IntervalMap.h>
8 #include <Sawyer/IntervalSet.h>
9 #include <Sawyer/Optional.h>
11 #include <boost/serialization/access.hpp>
12 #include <boost/serialization/vector.hpp>
19 namespace BinaryAnalysis {
20 namespace Partitioner2 {
33 std::vector<BasicBlockPtr> bblocks_;
36 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
38 friend class boost::serialization::access;
41 void serialize(S &s,
const unsigned version) {
42 s & BOOST_SERIALIZATION_NVP(insn_);
43 s & BOOST_SERIALIZATION_NVP(bblocks_);
45 ASSERT_not_reachable(
"Rose::BinaryAnalysis::Partitioner2::AddressUser version 0 no longer supported");
47 s & BOOST_SERIALIZATION_NVP(dblock_);
101 const std::vector<BasicBlockPtr>&
basicBlocks()
const;
137 void print(std::ostream&)
const;
147 operator bool()
const {
163 std::vector<AddressUser> users_;
165 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
167 friend class boost::serialization::access;
170 void serialize(S &s,
const unsigned ) {
171 s & BOOST_SERIALIZATION_NVP(users_);
300 template<
class UserPredicate>
305 retval.users_.push_back(user);
362 void print(std::ostream&)
const;
384 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
386 friend class boost::serialization::access;
389 void serialize(S &s,
const unsigned ) {
390 s & BOOST_SERIALIZATION_NVP(map_);
429 bool exists(rose_addr_t)
const;
561 template<
class UserPredicate>
567 retval = 0==nIters++ ? users : retval.
intersection(users);
586 template<
class UserPredicate>
590 retval.
insert(node.value().select(userPredicate));
621 void print(std::ostream&,
const std::string &prefix=
"")
const;
SgAsmInstruction * instructionExists(SgAsmInstruction *) const
Determines whether the specified instruction or an equivalent exists.
AddressUser insertDataBlock(const DataBlockPtr &)
Insert the data block.
void insertBasicBlock(const BasicBlockPtr &bblock)
Add another basic block to the set of basic blocks.
std::vector< SgAsmInstruction * > instructions() const
Returns all instructions.
size_t size() const
Number of addresses represented by the map.
bool isEmpty() const
Determines whether this address user list is empty.
void insert(const AddressUsers &)
Insert one set of address users into another.
DataBlockPtr dataBlock() const
Returns the data block.
static bool selectDataBlocks(const AddressUser &)
Selector to select data blocks.
AddressUsers overlapping(const AddressInterval &) const
Users that overlap the interval.
void clear()
Reset map to initial empty state.
AddressUser findBasicBlock(const BasicBlockPtr &) const
Find an AddressUser record for the specified basic block, or equivalent.
BasicBlockPtr isBlockEntry() const
Determines if this user is a first instruction of a basic block.
AddressUser()
Default constructed user is empty.
rose_addr_t address() const
Address of user.
Base class for machine instructions.
BasicBlockPtr basicBlockExists(const BasicBlockPtr &) const
Determine if a basic block exists.
AddressUser insertInstruction(SgAsmInstruction *, const BasicBlockPtr &)
Insert an instruction/basic block pair.
static bool selectBasicBlocks(const AddressUser &)
Selector to select instructions and basic blocks.
void print(std::ostream &, const std::string &prefix="") const
Dump the contents of this AUM to a stream.
AddressUsers union_(const AddressUsers &) const
Computes the union of this list with another.
DataBlockPtr dataBlockExists(const DataBlockPtr &) const
Determines if a data block exists.
AddressUsers spanning(const AddressInterval &interval, UserPredicate userPredicate) const
Find address users that span the entire interval.
Main namespace for the ROSE library.
List of virtual address users.
const std::vector< AddressUser > & addressUsers() const
Return all address users.
AddressUsers()
Constructs an empty list.
SgAsmInstruction * eraseInstruction(SgAsmInstruction *, const BasicBlockPtr &)
Remove the specified instruction/basic block pair.
bool isConsistent() const
Perform logic consistency checks.
AddressInterval nextUnused(rose_addr_t minVa) const
Next unused address interval.
AddressUser findDataBlock(const DataBlockPtr &) const
Find an AddressUser record for the specified data block, or equivalent.
bool isBasicBlock() const
Predicate returning true if user is a basic block or instruction.
std::vector< DataBlockPtr > dataBlocks() const
Returns all data blocks.
SgAsmInstruction * insn() const
Return the instruction.
AddressUsers overlapping(const AddressInterval &interval, UserPredicate userPredicate) const
Users that overlap the interval.
AddressUsers instructionUsers() const
Returns all instruction users.
bool operator==(const AddressUsers &other) const
True if two lists are equal.
AddressUser findBasicBlock(const BasicBlockPtr &) const
Find an AddressUser record for the specified basic block, or equivalent.
void print(std::ostream &) const
Prints pairs space separated on a single line.
void eraseBasicBlock(const BasicBlockPtr &bblock)
Remove a basic block from the set of basic blocks.
void print(std::ostream &) const
Print the pair on one line.
AddressIntervalSet unusedExtent(size_t nBits) const
Addresses not represented.
BasicBlockPtr basicBlockExists(const BasicBlockPtr &) const
Determines whether the specified basic block or an equivalent exists.
void checkConsistency() const
Check invariants.
bool isDataBlock() const
Predicate returning true if user is a data block.
const std::vector< BasicBlockPtr > & basicBlocks() const
Returns all basic blocks to which this instruction belongs.
AddressInterval hull() const
Minimum and maximum used addresses.
SgAsmInstruction * instructionExists(SgAsmInstruction *) const
Determines whether the specified instruction or an equivalent exists.
BasicBlockPtr firstBasicBlock() const
Returns an arbitrary basic block.
boost::iterator_range< NodeIterator > findAll(const Interval &interval)
Finds all nodes overlapping the specified interval.
bool operator<(const AddressUser &) const
Compare two users for sorting.
Sawyer::Optional< rose_addr_t > leastUnmapped(rose_addr_t startVa) const
Returns the least unmapped address with specified lower limit.
DataBlockPtr dataBlockExists(const DataBlockPtr &) const
Determines whether the specified data block or an equivalent exists.
AddressUsers select(UserPredicate predicate) const
Selects certain users from a list.
bool exists(rose_addr_t) const
Predicate to determine whether an address is used.
DataBlockPtr eraseDataBlock(const DataBlockPtr &)
Remove the specified data block.
AddressUser findInstruction(SgAsmInstruction *) const
Find an AddressUser record for the specified instruction, or equivalent.
AddressUser findDataBlock(const DataBlockPtr &) const
Find an AddressUser record for the specified data block, or equivalent.
SgAsmInstruction * eraseInstruction(SgAsmInstruction *, const BasicBlockPtr &)
Erase an instruction/basic block pair from this list.
AddressUsers intersection(const AddressUsers &) const
Computes the intersection of this list with another.
AddressIntervalSet extent() const
Addresses represented.
bool isEmpty() const
True if this object was default constructed.
bool operator==(const AddressUser &other) const
Compare two users for equality.
AddressUser findInstruction(SgAsmInstruction *) const
Find an AddressUser record for the specified instruction, or equivalent.
bool isEmpty() const
Determines whether a map is empty.
bool anyExists(const AddressInterval &) const
Predicate to determine whether any of the specified addresses are used.
std::vector< BasicBlockPtr > instructionOwners() const
Returns all basic blocks.
size_t size() const
Number of address users.
static bool selectAllUsers(const AddressUser &)
Selector to select all users.
bool isConsistent() const
Check logical consistency.
AddressUsers dataBlockUsers() const
Returns all data block users.
AddressUsers spanning(const AddressInterval &) const
Find address users that span the entire interval.
AddressUser insertInstruction(SgAsmInstruction *, const BasicBlockPtr &)
Insert the instruction along with an owning basic block.
DataBlockPtr eraseDataBlock(const DataBlockPtr &)
Erase a data block from this list.
AddressUsers containedIn(const AddressInterval &) const
Users that are fully contained in the interval.
AddressUser insertDataBlock(const DataBlockPtr &)
Insert a data block.