Fixed a few bugs with the fast decoder.

1. For long tags we were putting table entries in the wrong slot.
2. For repeated strings, when the buffer flipped to no longer alias we
   were failing to notice and kept aliasing anyway.
pull/13171/head
Joshua Haberman 4 years ago
parent 3eba47914b
commit bd9f8f580d
  1. 46
      cmake/google/protobuf/descriptor.upb.c
  2. 10
      upb/decode_fast.c
  3. 17
      upbc/generator.cc

@ -299,7 +299,6 @@ const upb_msglayout google_protobuf_ExtensionRangeOptions_msginit = {
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x000000003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -316,6 +315,7 @@ const upb_msglayout google_protobuf_ExtensionRangeOptions_msginit = {
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x000000003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -724,16 +724,16 @@ const upb_msglayout google_protobuf_FileOptions_msginit = {
{0x001800000100000a, &upb_pss_1bt},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x004800000d0002a2, &upb_pss_2bt},
{0x005800000e0002aa, &upb_pss_2bt},
{0x0000000000000000, &fastdecode_generic},
{0x006800000f0002ba, &upb_pss_2bt},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0028000002000042, &upb_pss_1bt},
{0x0004000003000048, &upb_psv4_1bt},
{0x0008000004000050, &upb_psb1_1bt},
{0x003800000500005a, &upb_pss_1bt},
{0x00980000130002e2, &upb_pss_2bt},
{0x00a80000140002ea, &upb_pss_2bt},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0009000006000180, &upb_psb1_2bt},
@ -741,15 +741,15 @@ const upb_msglayout google_protobuf_FileOptions_msginit = {
{0x000b000008000190, &upb_psb1_2bt},
{0x0000000000000000, &fastdecode_generic},
{0x000c0000090001a0, &upb_psb1_2bt},
{0x0000000000000000, &fastdecode_generic},
{0x005800000e0002aa, &upb_pss_2bt},
{0x0000000000000000, &fastdecode_generic},
{0x000d00000a0001b8, &upb_psb1_2bt},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x00780000100002c2, &upb_pss_2bt},
{0x00880000110002ca, &upb_pss_2bt},
{0x00100000120002d0, &upb_psb1_2bt},
{0x000e00000b0001d8, &upb_psb1_2bt},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x00980000130002e2, &upb_pss_2bt},
{0x00a80000140002ea, &upb_pss_2bt},
{0x0000000000000000, &fastdecode_generic},
{0x000f00000c0001f8, &upb_psb1_2bt},
},
@ -795,7 +795,7 @@ const upb_msglayout google_protobuf_MessageOptions_msginit = {
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x000800003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -833,11 +833,10 @@ const upb_msglayout google_protobuf_FieldOptions_msginit = {
{0x0000000000000000, &fastdecode_generic},
{0x000e000004000028, &upb_psb1_1bt},
{0x0008000005000030, &upb_psv4_1bt},
{0x001000003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x000f000006000050, &upb_psb1_1bt},
{0x0000000000000000, &fastdecode_generic},
{0x000f000006000050, &upb_psb1_1bt},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -850,6 +849,7 @@ const upb_msglayout google_protobuf_FieldOptions_msginit = {
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x001000003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -881,7 +881,6 @@ const upb_msglayout google_protobuf_OneofOptions_msginit = {
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x000000003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -898,6 +897,7 @@ const upb_msglayout google_protobuf_OneofOptions_msginit = {
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x000000003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -931,7 +931,6 @@ const upb_msglayout google_protobuf_EnumOptions_msginit = {
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x000800003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -948,6 +947,7 @@ const upb_msglayout google_protobuf_EnumOptions_msginit = {
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x000800003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -980,7 +980,6 @@ const upb_msglayout google_protobuf_EnumValueOptions_msginit = {
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x000800003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -997,6 +996,7 @@ const upb_msglayout google_protobuf_EnumValueOptions_msginit = {
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x000800003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -1023,13 +1023,11 @@ static const upb_msglayout_field google_protobuf_ServiceOptions__fields[2] = {
const upb_msglayout google_protobuf_ServiceOptions_msginit = {
{
{0x0000000000000000, &fastdecode_generic},
{0x0001000001000288, &upb_psb1_2bt},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x000800003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -1041,11 +1039,13 @@ const upb_msglayout google_protobuf_ServiceOptions_msginit = {
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0001000001000288, &upb_psb1_2bt},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x000800003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -1073,13 +1073,10 @@ static const upb_msglayout_field google_protobuf_MethodOptions__fields[3] = {
const upb_msglayout google_protobuf_MethodOptions_msginit = {
{
{0x0000000000000000, &fastdecode_generic},
{0x0008000001000288, &upb_psb1_2bt},
{0x0004000002000290, &upb_psv4_2bt},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x001000003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
@ -1092,10 +1089,13 @@ const upb_msglayout google_protobuf_MethodOptions_msginit = {
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0008000001000288, &upb_psb1_2bt},
{0x0004000002000290, &upb_psv4_2bt},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x001000003f003eba, &upb_prm_2bt_max128b},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},
{0x0000000000000000, &fastdecode_generic},

@ -560,8 +560,8 @@ again:
ptr += valbytes;
if (card == CARD_r) {
fastdecode_nextret ret = fastdecode_nextrepeated(
d, dst, &ptr, &farr, data, tagbytes, sizeof(upb_msg *));
fastdecode_nextret ret =
fastdecode_nextrepeated(d, dst, &ptr, &farr, data, tagbytes, valbytes);
switch (ret.next) {
case FD_NEXT_SAMEFIELD:
dst = ret.dst;
@ -822,6 +822,12 @@ again:
switch (ret.next) {
case FD_NEXT_SAMEFIELD:
dst = ret.dst;
if (UPB_UNLIKELY(!d->alias)) {
// Buffer flipped and we can't alias any more. Bounce to copyfunc(),
// but via dispatch since we need to reload table data also.
fastdecode_commitarr(dst, &farr, sizeof(upb_strview));
return fastdecode_tagdispatch(d, ptr, msg, table, hasbits, ret.tag);
}
goto again;
case FD_NEXT_OTHERFIELD:
return fastdecode_tagdispatch(d, ptr, msg, table, hasbits, ret.tag);

@ -741,7 +741,7 @@ typedef std::pair<std::string, uint64_t> TableEntry;
void TryFillTableEntry(const protobuf::Descriptor* message,
const MessageLayout& layout,
const protobuf::FieldDescriptor* field,
TableEntry& ent) {
std::vector<TableEntry>& table) {
std::string type = "";
std::string cardinality = "";
protobuf::internal::WireFormatLite::WireType wire_type =
@ -824,6 +824,14 @@ void TryFillTableEntry(const protobuf::Descriptor* message,
// Tag is >2 bytes.
return;
}
int slot = (expected_tag & 0xf8) >> 3;
auto& ent = table[slot];
if (ent.first != "fastdecode_generic") {
// This slot is already populated by another field.
return;
}
MessageLayout::Size offset = layout.GetFieldOffset(field);
// Data is:
@ -895,12 +903,7 @@ std::vector<TableEntry> FastDecodeTable(const protobuf::Descriptor* message,
table.emplace_back(TableEntry{"fastdecode_generic", 0});
}
for (const auto field : FieldHotnessOrder(message)) {
int slot = field->number() & 31;
if (table[slot].first != "fastdecode_generic") {
// This slot is already populated by another field.
continue;
}
TryFillTableEntry(message, layout, field, table[slot]);
TryFillTableEntry(message, layout, field, table);
}
return table;
}

Loading…
Cancel
Save