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/MemoryBuffer.h" 23 #include "llvm/Support/ScopedPrinter.h" 24 #include <string> 25 #include <vector> 26 27 namespace llvm { 28 namespace logicalview { 29 30 using LVReaders = std::vector<LVReader *>; 31 using ArgVector = std::vector<std::string>; 32 using PdbOrObj = PointerUnion<object::ObjectFile *, pdb::PDBFile *>; 33 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 47 Error createReaders(); 48 void destroyReaders(); 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 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 63 Error createReader(StringRef Filename, LVReaders &Readers, PdbOrObj &Input, 64 StringRef FileFormatName, StringRef ExePath = {}); 65 66 public: 67 LVReaderHandler() = delete; 68 LVReaderHandler(ArgVector &Objects, ScopedPrinter &W, 69 LVOptions &ReaderOptions) 70 : Objects(Objects), W(W), OS(W.getOStream()) { 71 setOptions(&ReaderOptions); 72 } 73 LVReaderHandler(const LVReaderHandler &) = delete; 74 LVReaderHandler &operator=(const LVReaderHandler &) = delete; 75 ~LVReaderHandler() { destroyReaders(); } 76 77 Error createReader(StringRef Filename, LVReaders &Readers) { 78 return handleFile(Readers, Filename); 79 } 80 Error process(); 81 82 Expected<LVReader *> createReader(StringRef Pathname) { 83 LVReaders Readers; 84 if (Error Err = createReader(Pathname, Readers)) 85 return std::move(Err); 86 return Readers[0]; 87 } 88 void deleteReader(LVReader *Reader) { delete Reader; } 89 90 void print(raw_ostream &OS) const; 91 92 #if !defined(NDEBUG) || defined(LLVM_ENABLE_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