1 //===- AddressRanges.cpp ----------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/ADT/AddressRanges.h" 10 #include "llvm/ADT/STLExtras.h" 11 #include <inttypes.h> 12 13 using namespace llvm; 14 15 void AddressRanges::insert(AddressRange Range) { 16 if (Range.size() == 0) 17 return; 18 19 auto It = llvm::upper_bound(Ranges, Range); 20 auto It2 = It; 21 while (It2 != Ranges.end() && It2->start() < Range.end()) 22 ++It2; 23 if (It != It2) { 24 Range = {Range.start(), std::max(Range.end(), It2[-1].end())}; 25 It = Ranges.erase(It, It2); 26 } 27 if (It != Ranges.begin() && Range.start() < It[-1].end()) 28 It[-1] = {It[-1].start(), std::max(It[-1].end(), Range.end())}; 29 else 30 Ranges.insert(It, Range); 31 } 32 33 bool AddressRanges::contains(uint64_t Addr) const { 34 auto It = std::partition_point( 35 Ranges.begin(), Ranges.end(), 36 [=](const AddressRange &R) { return R.start() <= Addr; }); 37 return It != Ranges.begin() && Addr < It[-1].end(); 38 } 39 40 bool AddressRanges::contains(AddressRange Range) const { 41 if (Range.size() == 0) 42 return false; 43 auto It = std::partition_point( 44 Ranges.begin(), Ranges.end(), 45 [=](const AddressRange &R) { return R.start() <= Range.start(); }); 46 if (It == Ranges.begin()) 47 return false; 48 return Range.end() <= It[-1].end(); 49 } 50 51 Optional<AddressRange> 52 AddressRanges::getRangeThatContains(uint64_t Addr) const { 53 auto It = std::partition_point( 54 Ranges.begin(), Ranges.end(), 55 [=](const AddressRange &R) { return R.start() <= Addr; }); 56 if (It != Ranges.begin() && Addr < It[-1].end()) 57 return It[-1]; 58 return llvm::None; 59 } 60