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