LVReaderHandler.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #pragma once
  2. #ifdef __GNUC__
  3. #pragma GCC diagnostic push
  4. #pragma GCC diagnostic ignored "-Wunused-parameter"
  5. #endif
  6. //===-- LVReaderHandler.h ---------------------------------------*- C++ -*-===//
  7. //
  8. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  9. // See https://llvm.org/LICENSE.txt for license information.
  10. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  11. //
  12. //===----------------------------------------------------------------------===//
  13. //
  14. // This class implements the Reader handler.
  15. //
  16. //===----------------------------------------------------------------------===//
  17. #ifndef LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVREADERHANDLER_H
  18. #define LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVREADERHANDLER_H
  19. #include "llvm/ADT/PointerUnion.h"
  20. #include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
  21. #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
  22. #include "llvm/Object/Archive.h"
  23. #include "llvm/Object/MachOUniversal.h"
  24. #include "llvm/Object/ObjectFile.h"
  25. #include "llvm/Support/MemoryBuffer.h"
  26. #include "llvm/Support/ScopedPrinter.h"
  27. #include <string>
  28. #include <vector>
  29. namespace llvm {
  30. namespace logicalview {
  31. using LVReaders = std::vector<LVReader *>;
  32. using ArgVector = std::vector<std::string>;
  33. using PdbOrObj = PointerUnion<object::ObjectFile *, pdb::PDBFile *>;
  34. // This class performs the following tasks:
  35. // - Creates a logical reader for every binary file in the command line,
  36. // that parses the debug information and creates a high level logical
  37. // view representation containing scopes, symbols, types and lines.
  38. // - Prints and compares the logical views.
  39. //
  40. // The supported binary formats are: ELF, Mach-O and CodeView.
  41. class LVReaderHandler {
  42. ArgVector &Objects;
  43. ScopedPrinter &W;
  44. raw_ostream &OS;
  45. LVReaders TheReaders;
  46. Error createReaders();
  47. void destroyReaders();
  48. Error printReaders();
  49. Error compareReaders();
  50. Error handleArchive(LVReaders &Readers, StringRef Filename,
  51. object::Archive &Arch);
  52. Error handleBuffer(LVReaders &Readers, StringRef Filename,
  53. MemoryBufferRef Buffer, StringRef ExePath = {});
  54. Error handleFile(LVReaders &Readers, StringRef Filename,
  55. StringRef ExePath = {});
  56. Error handleMach(LVReaders &Readers, StringRef Filename,
  57. object::MachOUniversalBinary &Mach);
  58. Error handleObject(LVReaders &Readers, StringRef Filename,
  59. object::Binary &Binary);
  60. Error createReader(StringRef Filename, LVReaders &Readers, PdbOrObj &Input,
  61. StringRef FileFormatName, StringRef ExePath = {});
  62. public:
  63. LVReaderHandler() = delete;
  64. LVReaderHandler(ArgVector &Objects, ScopedPrinter &W,
  65. LVOptions &ReaderOptions)
  66. : Objects(Objects), W(W), OS(W.getOStream()) {
  67. setOptions(&ReaderOptions);
  68. }
  69. LVReaderHandler(const LVReaderHandler &) = delete;
  70. LVReaderHandler &operator=(const LVReaderHandler &) = delete;
  71. ~LVReaderHandler() { destroyReaders(); }
  72. Error createReader(StringRef Filename, LVReaders &Readers) {
  73. return handleFile(Readers, Filename);
  74. }
  75. Error process();
  76. Expected<LVReader *> createReader(StringRef Pathname) {
  77. LVReaders Readers;
  78. if (Error Err = createReader(Pathname, Readers))
  79. return std::move(Err);
  80. return Readers[0];
  81. }
  82. void deleteReader(LVReader *Reader) { delete Reader; }
  83. void print(raw_ostream &OS) const;
  84. #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
  85. void dump() const { print(dbgs()); }
  86. #endif
  87. };
  88. } // end namespace logicalview
  89. } // namespace llvm
  90. #endif // LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVREADERHANDLER_H
  91. #ifdef __GNUC__
  92. #pragma GCC diagnostic pop
  93. #endif