1//===- DWARFAddressRange.h --------------------------------------*- 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#ifndef LLVM_DEBUGINFO_DWARF_DWARFADDRESSRANGE_H
10#define LLVM_DEBUGINFO_DWARF_DWARFADDRESSRANGE_H
11
12#include "llvm/DebugInfo/DIContext.h"
13#include <cstdint>
14#include <tuple>
15#include <vector>
16
17namespace llvm {
18
19class raw_ostream;
20class DWARFObject;
21
22struct DWARFAddressRange {
23 uint64_t LowPC;
24 uint64_t HighPC;
25 uint64_t SectionIndex;
26
27 DWARFAddressRange() = default;
28
29 /// Used for unit testing.
30 DWARFAddressRange(
31 uint64_t LowPC, uint64_t HighPC,
32 uint64_t SectionIndex = object::SectionedAddress::UndefSection)
33 : LowPC(LowPC), HighPC(HighPC), SectionIndex(SectionIndex) {}
34
35 /// Returns true if LowPC is smaller or equal to HighPC. This accounts for
36 /// dead-stripped ranges.
37 bool valid() const { return LowPC <= HighPC; }
38
39 /// Returns true if [LowPC, HighPC) intersects with [RHS.LowPC, RHS.HighPC).
40 bool intersects(const DWARFAddressRange &RHS) const {
41 assert(valid() && RHS.valid());
42 // Empty ranges can't intersect.
43 if (LowPC == HighPC || RHS.LowPC == RHS.HighPC)
44 return false;
45 return LowPC < RHS.HighPC && RHS.LowPC < HighPC;
46 }
47
48 /// Union two address ranges if they intersect.
49 ///
50 /// This function will union two address ranges if they intersect by
51 /// modifying this range to be the union of both ranges. If the two ranges
52 /// don't intersect this range will be left alone.
53 ///
54 /// \param RHS Another address range to combine with.
55 ///
56 /// \returns false if the ranges don't intersect, true if they do and the
57 /// ranges were combined.
58 bool merge(const DWARFAddressRange &RHS) {
59 if (!intersects(RHS))
60 return false;
61 LowPC = std::min<uint64_t>(LowPC, RHS.LowPC);
62 HighPC = std::max<uint64_t>(HighPC, RHS.HighPC);
63 return true;
64 }
65
66 void dump(raw_ostream &OS, uint32_t AddressSize, DIDumpOptions DumpOpts = {},
67 const DWARFObject *Obj = nullptr) const;
68};
69
70inline bool operator<(const DWARFAddressRange &LHS,
71 const DWARFAddressRange &RHS) {
72 return std::tie(LHS.LowPC, LHS.HighPC) < std::tie(RHS.LowPC, RHS.HighPC);
73}
74
75inline bool operator==(const DWARFAddressRange &LHS,
76 const DWARFAddressRange &RHS) {
77 return std::tie(LHS.LowPC, LHS.HighPC) == std::tie(RHS.LowPC, RHS.HighPC);
78}
79
80raw_ostream &operator<<(raw_ostream &OS, const DWARFAddressRange &R);
81
82/// DWARFAddressRangesVector - represents a set of absolute address ranges.
83using DWARFAddressRangesVector = std::vector<DWARFAddressRange>;
84
85} // end namespace llvm
86
87#endif // LLVM_DEBUGINFO_DWARF_DWARFADDRESSRANGE_H
88