//===- ContinuationRecordBuilder.h ------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_DEBUGINFO_CODEVIEW_CONTINUATIONRECORDBUILDER_H #define LLVM_DEBUGINFO_CODEVIEW_CONTINUATIONRECORDBUILDER_H #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/SmallVector.h" #include "llvm/DebugInfo/CodeView/CVRecord.h" #include "llvm/DebugInfo/CodeView/TypeRecordMapping.h" #include "llvm/Support/BinaryByteStream.h" #include "llvm/Support/BinaryStreamWriter.h" #include #include namespace llvm { namespace codeview { class TypeIndex; enum class ContinuationRecordKind { FieldList, MethodOverloadList }; class ContinuationRecordBuilder { SmallVector SegmentOffsets; std::optional Kind; AppendingBinaryByteStream Buffer; BinaryStreamWriter SegmentWriter; TypeRecordMapping Mapping; ArrayRef InjectedSegmentBytes; uint32_t getCurrentSegmentLength() const; void insertSegmentEnd(uint32_t Offset); CVType createSegmentRecord(uint32_t OffBegin, uint32_t OffEnd, std::optional RefersTo); public: ContinuationRecordBuilder(); ~ContinuationRecordBuilder(); void begin(ContinuationRecordKind RecordKind); // This template is explicitly instantiated in the implementation file for all // supported types. The method itself is ugly, so inlining it into the header // file clutters an otherwise straightforward interface. template void writeMemberType(RecordType &Record); std::vector end(TypeIndex Index); }; } // namespace codeview } // namespace llvm #endif