1 | //===- ExtractRanges.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/DebugInfo/GSYM/ExtractRanges.h" |
10 | #include "llvm/DebugInfo/GSYM/FileWriter.h" |
11 | #include "llvm/Support/DataExtractor.h" |
12 | #include <inttypes.h> |
13 | |
14 | namespace llvm { |
15 | namespace gsym { |
16 | |
17 | void encodeRange(const AddressRange &Range, FileWriter &O, uint64_t BaseAddr) { |
18 | assert(Range.start() >= BaseAddr); |
19 | O.writeULEB(Value: Range.start() - BaseAddr); |
20 | O.writeULEB(Value: Range.size()); |
21 | } |
22 | |
23 | AddressRange (DataExtractor &Data, uint64_t BaseAddr, |
24 | uint64_t &Offset) { |
25 | const uint64_t AddrOffset = Data.getULEB128(offset_ptr: &Offset); |
26 | const uint64_t Size = Data.getULEB128(offset_ptr: &Offset); |
27 | const uint64_t StartAddr = BaseAddr + AddrOffset; |
28 | |
29 | return {StartAddr, StartAddr + Size}; |
30 | } |
31 | |
32 | void encodeRanges(const AddressRanges &Ranges, FileWriter &O, |
33 | uint64_t BaseAddr) { |
34 | O.writeULEB(Value: Ranges.size()); |
35 | if (Ranges.empty()) |
36 | return; |
37 | for (auto Range : Ranges) |
38 | encodeRange(Range, O, BaseAddr); |
39 | } |
40 | |
41 | void (AddressRanges &Ranges, DataExtractor &Data, uint64_t BaseAddr, |
42 | uint64_t &Offset) { |
43 | Ranges.clear(); |
44 | uint64_t NumRanges = Data.getULEB128(offset_ptr: &Offset); |
45 | Ranges.reserve(Capacity: NumRanges); |
46 | for (uint64_t RangeIdx = 0; RangeIdx < NumRanges; RangeIdx++) |
47 | Ranges.insert(Range: decodeRange(Data, BaseAddr, Offset)); |
48 | } |
49 | |
50 | void (DataExtractor &Data, uint64_t &Offset) { |
51 | Data.getULEB128(offset_ptr: &Offset); |
52 | Data.getULEB128(offset_ptr: &Offset); |
53 | } |
54 | |
55 | uint64_t (DataExtractor &Data, uint64_t &Offset) { |
56 | uint64_t NumRanges = Data.getULEB128(offset_ptr: &Offset); |
57 | for (uint64_t I = 0; I < NumRanges; ++I) |
58 | skipRange(Data, Offset); |
59 | return NumRanges; |
60 | } |
61 | |
62 | } // namespace gsym |
63 | |
64 | raw_ostream &operator<<(raw_ostream &OS, const AddressRange &R) { |
65 | return OS << '[' << HEX64(R.start()) << " - " << HEX64(R.end()) << ")" ; |
66 | } |
67 | |
68 | raw_ostream &operator<<(raw_ostream &OS, const AddressRanges &AR) { |
69 | size_t Size = AR.size(); |
70 | for (size_t I = 0; I < Size; ++I) { |
71 | if (I) |
72 | OS << ' '; |
73 | OS << AR[I]; |
74 | } |
75 | return OS; |
76 | } |
77 | |
78 | } // namespace llvm |
79 | |