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