ExtractRanges.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. #include "llvm/DebugInfo/GSYM/ExtractRanges.h"
  9. #include "llvm/DebugInfo/GSYM/FileWriter.h"
  10. #include "llvm/Support/DataExtractor.h"
  11. #include <algorithm>
  12. #include <inttypes.h>
  13. namespace llvm {
  14. namespace gsym {
  15. void encodeRange(const AddressRange &Range, FileWriter &O, uint64_t BaseAddr) {
  16. assert(Range.start() >= BaseAddr);
  17. O.writeULEB(Range.start() - BaseAddr);
  18. O.writeULEB(Range.size());
  19. }
  20. AddressRange decodeRange(DataExtractor &Data, uint64_t BaseAddr,
  21. uint64_t &Offset) {
  22. const uint64_t AddrOffset = Data.getULEB128(&Offset);
  23. const uint64_t Size = Data.getULEB128(&Offset);
  24. const uint64_t StartAddr = BaseAddr + AddrOffset;
  25. return {StartAddr, StartAddr + Size};
  26. }
  27. void encodeRanges(const AddressRanges &Ranges, FileWriter &O,
  28. uint64_t BaseAddr) {
  29. O.writeULEB(Ranges.size());
  30. if (Ranges.empty())
  31. return;
  32. for (auto Range : Ranges)
  33. encodeRange(Range, O, BaseAddr);
  34. }
  35. void decodeRanges(AddressRanges &Ranges, DataExtractor &Data, uint64_t BaseAddr,
  36. uint64_t &Offset) {
  37. Ranges.clear();
  38. uint64_t NumRanges = Data.getULEB128(&Offset);
  39. Ranges.reserve(NumRanges);
  40. for (uint64_t RangeIdx = 0; RangeIdx < NumRanges; RangeIdx++)
  41. Ranges.insert(decodeRange(Data, BaseAddr, Offset));
  42. }
  43. void skipRange(DataExtractor &Data, uint64_t &Offset) {
  44. Data.getULEB128(&Offset);
  45. Data.getULEB128(&Offset);
  46. }
  47. uint64_t skipRanges(DataExtractor &Data, uint64_t &Offset) {
  48. uint64_t NumRanges = Data.getULEB128(&Offset);
  49. for (uint64_t I = 0; I < NumRanges; ++I)
  50. skipRange(Data, Offset);
  51. return NumRanges;
  52. }
  53. } // namespace gsym
  54. raw_ostream &operator<<(raw_ostream &OS, const AddressRange &R) {
  55. return OS << '[' << HEX64(R.start()) << " - " << HEX64(R.end()) << ")";
  56. }
  57. raw_ostream &operator<<(raw_ostream &OS, const AddressRanges &AR) {
  58. size_t Size = AR.size();
  59. for (size_t I = 0; I < Size; ++I) {
  60. if (I)
  61. OS << ' ';
  62. OS << AR[I];
  63. }
  64. return OS;
  65. }
  66. } // namespace llvm