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"
18 void encodeRange(const AddressRange
&Range
, FileWriter
&O
, uint64_t BaseAddr
) {
19 assert(Range
.start() >= BaseAddr
);
20 O
.writeULEB(Range
.start() - BaseAddr
);
21 O
.writeULEB(Range
.size());
24 AddressRange
decodeRange(DataExtractor
&Data
, uint64_t BaseAddr
,
26 const uint64_t AddrOffset
= Data
.getULEB128(&Offset
);
27 const uint64_t Size
= Data
.getULEB128(&Offset
);
28 const uint64_t StartAddr
= BaseAddr
+ AddrOffset
;
30 return {StartAddr
, StartAddr
+ Size
};
33 void encodeRanges(const AddressRanges
&Ranges
, FileWriter
&O
,
35 O
.writeULEB(Ranges
.size());
38 for (auto Range
: Ranges
)
39 encodeRange(Range
, O
, BaseAddr
);
42 void decodeRanges(AddressRanges
&Ranges
, DataExtractor
&Data
, uint64_t BaseAddr
,
45 uint64_t NumRanges
= Data
.getULEB128(&Offset
);
46 Ranges
.reserve(NumRanges
);
47 for (uint64_t RangeIdx
= 0; RangeIdx
< NumRanges
; RangeIdx
++)
48 Ranges
.insert(decodeRange(Data
, BaseAddr
, Offset
));
51 void skipRange(DataExtractor
&Data
, uint64_t &Offset
) {
52 Data
.getULEB128(&Offset
);
53 Data
.getULEB128(&Offset
);
56 uint64_t skipRanges(DataExtractor
&Data
, uint64_t &Offset
) {
57 uint64_t NumRanges
= Data
.getULEB128(&Offset
);
58 for (uint64_t I
= 0; I
< NumRanges
; ++I
)
59 skipRange(Data
, Offset
);
65 raw_ostream
&operator<<(raw_ostream
&OS
, const AddressRange
&R
) {
66 return OS
<< '[' << HEX64(R
.start()) << " - " << HEX64(R
.end()) << ")";
69 raw_ostream
&operator<<(raw_ostream
&OS
, const AddressRanges
&AR
) {
70 size_t Size
= AR
.size();
71 for (size_t I
= 0; I
< Size
; ++I
) {