Branch: refs/heads/bbiiggppiigg/faster-getgaprange
Home: https://github.com/dyninst/dyninst
Commit: ae083283867450f2ef0261d2e3ca4db8d3b7e7b1
https://github.com/dyninst/dyninst/commit/ae083283867450f2ef0261d2e3ca4db8d3b7e7b1
Author: wuxx1279 <bbiiggppiigg@xxxxxxxxx>
Date: 2026-06-12 (Fri, 12 Jun 2026)
Changed paths:
M common/h/IBSTree-fast.h
Log Message:
-----------
common: fix IBSTree_fast::successor assert on coincident-start intervals
IBSTree_fast::successor() called the overlapping-interval tree's scalar
IBSTree::successor(X), which asserts the successor of a point is unique
(out.size() <= 1). That holds for the original caller, blocksByRange (basic
blocks have unique start addresses), but not in general: intervals can share
a start address -- e.g. FuncExtents of identical-code-folded or aliased
functions begin at the same address. When getGapRange() began querying
funcsByRange.successor() during speculative gap parsing, such a coincident
start made the overlapping tree return >1 candidate and aborted the rewrite
(observed on an ICF-heavy shared library; data-dependent, hence latent).
Use the set-returning overlapping_intervals.successor(X, set) and keep the
smallest-low() candidate. That is the true successor and collapses any
coincident-start ties to a single result, so the scalar IBSTree_fast wrapper
still sees at most one. No behavior change for unique-start trees (the set
has <= 1 element); blocksByRange/get_next_block is unaffected.
Co-Authored-By: Claude Opus 4.8 <noreply@xxxxxxxxxxxxx>
To unsubscribe from these emails, change your notification settings at https://github.com/dyninst/dyninst/settings/notifications
|