LLVM
23.0.0git
include
llvm
Remarks
BitstreamRemarkSerializer.h
Go to the documentation of this file.
1
//===-- BitstreamRemarkSerializer.h - Bitstream serializer ------*- 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
// This file provides an implementation of the serializer using the LLVM
10
// Bitstream format.
11
//
12
//===----------------------------------------------------------------------===//
13
14
#ifndef LLVM_REMARKS_BITSTREAMREMARKSERIALIZER_H
15
#define LLVM_REMARKS_BITSTREAMREMARKSERIALIZER_H
16
17
#include "
llvm/Bitstream/BitstreamWriter.h
"
18
#include "
llvm/Remarks/BitstreamRemarkContainer.h
"
19
#include "
llvm/Remarks/RemarkSerializer.h
"
20
#include <optional>
21
22
namespace
llvm
{
23
namespace
remarks
{
24
25
struct
Remarks;
26
27
/// Serialize the remarks to LLVM bitstream.
28
/// This class provides ways to emit remarks in the LLVM bitstream format and
29
/// its associated metadata.
30
struct
BitstreamRemarkSerializerHelper
{
31
/// Buffer used to construct records and pass to the bitstream writer.
32
SmallVector<uint64_t, 64>
R
;
33
/// The Bitstream writer.
34
BitstreamWriter
Bitstream
;
35
/// The type of the container we are serializing.
36
BitstreamRemarkContainerType
ContainerType
;
37
38
/// Abbrev IDs initialized in the block info block.
39
/// Note: depending on the container type, some IDs might be uninitialized.
40
/// Warning: When adding more abbrev IDs, make sure to update the
41
/// BlockCodeSize (in the call to EnterSubblock).
42
uint64_t
RecordMetaContainerInfoAbbrevID
= 0;
43
uint64_t
RecordMetaRemarkVersionAbbrevID
= 0;
44
uint64_t
RecordMetaStrTabAbbrevID
= 0;
45
uint64_t
RecordMetaExternalFileAbbrevID
= 0;
46
uint64_t
RecordRemarkHeaderAbbrevID
= 0;
47
uint64_t
RecordRemarkDebugLocAbbrevID
= 0;
48
uint64_t
RecordRemarkHotnessAbbrevID
= 0;
49
uint64_t
RecordRemarkArgWithDebugLocAbbrevID
= 0;
50
uint64_t
RecordRemarkArgWithoutDebugLocAbbrevID
= 0;
51
52
LLVM_ABI
53
BitstreamRemarkSerializerHelper
(
BitstreamRemarkContainerType
ContainerType
,
54
raw_ostream
&OS);
55
56
// Disable copy and move: Bitstream points to Encoded, which needs special
57
// handling during copy/move, but moving the vectors is probably useless
58
// anyway.
59
BitstreamRemarkSerializerHelper
(
const
BitstreamRemarkSerializerHelper
&) =
60
delete
;
61
BitstreamRemarkSerializerHelper
&
62
operator=
(
const
BitstreamRemarkSerializerHelper
&) =
delete
;
63
BitstreamRemarkSerializerHelper
(
BitstreamRemarkSerializerHelper
&&) =
delete
;
64
BitstreamRemarkSerializerHelper
&
65
operator=
(
BitstreamRemarkSerializerHelper
&&) =
delete
;
66
67
/// Set up the necessary block info entries according to the container type.
68
LLVM_ABI
void
setupBlockInfo
();
69
70
/// Set up the block info for the metadata block.
71
LLVM_ABI
void
setupMetaBlockInfo
();
72
/// The remark version in the metadata block.
73
LLVM_ABI
void
setupMetaRemarkVersion
();
74
LLVM_ABI
void
emitMetaRemarkVersion
(
uint64_t
RemarkVersion);
75
/// The strtab in the metadata block.
76
LLVM_ABI
void
setupMetaStrTab
();
77
LLVM_ABI
void
emitMetaStrTab
(
const
StringTable
&StrTab);
78
/// The external file in the metadata block.
79
LLVM_ABI
void
setupMetaExternalFile
();
80
LLVM_ABI
void
emitMetaExternalFile
(
StringRef
Filename
);
81
82
/// The block info for the remarks block.
83
LLVM_ABI
void
setupRemarkBlockInfo
();
84
85
/// Emit the main metadata at the beginning of the file
86
LLVM_ABI
void
emitMetaBlock
(std::optional<StringRef>
Filename
= std::nullopt);
87
88
/// Emit the remaining metadata at the end of the file. Here we emit metadata
89
/// that is only known once all remarks were emitted.
90
LLVM_ABI
void
emitLateMetaBlock
(
const
StringTable
&StrTab);
91
92
/// Emit a remark block. The string table is required.
93
LLVM_ABI
void
emitRemark
(
const
Remark
&
Remark
,
StringTable
&StrTab);
94
};
95
96
/// Implementation of the remark serializer using LLVM bitstream.
97
struct
LLVM_ABI
BitstreamRemarkSerializer
:
public
RemarkSerializer
{
98
/// The file should contain:
99
/// 1) The block info block that describes how to read the blocks.
100
/// 2) The metadata block that contains various information about the remarks
101
/// in the file.
102
/// 3) A number of remark blocks.
103
/// 4) Another metadata block for metadata that is only finalized once all
104
/// remarks were emitted (e.g. StrTab)
105
106
/// The helper to emit bitstream. This is nullopt when the Serializer has not
107
/// been setup yet.
108
std::optional<BitstreamRemarkSerializerHelper>
Helper
;
109
110
/// Construct a serializer that will create its own string table.
111
BitstreamRemarkSerializer
(
raw_ostream
&
OS
);
112
/// Construct a serializer with a pre-filled string table.
113
BitstreamRemarkSerializer
(
raw_ostream
&
OS
,
StringTable
StrTab
);
114
115
~BitstreamRemarkSerializer
()
override
;
116
117
/// Emit a remark to the stream. This also emits the metadata associated to
118
/// the remarks. This writes the serialized output to the provided stream.
119
void
emit
(
const
Remark
&
Remark
)
override
;
120
121
/// Finalize emission of remarks. This emits the late metadata block and
122
/// flushes internal buffers. It is safe to call this function multiple times,
123
/// and it is automatically executed on destruction of the Serializer.
124
void
finalize
()
override
;
125
126
/// The metadata serializer associated to this remark serializer. Based on the
127
/// container type of the current serializer, the container type of the
128
/// metadata serializer will change.
129
std::unique_ptr<MetaSerializer>
130
metaSerializer
(
raw_ostream
&
OS
,
StringRef
ExternalFilename)
override
;
131
132
static
bool
classof
(
const
RemarkSerializer
*S) {
133
return
S->
SerializerFormat
==
Format::Bitstream
;
134
}
135
136
private
:
137
void
setup();
138
};
139
140
/// Serializer of metadata for bitstream remarks.
141
struct
LLVM_ABI
BitstreamMetaSerializer
:
public
MetaSerializer
{
142
std::optional<BitstreamRemarkSerializerHelper>
Helper
;
143
144
StringRef
ExternalFilename
;
145
146
/// Create a new meta serializer based on \p ContainerType.
147
BitstreamMetaSerializer
(
raw_ostream
&
OS
,
148
BitstreamRemarkContainerType
ContainerType,
149
StringRef
ExternalFilename
)
150
:
MetaSerializer
(
OS
),
ExternalFilename
(
ExternalFilename
) {
151
Helper
.emplace(ContainerType,
OS
);
152
}
153
154
void
emit()
override
;
155
};
156
157
}
// end namespace remarks
158
}
// end namespace llvm
159
160
#endif
// LLVM_REMARKS_BITSTREAMREMARKSERIALIZER_H
finalize
arc branch finalize
Definition
ARCBranchFinalize.cpp:65
BitstreamRemarkContainer.h
BitstreamWriter.h
LLVM_ABI
#define LLVM_ABI
Definition
Compiler.h:213
Filename
static constexpr StringLiteral Filename
Definition
OnDiskCASLogger.cpp:41
RemarkSerializer.h
llvm::BitstreamWriter
Definition
BitstreamWriter.h:31
llvm::SmallVector
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition
SmallVector.h:1225
llvm::StringRef
Represent a constant reference to a string, i.e.
Definition
StringRef.h:56
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition
raw_ostream.h:53
uint64_t
llvm::remarks
Definition
AsmPrinter.h:86
llvm::remarks::BitstreamRemarkContainerType
BitstreamRemarkContainerType
Type of the remark container.
Definition
BitstreamRemarkContainer.h:31
llvm::remarks::Format::Bitstream
@ Bitstream
Definition
RemarkFormat.h:26
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition
FunctionInfo.h:25
llvm::remarks::BitstreamMetaSerializer::Helper
std::optional< BitstreamRemarkSerializerHelper > Helper
Definition
BitstreamRemarkSerializer.h:142
llvm::remarks::BitstreamMetaSerializer::BitstreamMetaSerializer
BitstreamMetaSerializer(raw_ostream &OS, BitstreamRemarkContainerType ContainerType, StringRef ExternalFilename)
Create a new meta serializer based on ContainerType.
Definition
BitstreamRemarkSerializer.h:147
llvm::remarks::BitstreamMetaSerializer::ExternalFilename
StringRef ExternalFilename
Definition
BitstreamRemarkSerializer.h:144
llvm::remarks::BitstreamRemarkSerializerHelper::Bitstream
BitstreamWriter Bitstream
The Bitstream writer.
Definition
BitstreamRemarkSerializer.h:34
llvm::remarks::BitstreamRemarkSerializerHelper::BitstreamRemarkSerializerHelper
BitstreamRemarkSerializerHelper(const BitstreamRemarkSerializerHelper &)=delete
llvm::remarks::BitstreamRemarkSerializerHelper::emitMetaBlock
LLVM_ABI void emitMetaBlock(std::optional< StringRef > Filename=std::nullopt)
Emit the main metadata at the beginning of the file.
Definition
BitstreamRemarkSerializer.cpp:224
llvm::remarks::BitstreamRemarkSerializerHelper::setupMetaBlockInfo
LLVM_ABI void setupMetaBlockInfo()
Set up the block info for the metadata block.
Definition
BitstreamRemarkSerializer.cpp:46
llvm::remarks::BitstreamRemarkSerializerHelper::RecordRemarkArgWithoutDebugLocAbbrevID
uint64_t RecordRemarkArgWithoutDebugLocAbbrevID
Definition
BitstreamRemarkSerializer.h:50
llvm::remarks::BitstreamRemarkSerializerHelper::RecordRemarkDebugLocAbbrevID
uint64_t RecordRemarkDebugLocAbbrevID
Definition
BitstreamRemarkSerializer.h:47
llvm::remarks::BitstreamRemarkSerializerHelper::RecordMetaStrTabAbbrevID
uint64_t RecordMetaStrTabAbbrevID
Definition
BitstreamRemarkSerializer.h:44
llvm::remarks::BitstreamRemarkSerializerHelper::BitstreamRemarkSerializerHelper
LLVM_ABI BitstreamRemarkSerializerHelper(BitstreamRemarkContainerType ContainerType, raw_ostream &OS)
Definition
BitstreamRemarkSerializer.cpp:23
llvm::remarks::BitstreamRemarkSerializerHelper::RecordMetaRemarkVersionAbbrevID
uint64_t RecordMetaRemarkVersionAbbrevID
Definition
BitstreamRemarkSerializer.h:43
llvm::remarks::BitstreamRemarkSerializerHelper::RecordRemarkArgWithDebugLocAbbrevID
uint64_t RecordRemarkArgWithDebugLocAbbrevID
Definition
BitstreamRemarkSerializer.h:49
llvm::remarks::BitstreamRemarkSerializerHelper::R
SmallVector< uint64_t, 64 > R
Buffer used to construct records and pass to the bitstream writer.
Definition
BitstreamRemarkSerializer.h:32
llvm::remarks::BitstreamRemarkSerializerHelper::RecordRemarkHotnessAbbrevID
uint64_t RecordRemarkHotnessAbbrevID
Definition
BitstreamRemarkSerializer.h:48
llvm::remarks::BitstreamRemarkSerializerHelper::RecordRemarkHeaderAbbrevID
uint64_t RecordRemarkHeaderAbbrevID
Definition
BitstreamRemarkSerializer.h:46
llvm::remarks::BitstreamRemarkSerializerHelper::ContainerType
BitstreamRemarkContainerType ContainerType
The type of the container we are serializing.
Definition
BitstreamRemarkSerializer.h:36
llvm::remarks::BitstreamRemarkSerializerHelper::operator=
BitstreamRemarkSerializerHelper & operator=(const BitstreamRemarkSerializerHelper &)=delete
llvm::remarks::BitstreamRemarkSerializerHelper::setupRemarkBlockInfo
LLVM_ABI void setupRemarkBlockInfo()
The block info for the remarks block.
Definition
BitstreamRemarkSerializer.cpp:123
llvm::remarks::BitstreamRemarkSerializerHelper::RecordMetaExternalFileAbbrevID
uint64_t RecordMetaExternalFileAbbrevID
Definition
BitstreamRemarkSerializer.h:45
llvm::remarks::BitstreamRemarkSerializerHelper::setupMetaExternalFile
LLVM_ABI void setupMetaExternalFile()
The external file in the metadata block.
Definition
BitstreamRemarkSerializer.cpp:106
llvm::remarks::BitstreamRemarkSerializerHelper::BitstreamRemarkSerializerHelper
BitstreamRemarkSerializerHelper(BitstreamRemarkSerializerHelper &&)=delete
llvm::remarks::BitstreamRemarkSerializerHelper::setupBlockInfo
LLVM_ABI void setupBlockInfo()
Set up the necessary block info entries according to the container type.
Definition
BitstreamRemarkSerializer.cpp:195
llvm::remarks::BitstreamRemarkSerializerHelper::setupMetaRemarkVersion
LLVM_ABI void setupMetaRemarkVersion()
The remark version in the metadata block.
Definition
BitstreamRemarkSerializer.cpp:62
llvm::remarks::BitstreamRemarkSerializerHelper::operator=
BitstreamRemarkSerializerHelper & operator=(BitstreamRemarkSerializerHelper &&)=delete
llvm::remarks::BitstreamRemarkSerializerHelper::emitMetaRemarkVersion
LLVM_ABI void emitMetaRemarkVersion(uint64_t RemarkVersion)
Definition
BitstreamRemarkSerializer.cpp:73
llvm::remarks::BitstreamRemarkSerializerHelper::emitMetaStrTab
LLVM_ABI void emitMetaStrTab(const StringTable &StrTab)
Definition
BitstreamRemarkSerializer.cpp:92
llvm::remarks::BitstreamRemarkSerializerHelper::setupMetaStrTab
LLVM_ABI void setupMetaStrTab()
The strtab in the metadata block.
Definition
BitstreamRemarkSerializer.cpp:82
llvm::remarks::BitstreamRemarkSerializerHelper::emitMetaExternalFile
LLVM_ABI void emitMetaExternalFile(StringRef Filename)
Definition
BitstreamRemarkSerializer.cpp:116
llvm::remarks::BitstreamRemarkSerializerHelper::emitLateMetaBlock
LLVM_ABI void emitLateMetaBlock(const StringTable &StrTab)
Emit the remaining metadata at the end of the file.
Definition
BitstreamRemarkSerializer.cpp:249
llvm::remarks::BitstreamRemarkSerializerHelper::emitRemark
LLVM_ABI void emitRemark(const Remark &Remark, StringTable &StrTab)
Emit a remark block. The string table is required.
Definition
BitstreamRemarkSerializer.cpp:257
llvm::remarks::BitstreamRemarkSerializerHelper::RecordMetaContainerInfoAbbrevID
uint64_t RecordMetaContainerInfoAbbrevID
Abbrev IDs initialized in the block info block.
Definition
BitstreamRemarkSerializer.h:42
llvm::remarks::BitstreamRemarkSerializer::metaSerializer
std::unique_ptr< MetaSerializer > metaSerializer(raw_ostream &OS, StringRef ExternalFilename) override
The metadata serializer associated to this remark serializer.
Definition
BitstreamRemarkSerializer.cpp:341
llvm::remarks::BitstreamRemarkSerializer::Helper
std::optional< BitstreamRemarkSerializerHelper > Helper
The file should contain: 1) The block info block that describes how to read the blocks.
Definition
BitstreamRemarkSerializer.h:108
llvm::remarks::BitstreamRemarkSerializer::BitstreamRemarkSerializer
BitstreamRemarkSerializer(raw_ostream &OS)
Construct a serializer that will create its own string table.
Definition
BitstreamRemarkSerializer.cpp:307
llvm::remarks::BitstreamRemarkSerializer::classof
static bool classof(const RemarkSerializer *S)
Definition
BitstreamRemarkSerializer.h:132
llvm::remarks::BitstreamRemarkSerializer::emit
void emit(const Remark &Remark) override
Emit a remark to the stream.
Definition
BitstreamRemarkSerializer.cpp:335
llvm::remarks::MetaSerializer::MetaSerializer
MetaSerializer(raw_ostream &OS)
Definition
RemarkSerializer.h:66
llvm::remarks::MetaSerializer::OS
raw_ostream & OS
The open raw_ostream that the metadata is emitted to.
Definition
RemarkSerializer.h:64
llvm::remarks::RemarkSerializer::SerializerFormat
Format SerializerFormat
The format of the serializer.
Definition
RemarkSerializer.h:35
llvm::remarks::RemarkSerializer::RemarkSerializer
RemarkSerializer(Format SerializerFormat, raw_ostream &OS)
Definition
RemarkSerializer.h:42
llvm::remarks::RemarkSerializer::StrTab
std::optional< StringTable > StrTab
The string table containing all the unique strings used in the output.
Definition
RemarkSerializer.h:40
llvm::remarks::RemarkSerializer::OS
raw_ostream & OS
The open raw_ostream that the remark diagnostics are emitted to.
Definition
RemarkSerializer.h:37
llvm::remarks::Remark
A remark type used for both emission and parsing.
Definition
Remark.h:107
llvm::remarks::StringTable
The string table used for serializing remarks.
Definition
RemarkStringTable.h:37
Generated on
for LLVM by
1.14.0