Home | History | Annotate | Download | only in CodeView
      1 //===- TypeRecordBuilder.h --------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef LLVM_DEBUGINFO_CODEVIEW_TYPERECORDBUILDER_H
     11 #define LLVM_DEBUGINFO_CODEVIEW_TYPERECORDBUILDER_H
     12 
     13 #include "llvm/ADT/SmallVector.h"
     14 #include "llvm/DebugInfo/CodeView/CodeView.h"
     15 #include "llvm/DebugInfo/CodeView/TypeIndex.h"
     16 #include "llvm/DebugInfo/CodeView/TypeRecord.h"
     17 #include "llvm/Support/EndianStream.h"
     18 #include "llvm/Support/raw_ostream.h"
     19 
     20 namespace llvm {
     21 namespace codeview {
     22 
     23 class TypeRecordBuilder {
     24 private:
     25   TypeRecordBuilder(const TypeRecordBuilder &) = delete;
     26   TypeRecordBuilder &operator=(const TypeRecordBuilder &) = delete;
     27 
     28 public:
     29   explicit TypeRecordBuilder(TypeRecordKind Kind);
     30 
     31   void writeUInt8(uint8_t Value);
     32   void writeInt16(int16_t Value);
     33   void writeUInt16(uint16_t Value);
     34   void writeInt32(int32_t Value);
     35   void writeUInt32(uint32_t Value);
     36   void writeInt64(int64_t Value);
     37   void writeUInt64(uint64_t Value);
     38   void writeTypeIndex(TypeIndex TypeInd);
     39   void writeTypeRecordKind(TypeRecordKind Kind);
     40   void writeEncodedInteger(int64_t Value);
     41   void writeEncodedSignedInteger(int64_t Value);
     42   void writeEncodedUnsignedInteger(uint64_t Value);
     43   void writeNullTerminatedString(StringRef Value);
     44   void writeGuid(StringRef Guid);
     45   void writeBytes(StringRef Value) { Stream << Value; }
     46 
     47   llvm::StringRef str();
     48 
     49   uint64_t size() const { return Stream.tell(); }
     50 
     51   void truncate(uint64_t Size) {
     52     // This works because raw_svector_ostream is not buffered.
     53     assert(Size < Buffer.size());
     54     Buffer.resize(Size);
     55   }
     56 
     57   void reset(TypeRecordKind K) {
     58     Buffer.clear();
     59     writeTypeRecordKind(K);
     60   }
     61 
     62 private:
     63   llvm::SmallVector<char, 256> Buffer;
     64   llvm::raw_svector_ostream Stream;
     65   llvm::support::endian::Writer<llvm::support::endianness::little> Writer;
     66 };
     67 }
     68 }
     69 
     70 #endif
     71