1 //===- ContinuationRecordBuilder.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 #ifndef LLVM_DEBUGINFO_CODEVIEW_CONTINUATIONRECORDBUILDER_H 10 #define LLVM_DEBUGINFO_CODEVIEW_CONTINUATIONRECORDBUILDER_H 11 12 #include "llvm/ADT/ArrayRef.h" 13 #include "llvm/ADT/Optional.h" 14 #include "llvm/ADT/SmallVector.h" 15 #include "llvm/DebugInfo/CodeView/CodeView.h" 16 #include "llvm/DebugInfo/CodeView/RecordSerialization.h" 17 #include "llvm/DebugInfo/CodeView/TypeIndex.h" 18 #include "llvm/DebugInfo/CodeView/TypeRecord.h" 19 #include "llvm/DebugInfo/CodeView/TypeRecordMapping.h" 20 #include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h" 21 #include "llvm/Support/BinaryByteStream.h" 22 #include "llvm/Support/BinaryStreamWriter.h" 23 #include "llvm/Support/Error.h" 24 #include <cassert> 25 #include <cstdint> 26 #include <memory> 27 #include <vector> 28 29 namespace llvm { 30 namespace codeview { 31 enum class ContinuationRecordKind { FieldList, MethodOverloadList }; 32 33 class ContinuationRecordBuilder { 34 SmallVector<uint32_t, 4> SegmentOffsets; 35 Optional<ContinuationRecordKind> Kind; 36 AppendingBinaryByteStream Buffer; 37 BinaryStreamWriter SegmentWriter; 38 TypeRecordMapping Mapping; 39 ArrayRef<uint8_t> InjectedSegmentBytes; 40 41 uint32_t getCurrentSegmentLength() const; 42 43 void insertSegmentEnd(uint32_t Offset); 44 CVType createSegmentRecord(uint32_t OffBegin, uint32_t OffEnd, 45 Optional<TypeIndex> RefersTo); 46 47 public: 48 ContinuationRecordBuilder(); 49 ~ContinuationRecordBuilder(); 50 51 void begin(ContinuationRecordKind RecordKind); 52 53 // This template is explicitly instantiated in the implementation file for all 54 // supported types. The method itself is ugly, so inlining it into the header 55 // file clutters an otherwise straightforward interface. 56 template <typename RecordType> void writeMemberType(RecordType &Record); 57 58 std::vector<CVType> end(TypeIndex Index); 59 }; 60 } // namespace codeview 61 } // namespace llvm 62 63 #endif 64