brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 6fe92be Raw
79 lines · cpp
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-exception6//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 14namespace llvm {15namespace gsym {16 17void 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 23AddressRange 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 32void 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 41void 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 50void skipRange(DataExtractor &Data, uint64_t &Offset) {51  Data.getULEB128(&Offset);52  Data.getULEB128(&Offset);53}54 55uint64_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 gsym63 64raw_ostream &operator<<(raw_ostream &OS, const AddressRange &R) {65  return OS << '[' << HEX64(R.start()) << " - " << HEX64(R.end()) << ")";66}67 68raw_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 llvm79