xref: /llvm-project/llvm/lib/DebugInfo/GSYM/ExtractRanges.cpp (revision 0060c54e0da6d1429875da2d30895faa7562b706)
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(Range.start() - BaseAddr);
20   O.writeULEB(Range.size());
21 }
22 
23 AddressRange decodeRange(DataExtractor &Data, uint64_t BaseAddr,
24                          uint64_t &Offset) {
25   const uint64_t AddrOffset = Data.getULEB128(&Offset);
26   const uint64_t Size = Data.getULEB128(&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(Ranges.size());
35   if (Ranges.empty())
36     return;
37   for (auto Range : Ranges)
38     encodeRange(Range, O, BaseAddr);
39 }
40 
41 void decodeRanges(AddressRanges &Ranges, DataExtractor &Data, uint64_t BaseAddr,
42                   uint64_t &Offset) {
43   Ranges.clear();
44   uint64_t NumRanges = Data.getULEB128(&Offset);
45   Ranges.reserve(NumRanges);
46   for (uint64_t RangeIdx = 0; RangeIdx < NumRanges; RangeIdx++)
47     Ranges.insert(decodeRange(Data, BaseAddr, Offset));
48 }
49 
50 void skipRange(DataExtractor &Data, uint64_t &Offset) {
51   Data.getULEB128(&Offset);
52   Data.getULEB128(&Offset);
53 }
54 
55 uint64_t skipRanges(DataExtractor &Data, uint64_t &Offset) {
56   uint64_t NumRanges = Data.getULEB128(&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