1 //===- ExtractRanges.cpp ----------------------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #include "llvm/DebugInfo/GSYM/ExtractRanges.h"
10 #include "llvm/DebugInfo/GSYM/FileWriter.h"
11 #include "llvm/Support/DataExtractor.h"
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());
23 AddressRange
decodeRange(DataExtractor
&Data
, uint64_t BaseAddr
,
25 const uint64_t AddrOffset
= Data
.getULEB128(&Offset
);
26 const uint64_t Size
= Data
.getULEB128(&Offset
);
27 const uint64_t StartAddr
= BaseAddr
+ AddrOffset
;
29 return {StartAddr
, StartAddr
+ Size
};
32 void encodeRanges(const AddressRanges
&Ranges
, FileWriter
&O
,
34 O
.writeULEB(Ranges
.size());
37 for (auto Range
: Ranges
)
38 encodeRange(Range
, O
, BaseAddr
);
41 void decodeRanges(AddressRanges
&Ranges
, DataExtractor
&Data
, uint64_t BaseAddr
,
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
));
50 void skipRange(DataExtractor
&Data
, uint64_t &Offset
) {
51 Data
.getULEB128(&Offset
);
52 Data
.getULEB128(&Offset
);
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
);
64 raw_ostream
&operator<<(raw_ostream
&OS
, const AddressRange
&R
) {
65 return OS
<< '[' << HEX64(R
.start()) << " - " << HEX64(R
.end()) << ")";
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
) {