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