xref: /freebsd/contrib/llvm-project/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===-- LVReaderHandler.h ---------------------------------------*- 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 // This class implements the Reader handler.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVREADERHANDLER_H
14 #define LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVREADERHANDLER_H
15 
16 #include "llvm/ADT/PointerUnion.h"
17 #include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
18 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
19 #include "llvm/Object/Archive.h"
20 #include "llvm/Object/MachOUniversal.h"
21 #include "llvm/Object/ObjectFile.h"
22 #include "llvm/Support/Compiler.h"
23 #include "llvm/Support/MemoryBuffer.h"
24 #include "llvm/Support/ScopedPrinter.h"
25 #include <string>
26 #include <vector>
27 
28 namespace llvm {
29 namespace logicalview {
30 
31 using LVReaders = std::vector<std::unique_ptr<LVReader>>;
32 using ArgVector = std::vector<std::string>;
33 using PdbOrObj = PointerUnion<object::ObjectFile *, pdb::PDBFile *>;
34 
35 // This class performs the following tasks:
36 // - Creates a logical reader for every binary file in the command line,
37 //   that parses the debug information and creates a high level logical
38 //   view representation containing scopes, symbols, types and lines.
39 // - Prints and compares the logical views.
40 //
41 // The supported binary formats are: ELF, Mach-O and CodeView.
42 class LVReaderHandler {
43   ArgVector &Objects;
44   ScopedPrinter &W;
45   raw_ostream &OS;
46   LVReaders TheReaders;
47 
48   Error createReaders();
49   Error printReaders();
50   Error compareReaders();
51 
52   Error handleArchive(LVReaders &Readers, StringRef Filename,
53                       object::Archive &Arch);
54   Error handleBuffer(LVReaders &Readers, StringRef Filename,
55                      MemoryBufferRef Buffer, StringRef ExePath = {});
56   LLVM_ABI Error handleFile(LVReaders &Readers, StringRef Filename,
57                             StringRef ExePath = {});
58   Error handleMach(LVReaders &Readers, StringRef Filename,
59                    object::MachOUniversalBinary &Mach);
60   Error handleObject(LVReaders &Readers, StringRef Filename,
61                      object::Binary &Binary);
62   Error handleObject(LVReaders &Readers, StringRef Filename, StringRef Buffer,
63                      StringRef ExePath);
64 
65   Error createReader(StringRef Filename, LVReaders &Readers, PdbOrObj &Input,
66                      StringRef FileFormatName, StringRef ExePath = {});
67 
68 public:
69   LVReaderHandler() = delete;
LVReaderHandler(ArgVector & Objects,ScopedPrinter & W,LVOptions & ReaderOptions)70   LVReaderHandler(ArgVector &Objects, ScopedPrinter &W,
71                   LVOptions &ReaderOptions)
72       : Objects(Objects), W(W), OS(W.getOStream()) {
73     setOptions(&ReaderOptions);
74   }
75   LVReaderHandler(const LVReaderHandler &) = delete;
76   LVReaderHandler &operator=(const LVReaderHandler &) = delete;
77 
createReader(StringRef Filename,LVReaders & Readers)78   Error createReader(StringRef Filename, LVReaders &Readers) {
79     return handleFile(Readers, Filename);
80   }
81   LLVM_ABI Error process();
82 
createReader(StringRef Pathname)83   Expected<std::unique_ptr<LVReader>> createReader(StringRef Pathname) {
84     LVReaders Readers;
85     if (Error Err = createReader(Pathname, Readers))
86       return std::move(Err);
87     return std::move(Readers[0]);
88   }
89 
90   LLVM_ABI void print(raw_ostream &OS) const;
91 
92 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump()93   void dump() const { print(dbgs()); }
94 #endif
95 };
96 
97 } // end namespace logicalview
98 } // namespace llvm
99 
100 #endif // LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVREADERHANDLER_H
101