156 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===- InputFile.h -------------------------------------------- *- C++ --*-===//
 | |
| //
 | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | |
| // See https://llvm.org/LICENSE.txt for license information.
 | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef LLVM_TOOLS_LLVMPDBDUMP_INPUTFILE_H
 | |
| #define LLVM_TOOLS_LLVMPDBDUMP_INPUTFILE_H
 | |
| 
 | |
| #include "llvm/ADT/Optional.h"
 | |
| #include "llvm/ADT/PointerUnion.h"
 | |
| #include "llvm/ADT/StringMap.h"
 | |
| #include "llvm/ADT/iterator.h"
 | |
| #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
 | |
| #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
 | |
| #include "llvm/DebugInfo/PDB/Native/ModuleDebugStream.h"
 | |
| #include "llvm/Object/Binary.h"
 | |
| #include "llvm/Object/ObjectFile.h"
 | |
| #include "llvm/Support/Error.h"
 | |
| 
 | |
| namespace llvm {
 | |
| namespace codeview {
 | |
| class LazyRandomTypeCollection;
 | |
| }
 | |
| namespace object {
 | |
| class COFFObjectFile;
 | |
| class SectionRef;
 | |
| } // namespace object
 | |
| 
 | |
| namespace pdb {
 | |
| class InputFile;
 | |
| class LinePrinter;
 | |
| class PDBFile;
 | |
| class NativeSession;
 | |
| class SymbolGroupIterator;
 | |
| class SymbolGroup;
 | |
| 
 | |
| class InputFile {
 | |
|   InputFile();
 | |
| 
 | |
|   std::unique_ptr<NativeSession> PdbSession;
 | |
|   object::OwningBinary<object::Binary> CoffObject;
 | |
|   std::unique_ptr<MemoryBuffer> UnknownFile;
 | |
|   PointerUnion<PDBFile *, object::COFFObjectFile *, MemoryBuffer *> PdbOrObj;
 | |
| 
 | |
|   using TypeCollectionPtr = std::unique_ptr<codeview::LazyRandomTypeCollection>;
 | |
| 
 | |
|   TypeCollectionPtr Types;
 | |
|   TypeCollectionPtr Ids;
 | |
| 
 | |
|   enum TypeCollectionKind { kTypes, kIds };
 | |
|   codeview::LazyRandomTypeCollection &
 | |
|   getOrCreateTypeCollection(TypeCollectionKind Kind);
 | |
| 
 | |
| public:
 | |
|   ~InputFile();
 | |
|   InputFile(InputFile &&Other) = default;
 | |
| 
 | |
|   static Expected<InputFile> open(StringRef Path,
 | |
|                                   bool AllowUnknownFile = false);
 | |
| 
 | |
|   PDBFile &pdb();
 | |
|   const PDBFile &pdb() const;
 | |
|   object::COFFObjectFile &obj();
 | |
|   const object::COFFObjectFile &obj() const;
 | |
|   MemoryBuffer &unknown();
 | |
|   const MemoryBuffer &unknown() const;
 | |
| 
 | |
|   StringRef getFilePath() const;
 | |
| 
 | |
|   bool hasTypes() const;
 | |
|   bool hasIds() const;
 | |
| 
 | |
|   codeview::LazyRandomTypeCollection &types();
 | |
|   codeview::LazyRandomTypeCollection &ids();
 | |
| 
 | |
|   iterator_range<SymbolGroupIterator> symbol_groups();
 | |
|   SymbolGroupIterator symbol_groups_begin();
 | |
|   SymbolGroupIterator symbol_groups_end();
 | |
| 
 | |
|   bool isPdb() const;
 | |
|   bool isObj() const;
 | |
|   bool isUnknown() const;
 | |
| };
 | |
| 
 | |
| class SymbolGroup {
 | |
|   friend class SymbolGroupIterator;
 | |
| 
 | |
| public:
 | |
|   explicit SymbolGroup(InputFile *File, uint32_t GroupIndex = 0);
 | |
| 
 | |
|   Expected<StringRef> getNameFromStringTable(uint32_t Offset) const;
 | |
| 
 | |
|   void formatFromFileName(LinePrinter &Printer, StringRef File,
 | |
|                           bool Append = false) const;
 | |
| 
 | |
|   void formatFromChecksumsOffset(LinePrinter &Printer, uint32_t Offset,
 | |
|                                  bool Append = false) const;
 | |
| 
 | |
|   StringRef name() const;
 | |
| 
 | |
|   codeview::DebugSubsectionArray getDebugSubsections() const {
 | |
|     return Subsections;
 | |
|   }
 | |
|   const ModuleDebugStreamRef &getPdbModuleStream() const;
 | |
| 
 | |
|   const InputFile &getFile() const { return *File; }
 | |
|   InputFile &getFile() { return *File; }
 | |
| 
 | |
|   bool hasDebugStream() const { return DebugStream != nullptr; }
 | |
| 
 | |
| private:
 | |
|   void initializeForPdb(uint32_t Modi);
 | |
|   void updatePdbModi(uint32_t Modi);
 | |
|   void updateDebugS(const codeview::DebugSubsectionArray &SS);
 | |
| 
 | |
|   void rebuildChecksumMap();
 | |
|   InputFile *File = nullptr;
 | |
|   StringRef Name;
 | |
|   codeview::DebugSubsectionArray Subsections;
 | |
|   std::shared_ptr<ModuleDebugStreamRef> DebugStream;
 | |
|   codeview::StringsAndChecksumsRef SC;
 | |
|   StringMap<codeview::FileChecksumEntry> ChecksumsByFile;
 | |
| };
 | |
| 
 | |
| class SymbolGroupIterator
 | |
|     : public iterator_facade_base<SymbolGroupIterator,
 | |
|                                   std::forward_iterator_tag, SymbolGroup> {
 | |
| public:
 | |
|   SymbolGroupIterator();
 | |
|   explicit SymbolGroupIterator(InputFile &File);
 | |
|   SymbolGroupIterator(const SymbolGroupIterator &Other) = default;
 | |
|   SymbolGroupIterator &operator=(const SymbolGroupIterator &R) = default;
 | |
| 
 | |
|   const SymbolGroup &operator*() const;
 | |
|   SymbolGroup &operator*();
 | |
| 
 | |
|   bool operator==(const SymbolGroupIterator &R) const;
 | |
|   SymbolGroupIterator &operator++();
 | |
| 
 | |
| private:
 | |
|   void scanToNextDebugS();
 | |
|   bool isEnd() const;
 | |
| 
 | |
|   uint32_t Index = 0;
 | |
|   Optional<object::section_iterator> SectionIter;
 | |
|   SymbolGroup Value;
 | |
| };
 | |
| 
 | |
| } // namespace pdb
 | |
| } // namespace llvm
 | |
| 
 | |
| #endif
 |