Skip to content

Commit 7830d93

Browse files
committed
Make room in the serialization decl block for more attributes.
1 parent 713bb43 commit 7830d93

File tree

4 files changed

+79
-64
lines changed

4 files changed

+79
-64
lines changed

lib/Serialization/DeclTypeRecordNodes.def

Lines changed: 54 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -140,68 +140,68 @@ DECL(DESTRUCTOR)
140140
DECL(PRECEDENCE_GROUP)
141141
DECL(ACCESSOR)
142142

143-
#ifndef DECL_ATTR
144-
#define DECL_ATTR(NAME, CLASS, OPTIONS, CODE) RECORD_VAL(CLASS##_DECL_ATTR, 70+CODE)
145-
#endif
146-
#include "swift/AST/Attr.def"
147-
148-
FIRST_PATTERN(PAREN, 200)
143+
FIRST_PATTERN(PAREN, 80)
149144
PATTERN(TUPLE)
150145
TRAILING_INFO(TUPLE_PATTERN_ELT)
151146
PATTERN(NAMED)
152147
PATTERN(ANY)
153148
PATTERN(TYPED)
154149
PATTERN(VAR)
155150

156-
OTHER(PARAMETERLIST, 210)
151+
OTHER(PARAMETERLIST, 100)
157152
// 211 is unused
158-
OTHER(FOREIGN_ERROR_CONVENTION, 212)
159-
OTHER(FOREIGN_ASYNC_CONVENTION, 213)
160-
OTHER(XREF_TYPE_PATH_PIECE, 214)
161-
OTHER(XREF_VALUE_PATH_PIECE, 215)
162-
OTHER(XREF_EXTENSION_PATH_PIECE, 216)
163-
OTHER(XREF_OPERATOR_OR_ACCESSOR_PATH_PIECE, 217)
164-
OTHER(XREF_GENERIC_PARAM_PATH_PIECE, 218)
165-
OTHER(XREF_INITIALIZER_PATH_PIECE, 219)
166-
167-
OTHER(ABSTRACT_CLOSURE_EXPR_CONTEXT, 220)
168-
OTHER(PATTERN_BINDING_INITIALIZER_CONTEXT, 221)
169-
OTHER(DEFAULT_ARGUMENT_INITIALIZER_CONTEXT, 222)
170-
OTHER(TOP_LEVEL_CODE_DECL_CONTEXT, 223)
171-
172-
OTHER(GENERIC_PARAM_LIST, 230)
173-
OTHER(GENERIC_SIGNATURE, 231)
174-
OTHER(REQUIREMENT_SIGNATURE, 232)
175-
// 233 is unused; was LAYOUT_REQUIREMENT
176-
OTHER(BUILTIN_PROTOCOL_CONFORMANCE, 234)
177-
OTHER(SIL_GENERIC_SIGNATURE, 235)
178-
OTHER(SUBSTITUTION_MAP, 236)
179-
180-
OTHER(LOCAL_DISCRIMINATOR, 237)
181-
OTHER(PRIVATE_DISCRIMINATOR, 238)
182-
OTHER(FILENAME_FOR_PRIVATE, 239)
183-
184-
// 240 is unused; was ABSTRACT_PROTOCOL_CONFORMANCE
185-
OTHER(NORMAL_PROTOCOL_CONFORMANCE, 241)
186-
OTHER(SPECIALIZED_PROTOCOL_CONFORMANCE, 242)
187-
OTHER(INHERITED_PROTOCOL_CONFORMANCE, 243)
188-
// 244 is unused; was INVALID_PROTOCOL_CONFORMANCE
189-
190-
OTHER(SIL_LAYOUT, 245)
191-
// 246 is unused; was NORMAL_PROTOCOL_CONFORMANCE_ID
192-
OTHER(PROTOCOL_CONFORMANCE_XREF, 247)
193-
OTHER(MEMBERS, 248)
194-
OTHER(XREF, 249)
195-
OTHER(INLINABLE_BODY_TEXT, 250)
196-
OTHER(SELF_PROTOCOL_CONFORMANCE, 251)
197-
198-
OTHER(XREF_OPAQUE_RETURN_TYPE_PATH_PIECE, 252)
199-
200-
OTHER(CLANG_TYPE, 253)
201-
202-
OTHER(DERIVATIVE_FUNCTION_CONFIGURATION, 254)
203-
204-
OTHER(ERROR_FLAG, 255)
153+
OTHER(FOREIGN_ERROR_CONVENTION, 101)
154+
OTHER(FOREIGN_ASYNC_CONVENTION, 102)
155+
OTHER(XREF_TYPE_PATH_PIECE, 103)
156+
OTHER(XREF_VALUE_PATH_PIECE, 104)
157+
OTHER(XREF_EXTENSION_PATH_PIECE, 105)
158+
OTHER(XREF_OPERATOR_OR_ACCESSOR_PATH_PIECE, 106)
159+
OTHER(XREF_GENERIC_PARAM_PATH_PIECE, 107)
160+
OTHER(XREF_INITIALIZER_PATH_PIECE, 108)
161+
162+
OTHER(ABSTRACT_CLOSURE_EXPR_CONTEXT, 109)
163+
OTHER(PATTERN_BINDING_INITIALIZER_CONTEXT, 110)
164+
OTHER(DEFAULT_ARGUMENT_INITIALIZER_CONTEXT, 111)
165+
OTHER(TOP_LEVEL_CODE_DECL_CONTEXT, 112)
166+
167+
OTHER(GENERIC_PARAM_LIST, 120)
168+
OTHER(GENERIC_SIGNATURE, 121)
169+
OTHER(REQUIREMENT_SIGNATURE, 122)
170+
// 123 is unused; was LAYOUT_REQUIREMENT
171+
OTHER(BUILTIN_PROTOCOL_CONFORMANCE, 124)
172+
OTHER(SIL_GENERIC_SIGNATURE, 125)
173+
OTHER(SUBSTITUTION_MAP, 126)
174+
175+
OTHER(LOCAL_DISCRIMINATOR, 127)
176+
OTHER(PRIVATE_DISCRIMINATOR, 128)
177+
OTHER(FILENAME_FOR_PRIVATE, 129)
178+
179+
// 140 is unused; was ABSTRACT_PROTOCOL_CONFORMANCE
180+
OTHER(NORMAL_PROTOCOL_CONFORMANCE, 141)
181+
OTHER(SPECIALIZED_PROTOCOL_CONFORMANCE, 142)
182+
OTHER(INHERITED_PROTOCOL_CONFORMANCE, 143)
183+
// 144 is unused; was INVALID_PROTOCOL_CONFORMANCE
184+
185+
OTHER(SIL_LAYOUT, 145)
186+
// 146 is unused; was NORMAL_PROTOCOL_CONFORMANCE_ID
187+
OTHER(PROTOCOL_CONFORMANCE_XREF, 147)
188+
OTHER(MEMBERS, 148)
189+
OTHER(XREF, 149)
190+
OTHER(INLINABLE_BODY_TEXT, 150)
191+
OTHER(SELF_PROTOCOL_CONFORMANCE, 151)
192+
193+
OTHER(XREF_OPAQUE_RETURN_TYPE_PATH_PIECE, 152)
194+
195+
OTHER(CLANG_TYPE, 153)
196+
197+
OTHER(DERIVATIVE_FUNCTION_CONFIGURATION, 154)
198+
199+
OTHER(ERROR_FLAG, 155)
200+
201+
#ifndef DECL_ATTR
202+
#define DECL_ATTR(NAME, CLASS, OPTIONS, CODE) RECORD_VAL(CLASS##_DECL_ATTR, 180+CODE)
203+
#endif
204+
#include "swift/AST/Attr.def"
205205

206206
#undef RECORD
207207
#undef DECLTYPERECORDNODES_HAS_RECORD_VAL

lib/Serialization/ModuleFormat.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ const uint16_t SWIFTMODULE_VERSION_MAJOR = 0;
5656
/// describe what change you made. The content of this comment isn't important;
5757
/// it just ensures a conflict if two people change the module format.
5858
/// Don't worry about adhering to the 80-column limit for this line.
59-
const uint16_t SWIFTMODULE_VERSION_MINOR = 673; // new schema for conformances
59+
const uint16_t SWIFTMODULE_VERSION_MINOR = 674; // decl block renumbering
6060

6161
/// A standard hash seed used for all string hashes in a serialized module.
6262
///
@@ -959,7 +959,7 @@ namespace input_block {
959959
///
960960
/// \sa DECLS_AND_TYPES_BLOCK_ID
961961
namespace decls_block {
962-
enum RecordKind : uint8_t {
962+
enum RecordKind : uint16_t {
963963
#define RECORD(Id) Id,
964964
#define RECORD_VAL(Id, Value) Id = Value,
965965
#include "DeclTypeRecordNodes.def"

lib/Serialization/Serialization.cpp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -782,20 +782,34 @@ void SerializerBase::emitBlockID(unsigned ID, StringRef name,
782782
}
783783

784784
void SerializerBase::emitRecordID(unsigned ID, StringRef name,
785-
SmallVectorImpl<unsigned char> &nameBuffer) {
786-
assert(ID < 256 && "can't fit record ID in next to name");
787-
nameBuffer.resize(name.size()+1);
788-
nameBuffer[0] = ID;
789-
memcpy(nameBuffer.data()+1, name.data(), name.size());
790-
Out.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME, nameBuffer);
785+
SmallVectorImpl<unsigned char> &nameBuffer,
786+
SmallVectorImpl<unsigned> *wideNameBuffer) {
787+
// Use the byte-based buffer if the ID is in range.
788+
if (ID < 256) {
789+
nameBuffer.resize(name.size()+1);
790+
nameBuffer[0] = ID;
791+
memcpy(nameBuffer.data()+1, name.data(), name.size());
792+
Out.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME, nameBuffer);
793+
794+
// Otherwise, we have to use the wide name buffer.
795+
} else {
796+
assert(wideNameBuffer && "too many IDs to use narrow name buffer");
797+
auto &buffer = *wideNameBuffer;
798+
buffer.resize(name.size()+1);
799+
buffer[0] = ID;
800+
for (unsigned i = 0, e = name.size(); i != e; ++i)
801+
buffer[i+1] = name[i];
802+
Out.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME, buffer);
803+
}
791804
}
792805

793806
void Serializer::writeBlockInfoBlock() {
794807
BCBlockRAII restoreBlock(Out, llvm::bitc::BLOCKINFO_BLOCK_ID, 2);
795808

796809
SmallVector<unsigned char, 64> nameBuffer;
810+
SmallVector<unsigned, 32> wideNameBuffer;
797811
#define BLOCK(X) emitBlockID(X ## _ID, #X, nameBuffer)
798-
#define BLOCK_RECORD(K, X) emitRecordID(K::X, #X, nameBuffer)
812+
#define BLOCK_RECORD(K, X) emitRecordID(K::X, #X, nameBuffer, &wideNameBuffer)
799813

800814
BLOCK(MODULE_BLOCK);
801815

lib/Serialization/Serialization.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ class SerializerBase {
6666

6767
/// Record the name of a record within a block.
6868
void emitRecordID(unsigned ID, StringRef name,
69-
SmallVectorImpl<unsigned char> &nameBuffer);
69+
SmallVectorImpl<unsigned char> &nameBuffer,
70+
SmallVectorImpl<unsigned> *wideNameBuffer = nullptr);
7071

7172
void writeToStream(raw_ostream &os);
7273

0 commit comments

Comments
 (0)