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