1 //===- ExtractRanges.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_GSYM_EXTRACTRANGES_H
10 #define LLVM_DEBUGINFO_GSYM_EXTRACTRANGES_H
11 
12 #include "llvm/ADT/AddressRanges.h"
13 #include "llvm/Support/Format.h"
14 #include "llvm/Support/raw_ostream.h"
15 #include <stdint.h>
16 #include <vector>
17 
18 #define HEX8(v) llvm::format_hex(v, 4)
19 #define HEX16(v) llvm::format_hex(v, 6)
20 #define HEX32(v) llvm::format_hex(v, 10)
21 #define HEX64(v) llvm::format_hex(v, 18)
22 
23 namespace llvm {
24 class DataExtractor;
25 class raw_ostream;
26 
27 namespace gsym {
28 
29 class FileWriter;
30 
31 /// AddressRange objects are encoded and decoded to be relative to a base
32 /// address. This will be the FunctionInfo's start address if the AddressRange
33 /// is directly contained in a FunctionInfo, or a base address of the
34 /// containing parent AddressRange or AddressRanges. This allows address
35 /// ranges to be efficiently encoded using ULEB128 encodings as we encode the
36 /// offset and size of each range instead of full addresses. This also makes
37 /// encoded addresses easy to relocate as we just need to relocate one base
38 /// address.
39 /// @{
40 AddressRange decodeRange(DataExtractor &Data, uint64_t BaseAddr,
41                          uint64_t &Offset);
42 void encodeRange(const AddressRange &Range, FileWriter &O, uint64_t BaseAddr);
43 /// @}
44 
45 /// Skip an address range object in the specified data a the specified
46 /// offset.
47 ///
48 /// \param Data The binary stream to read the data from.
49 ///
50 /// \param Offset The byte offset within \a Data.
51 void skipRange(DataExtractor &Data, uint64_t &Offset);
52 
53 /// Address ranges are decoded and encoded to be relative to a base address.
54 /// See the AddressRange comment for the encode and decode methods for full
55 /// details.
56 /// @{
57 void decodeRanges(AddressRanges &Ranges, DataExtractor &Data, uint64_t BaseAddr,
58                   uint64_t &Offset);
59 void encodeRanges(const AddressRanges &Ranges, FileWriter &O,
60                   uint64_t BaseAddr);
61 /// @}
62 
63 /// Skip an address range object in the specified data a the specified
64 /// offset.
65 ///
66 /// \param Data The binary stream to read the data from.
67 ///
68 /// \param Offset The byte offset within \a Data.
69 ///
70 /// \returns The number of address ranges that were skipped.
71 uint64_t skipRanges(DataExtractor &Data, uint64_t &Offset);
72 
73 } // namespace gsym
74 
75 raw_ostream &operator<<(raw_ostream &OS, const AddressRange &R);
76 
77 raw_ostream &operator<<(raw_ostream &OS, const AddressRanges &AR);
78 
79 } // namespace llvm
80 
81 #endif // LLVM_DEBUGINFO_GSYM_EXTRACTRANGES_H
82