//===- AddressRanges.cpp ----------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/ADT/AddressRanges.h" #include "llvm/ADT/STLExtras.h" #include using namespace llvm; AddressRanges::Collection::const_iterator AddressRanges::insert(AddressRange Range) { if (Range.size() == 0) return Ranges.end(); auto It = llvm::upper_bound(Ranges, Range); auto It2 = It; while (It2 != Ranges.end() && It2->start() <= Range.end()) ++It2; if (It != It2) { Range = {Range.start(), std::max(Range.end(), std::prev(It2)->end())}; It = Ranges.erase(It, It2); } 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); } 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; }); if (It == Ranges.begin()) return Ranges.end(); --It; if (Addr >= It->end()) return Ranges.end(); return It; } AddressRanges::Collection::const_iterator AddressRanges::find(AddressRange Range) const { if (Range.size() == 0) 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 Ranges.end(); --It; if (Range.end() > It->end()) return Ranges.end(); return It; }