diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Support/AddressRanges.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Support/AddressRanges.cpp | 57 |
1 files changed, 34 insertions, 23 deletions
diff --git a/contrib/llvm-project/llvm/lib/Support/AddressRanges.cpp b/contrib/llvm-project/llvm/lib/Support/AddressRanges.cpp index 5ba011bac4e9..187d5be00dae 100644 --- a/contrib/llvm-project/llvm/lib/Support/AddressRanges.cpp +++ b/contrib/llvm-project/llvm/lib/Support/AddressRanges.cpp @@ -12,48 +12,59 @@ using namespace llvm; -void AddressRanges::insert(AddressRange Range) { +AddressRanges::Collection::const_iterator +AddressRanges::insert(AddressRange Range) { if (Range.size() == 0) - return; + return Ranges.end(); auto It = llvm::upper_bound(Ranges, Range); auto It2 = It; - while (It2 != Ranges.end() && It2->start() < Range.end()) + while (It2 != Ranges.end() && It2->start() <= Range.end()) ++It2; if (It != It2) { - Range = {Range.start(), std::max(Range.end(), It2[-1].end())}; + Range = {Range.start(), std::max(Range.end(), std::prev(It2)->end())}; It = Ranges.erase(It, It2); } - if (It != Ranges.begin() && Range.start() < It[-1].end()) - It[-1] = {It[-1].start(), std::max(It[-1].end(), Range.end())}; - else - Ranges.insert(It, Range); + if (It != Ranges.begin() && Range.start() <= std::prev(It)->end()) { + --It; + *It = {It->start(), std::max(It->end(), Range.end())}; + return It; + } + + return Ranges.insert(It, Range); } -bool AddressRanges::contains(uint64_t Addr) const { +AddressRanges::Collection::const_iterator +AddressRanges::find(uint64_t Addr) const { auto It = std::partition_point( Ranges.begin(), Ranges.end(), [=](const AddressRange &R) { return R.start() <= Addr; }); - return It != Ranges.begin() && Addr < It[-1].end(); + + if (It == Ranges.begin()) + return Ranges.end(); + + --It; + if (Addr >= It->end()) + return Ranges.end(); + + return It; } -bool AddressRanges::contains(AddressRange Range) const { +AddressRanges::Collection::const_iterator +AddressRanges::find(AddressRange Range) const { if (Range.size() == 0) - return false; + return Ranges.end(); + auto It = std::partition_point( Ranges.begin(), Ranges.end(), [=](const AddressRange &R) { return R.start() <= Range.start(); }); + if (It == Ranges.begin()) - return false; - return Range.end() <= It[-1].end(); -} + return Ranges.end(); -Optional<AddressRange> -AddressRanges::getRangeThatContains(uint64_t Addr) const { - auto It = std::partition_point( - Ranges.begin(), Ranges.end(), - [=](const AddressRange &R) { return R.start() <= Addr; }); - if (It != Ranges.begin() && Addr < It[-1].end()) - return It[-1]; - return llvm::None; + --It; + if (Range.end() > It->end()) + return Ranges.end(); + + return It; } |