- //===- ExtractRanges.h ------------------------------------------*- C++ -*-===// 
- // 
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
- // See https://llvm.org/LICENSE.txt for license information. 
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
- // 
- //===----------------------------------------------------------------------===// 
-   
- #ifndef LLVM_DEBUGINFO_GSYM_EXTRACTRANGES_H 
- #define LLVM_DEBUGINFO_GSYM_EXTRACTRANGES_H 
-   
- #include "llvm/ADT/AddressRanges.h" 
- #include "llvm/Support/Format.h" 
- #include "llvm/Support/raw_ostream.h" 
- #include <stdint.h> 
- #include <vector> 
-   
- #define HEX8(v) llvm::format_hex(v, 4) 
- #define HEX16(v) llvm::format_hex(v, 6) 
- #define HEX32(v) llvm::format_hex(v, 10) 
- #define HEX64(v) llvm::format_hex(v, 18) 
-   
- namespace llvm { 
- class DataExtractor; 
- class raw_ostream; 
-   
- namespace gsym { 
-   
- class FileWriter; 
-   
- /// AddressRange objects are encoded and decoded to be relative to a base 
- /// address. This will be the FunctionInfo's start address if the AddressRange 
- /// is directly contained in a FunctionInfo, or a base address of the 
- /// containing parent AddressRange or AddressRanges. This allows address 
- /// ranges to be efficiently encoded using ULEB128 encodings as we encode the 
- /// offset and size of each range instead of full addresses. This also makes 
- /// encoded addresses easy to relocate as we just need to relocate one base 
- /// address. 
- /// @{ 
- AddressRange decodeRange(DataExtractor &Data, uint64_t BaseAddr, 
-                          uint64_t &Offset); 
- void encodeRange(const AddressRange &Range, FileWriter &O, uint64_t BaseAddr); 
- /// @} 
-   
- /// Skip an address range object in the specified data a the specified 
- /// offset. 
- /// 
- /// \param Data The binary stream to read the data from. 
- /// 
- /// \param Offset The byte offset within \a Data. 
- void skipRange(DataExtractor &Data, uint64_t &Offset); 
-   
- /// Address ranges are decoded and encoded to be relative to a base address. 
- /// See the AddressRange comment for the encode and decode methods for full 
- /// details. 
- /// @{ 
- void decodeRanges(AddressRanges &Ranges, DataExtractor &Data, uint64_t BaseAddr, 
-                   uint64_t &Offset); 
- void encodeRanges(const AddressRanges &Ranges, FileWriter &O, 
-                   uint64_t BaseAddr); 
- /// @} 
-   
- /// Skip an address range object in the specified data a the specified 
- /// offset. 
- /// 
- /// \param Data The binary stream to read the data from. 
- /// 
- /// \param Offset The byte offset within \a Data. 
- /// 
- /// \returns The number of address ranges that were skipped. 
- uint64_t skipRanges(DataExtractor &Data, uint64_t &Offset); 
-   
- } // namespace gsym 
-   
- raw_ostream &operator<<(raw_ostream &OS, const AddressRange &R); 
-   
- raw_ostream &operator<<(raw_ostream &OS, const AddressRanges &AR); 
-   
- } // namespace llvm 
-   
- #endif // LLVM_DEBUGINFO_GSYM_EXTRACTRANGES_H 
-