Home | History | Annotate | Line # | Download | only in Native
      1 //===- TpiStreamBuilder.h - PDB Tpi Stream Creation -------------*- 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 #ifndef LLVM_DEBUGINFO_PDB_NATIVE_TPISTREAMBUILDER_H
     10 #define LLVM_DEBUGINFO_PDB_NATIVE_TPISTREAMBUILDER_H
     11 
     12 #include "llvm/ADT/Optional.h"
     13 #include "llvm/DebugInfo/CodeView/TypeRecord.h"
     14 #include "llvm/DebugInfo/PDB/Native/RawConstants.h"
     15 #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
     16 #include "llvm/Support/Allocator.h"
     17 #include "llvm/Support/BinaryByteStream.h"
     18 #include "llvm/Support/BinaryItemStream.h"
     19 #include "llvm/Support/BinaryStreamRef.h"
     20 #include "llvm/Support/Error.h"
     21 
     22 #include <vector>
     23 
     24 namespace llvm {
     25 class BinaryByteStream;
     26 class WritableBinaryStreamRef;
     27 
     28 template <> struct BinaryItemTraits<llvm::codeview::CVType> {
     29   static size_t length(const codeview::CVType &Item) { return Item.length(); }
     30   static ArrayRef<uint8_t> bytes(const codeview::CVType &Item) {
     31     return Item.data();
     32   }
     33 };
     34 
     35 namespace codeview {
     36 class TypeRecord;
     37 }
     38 namespace msf {
     39 class MSFBuilder;
     40 struct MSFLayout;
     41 }
     42 namespace pdb {
     43 class PDBFile;
     44 class TpiStream;
     45 struct TpiStreamHeader;
     46 
     47 class TpiStreamBuilder {
     48 public:
     49   explicit TpiStreamBuilder(msf::MSFBuilder &Msf, uint32_t StreamIdx);
     50   ~TpiStreamBuilder();
     51 
     52   TpiStreamBuilder(const TpiStreamBuilder &) = delete;
     53   TpiStreamBuilder &operator=(const TpiStreamBuilder &) = delete;
     54 
     55   void setVersionHeader(PdbRaw_TpiVer Version);
     56   void addTypeRecord(ArrayRef<uint8_t> Type, Optional<uint32_t> Hash);
     57   void addTypeRecords(ArrayRef<uint8_t> Types, ArrayRef<uint16_t> Sizes,
     58                       ArrayRef<uint32_t> Hashes);
     59 
     60   Error finalizeMsfLayout();
     61 
     62   uint32_t getRecordCount() const { return TypeRecordCount; }
     63 
     64   Error commit(const msf::MSFLayout &Layout, WritableBinaryStreamRef Buffer);
     65 
     66   uint32_t calculateSerializedLength();
     67 
     68 private:
     69   void updateTypeIndexOffsets(ArrayRef<uint16_t> Sizes);
     70 
     71   uint32_t calculateHashBufferSize() const;
     72   uint32_t calculateIndexOffsetSize() const;
     73   Error finalize();
     74 
     75   msf::MSFBuilder &Msf;
     76   BumpPtrAllocator &Allocator;
     77 
     78   uint32_t TypeRecordCount = 0;
     79   size_t TypeRecordBytes = 0;
     80 
     81   PdbRaw_TpiVer VerHeader = PdbRaw_TpiVer::PdbTpiV80;
     82   std::vector<ArrayRef<uint8_t>> TypeRecBuffers;
     83   std::vector<uint32_t> TypeHashes;
     84   std::vector<codeview::TypeIndexOffset> TypeIndexOffsets;
     85   uint32_t HashStreamIndex = kInvalidStreamIndex;
     86   std::unique_ptr<BinaryByteStream> HashValueStream;
     87 
     88   const TpiStreamHeader *Header;
     89   uint32_t Idx;
     90 };
     91 }
     92 }
     93 
     94 #endif
     95