LLVM 22.0.0git
SymbolSerializer.h
Go to the documentation of this file.
1//===- SymbolSerializer.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_SYMBOLSERIALIZER_H
10#define LLVM_DEBUGINFO_CODEVIEW_SYMBOLSERIALIZER_H
11
21#include "llvm/Support/Endian.h"
22#include "llvm/Support/Error.h"
23#include <array>
24#include <cstdint>
25
26namespace llvm {
27namespace codeview {
28
30 BumpPtrAllocator &Storage;
31 // Since this is a fixed size buffer, use a stack allocated buffer. This
32 // yields measurable performance increase over the repeated heap allocations
33 // when serializing many independent records via writeOneSymbol.
34 std::array<uint8_t, MaxRecordLength> RecordBuffer;
36 BinaryStreamWriter Writer;
37 SymbolRecordMapping Mapping;
38 std::optional<SymbolKind> CurrentSymbol;
39
40 Error writeRecordPrefix(SymbolKind Kind) {
41 RecordPrefix Prefix;
42 Prefix.RecordKind = Kind;
43 Prefix.RecordLen = 0;
44 if (auto EC = Writer.writeObject(Prefix))
45 return EC;
46 return Error::success();
47 }
48
49public:
51
52 template <typename SymType>
53 static CVSymbol writeOneSymbol(SymType &Sym, BumpPtrAllocator &Storage,
54 CodeViewContainer Container) {
55 RecordPrefix Prefix{uint16_t(Sym.Kind)};
56 CVSymbol Result(&Prefix, sizeof(Prefix));
57 SymbolSerializer Serializer(Storage, Container);
58 consumeError(Serializer.visitSymbolBegin(Result));
59 consumeError(Serializer.visitKnownRecord(Result, Sym));
60 consumeError(Serializer.visitSymbolEnd(Result));
61 return Result;
62 }
63
64 Error visitSymbolBegin(CVSymbol &Record) override;
65 Error visitSymbolEnd(CVSymbol &Record) override;
66
67#define SYMBOL_RECORD(EnumName, EnumVal, Name) \
68 Error visitKnownRecord(CVSymbol &CVR, Name &Record) override { \
69 return visitKnownRecordImpl(CVR, Record); \
70 }
71#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
72#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
73
74private:
75 template <typename RecordKind>
76 Error visitKnownRecordImpl(CVSymbol &CVR, RecordKind &Record) {
77 return Mapping.visitKnownRecord(CVR, Record);
78 }
79};
80
81} // end namespace codeview
82} // end namespace llvm
83
84#endif // LLVM_DEBUGINFO_CODEVIEW_SYMBOLSERIALIZER_H
This file defines the BumpPtrAllocator interface.
#define LLVM_ABI
Definition Compiler.h:213
Provides write only access to a subclass of WritableBinaryStream.
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
An implementation of BinaryStream which holds its entire data set in a single contiguous buffer.
Error visitSymbolBegin(CVSymbol &Record) override
static CVSymbol writeOneSymbol(SymType &Sym, BumpPtrAllocator &Storage, CodeViewContainer Container)
SymbolSerializer(BumpPtrAllocator &Storage, CodeViewContainer Container)
Error visitSymbolEnd(CVSymbol &Record) override
CVRecord< SymbolKind > CVSymbol
Definition CVRecord.h:65
SymbolKind
Duplicate copy of the above enum, but using the official CV names.
Definition CodeView.h:49
This is an optimization pass for GlobalISel generic memory operations.
BumpPtrAllocatorImpl BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:383
void consumeError(Error Err)
Consume a Error without doing anything.
Definition Error.h:1083