Skip to content

Commit

Permalink
Sort blocks by offset/address, size, decode mode, and uuid
Browse files Browse the repository at this point in the history
  • Loading branch information
jranieri-grammatech committed Mar 20, 2024
1 parent 3c16547 commit 8e15e00
Show file tree
Hide file tree
Showing 11 changed files with 328 additions and 205 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
package versions and upgrading `gtirb` with `apt-get upgrade`.
* Fix performance issue when checking references of ProxyBlocks in Python API.
* Add elfSoname AuxData definition
* ByteInterval's blocks' sort order is now thoroughly defined: offset, size,
kind, decode mode, and UUID. Adjusting these properties during iteration may
cause blocks to be skipped or visited twice.

# 2.0.0

Expand Down
139 changes: 84 additions & 55 deletions include/gtirb/ByteInterval.hpp

Large diffs are not rendered by default.

6 changes: 5 additions & 1 deletion include/gtirb/CodeBlock.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,11 @@ class GTIRB_EXPORT_API CodeBlock : public CfgNode {
///
/// This field is used in some ISAs where it is used to
/// differentiate between sub-ISAs; ARM and Thumb, for example.
void setDecodeMode(gtirb::DecodeMode DM) { this->DecodeMode = DM; }
void setDecodeMode(gtirb::DecodeMode DM) {
DecodeMode = DM;
if (Observer)
Observer->decodeModeChange(this);
}

/// \brief Iterator over bytes in this block.
///
Expand Down
54 changes: 18 additions & 36 deletions include/gtirb/IR.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -777,36 +777,30 @@ class GTIRB_EXPORT_API IR : public AuxDataContainer {

/// \brief Iterator over blocks.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using block_iterator =
MergeSortedIterator<Module::block_iterator, BlockAddressLess>;
/// \brief Range of blocks.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using block_range = boost::iterator_range<block_iterator>;
/// \brief Sub-range of blocks overlapping an address or range of addreses.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using block_subrange = boost::iterator_range<
MergeSortedIterator<Module::block_subrange::iterator, BlockAddressLess>>;
/// \brief Iterator over blocks.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_block_iterator =
MergeSortedIterator<Module::const_block_iterator, BlockAddressLess>;
/// \brief Range of blocks.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_block_range = boost::iterator_range<const_block_iterator>;
/// \brief Sub-range of blocks overlapping an address or range of addreses.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_block_subrange = boost::iterator_range<MergeSortedIterator<
Module::const_block_subrange::iterator, BlockAddressLess>>;

Expand Down Expand Up @@ -952,39 +946,33 @@ class GTIRB_EXPORT_API IR : public AuxDataContainer {

/// \brief Iterator over \ref CodeBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using code_block_iterator =
MergeSortedIterator<Module::code_block_iterator, AddressLess>;
/// \brief Range of \ref CodeBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using code_block_range = boost::iterator_range<code_block_iterator>;
/// \brief Sub-range of \ref CodeBlock objects overlapping an address or range
/// of addreses.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using code_block_subrange = boost::iterator_range<
MergeSortedIterator<Module::code_block_subrange::iterator, AddressLess>>;
/// \brief Iterator over \ref CodeBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_code_block_iterator =
MergeSortedIterator<Module::const_code_block_iterator, AddressLess>;
/// \brief Range of \ref CodeBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_code_block_range =
boost::iterator_range<const_code_block_iterator>;
/// \brief Sub-range of \ref CodeBlock objects overlapping an address or range
/// of addreses.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_code_block_subrange = boost::iterator_range<MergeSortedIterator<
Module::const_code_block_subrange::iterator, AddressLess>>;

Expand Down Expand Up @@ -1130,39 +1118,33 @@ class GTIRB_EXPORT_API IR : public AuxDataContainer {

/// \brief Iterator over \ref DataBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using data_block_iterator =
MergeSortedIterator<Module::data_block_iterator, AddressLess>;
/// \brief Range of \ref DataBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using data_block_range = boost::iterator_range<data_block_iterator>;
/// \brief Sub-range of \ref DataBlock objects overlapping an address or range
/// of addreses.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using data_block_subrange = boost::iterator_range<
MergeSortedIterator<Module::data_block_subrange::iterator, AddressLess>>;
/// \brief Iterator over \ref DataBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_data_block_iterator =
MergeSortedIterator<Module::const_data_block_iterator, AddressLess>;
/// \brief Range of \ref DataBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_data_block_range =
boost::iterator_range<const_data_block_iterator>;
/// \brief Sub-range of \ref DataBlock objects overlapping an address or range
/// of addreses.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_data_block_subrange = boost::iterator_range<MergeSortedIterator<
Module::const_data_block_subrange::iterator, AddressLess>>;

Expand Down
51 changes: 17 additions & 34 deletions include/gtirb/Module.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1065,36 +1065,30 @@ class GTIRB_EXPORT_API Module : public AuxDataContainer {

/// \brief Iterator over blocks.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using block_iterator =
MergeSortedIterator<Section::block_iterator, BlockAddressLess>;
/// \brief Range of blocks.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using block_range = boost::iterator_range<block_iterator>;
/// \brief Sub-range of blocks overlapping an address or range of addreses.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using block_subrange = boost::iterator_range<
MergeSortedIterator<Section::block_subrange::iterator, BlockAddressLess>>;
/// \brief Iterator over blocks.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_block_iterator =
MergeSortedIterator<Section::const_block_iterator, BlockAddressLess>;
/// \brief Range of blocks.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_block_range = boost::iterator_range<const_block_iterator>;
/// \brief Sub-range of blocks overlapping an address or range of addreses.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_block_subrange = boost::iterator_range<MergeSortedIterator<
Section::const_block_subrange::iterator, BlockAddressLess>>;

Expand Down Expand Up @@ -1247,33 +1241,28 @@ class GTIRB_EXPORT_API Module : public AuxDataContainer {
MergeSortedIterator<Section::code_block_iterator, AddressLess>;
/// \brief Range of \ref CodeBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using code_block_range = boost::iterator_range<code_block_iterator>;
/// \brief Sub-range of \ref CodeBlock objects overlapping an address or range
/// of addreses.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using code_block_subrange = boost::iterator_range<
MergeSortedIterator<Section::code_block_subrange::iterator, AddressLess>>;
/// \brief Iterator over \ref CodeBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_code_block_iterator =
MergeSortedIterator<Section::const_code_block_iterator, AddressLess>;
/// \brief Range of \ref CodeBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_code_block_range =
boost::iterator_range<const_code_block_iterator>;
/// \brief Sub-range of \ref CodeBlock objects overlapping an address or range
/// of addreses.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_code_block_subrange = boost::iterator_range<MergeSortedIterator<
Section::const_code_block_subrange::iterator, AddressLess>>;

Expand Down Expand Up @@ -1432,39 +1421,33 @@ class GTIRB_EXPORT_API Module : public AuxDataContainer {

/// \brief Iterator over \ref DataBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using data_block_iterator =
MergeSortedIterator<Section::data_block_iterator, AddressLess>;
/// \brief Range of \ref DataBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using data_block_range = boost::iterator_range<data_block_iterator>;
/// \brief Sub-range of \ref DataBlock objects overlapping an address or range
/// of addreses.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using data_block_subrange = boost::iterator_range<
MergeSortedIterator<Section::data_block_subrange::iterator, AddressLess>>;
/// \brief Iterator over \ref DataBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_data_block_iterator =
MergeSortedIterator<Section::const_data_block_iterator, AddressLess>;
/// \brief Range of \ref DataBlock objects.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_data_block_range =
boost::iterator_range<const_data_block_iterator>;
/// \brief Sub-range of \ref DataBlock objects overlapping an address or range
/// of addreses.
///
/// Blocks are yielded in address order, ascending. If two blocks have the
/// same address, thier order is not specified.
/// Blocks are yielded in address order, ascending.
using const_data_block_subrange = boost::iterator_range<MergeSortedIterator<
Section::const_data_block_subrange::iterator, AddressLess>>;

Expand Down
Loading

0 comments on commit 8e15e00

Please sign in to comment.