Cluster table driven parsing tables into hot/lukewarm sections.

PiperOrigin-RevId: 547647821
pull/13299/head
Cong Liu 2 years ago committed by Copybara-Service
parent 5a88981e2d
commit bb61d7e839
  1. 10
      src/google/protobuf/compiler/cpp/helpers.cc
  2. 3
      src/google/protobuf/compiler/cpp/helpers.h
  3. 54
      src/google/protobuf/compiler/cpp/parse_function_generator.cc
  4. 20
      src/google/protobuf/compiler/plugin.pb.h
  5. 5
      src/google/protobuf/cpp_features.pb.h
  6. 150
      src/google/protobuf/descriptor.pb.h

@ -889,7 +889,8 @@ std::string SafeFunctionName(const Descriptor* descriptor,
}
bool IsProfileDriven(const Options& options) {
return options.access_info_map != nullptr;
return !options.bootstrap && !options.opensource_runtime &&
options.access_info_map != nullptr;
}
bool IsRarelyPresent(const FieldDescriptor* field, const Options& options) {
@ -980,6 +981,13 @@ bool ShouldForceAllocationOnConstruction(const Descriptor* desc,
return false;
}
bool IsPresentMessage(const Descriptor* descriptor, const Options& options) {
(void)descriptor;
(void)options;
// Assume that the message is present if there is no profile.
return true;
}
static bool HasRepeatedFields(const Descriptor* descriptor) {
for (int i = 0; i < descriptor->field_count(); ++i) {
if (descriptor->field(i)->label() == FieldDescriptor::LABEL_REPEATED) {

@ -429,6 +429,9 @@ bool ShouldSplit(const FieldDescriptor* field, const Options& options);
bool ShouldForceAllocationOnConstruction(const Descriptor* desc,
const Options& options);
// Returns true if the message is present based on PDProto profile.
bool IsPresentMessage(const Descriptor* descriptor, const Options& options);
// Does the file contain any definitions that need extension_set.h?
bool HasExtensionsOrExtendableMessage(const FileDescriptor* file);

@ -257,20 +257,40 @@ static int FieldNameDataSize(const std::vector<uint8_t>& data) {
return data.empty() ? 0 : data.size() + 1;
}
void ParseFunctionGenerator::GenerateDataDecls(io::Printer* printer) {
void ParseFunctionGenerator::GenerateDataDecls(io::Printer* p) {
if (!should_generate_tctable()) {
return;
}
Formatter format(printer, variables_);
auto v = p->WithVars(variables_);
auto field_num_to_entry_table = MakeNumToEntryTable(ordered_fields_);
format(
"friend class ::$proto_ns$::internal::TcParser;\n"
"static const ::$proto_ns$::internal::"
"TcParseTable<$1$, $2$, $3$, $4$, $5$> _table_;\n",
tc_table_info_->table_size_log2, ordered_fields_.size(),
tc_table_info_->aux_entries.size(),
FieldNameDataSize(tc_table_info_->field_name_data),
field_num_to_entry_table.size16());
p->Emit(
{
{"SECTION",
[&] {
if (!IsProfileDriven(options_)) return;
// Since most (>80%) messages are never present, messages that are
// present are considered hot enough to be clustered together.
if (IsPresentMessage(descriptor_, options_)) {
p->Emit("PROTOBUF_SECTION_VARIABLE(proto_parse_table_hot)");
} else {
p->Emit("PROTOBUF_SECTION_VARIABLE(proto_parse_table_lukewarm)");
}
}},
{"table_size_log2", tc_table_info_->table_size_log2},
{"num_field_entries", ordered_fields_.size()},
{"num_field_aux", tc_table_info_->aux_entries.size()},
{"name_table_size",
FieldNameDataSize(tc_table_info_->field_name_data)},
{"field_lookup_size", field_num_to_entry_table.size16()},
},
R"cc(
friend class ::$proto_ns$::internal::TcParser;
$SECTION$
static const ::$proto_ns$::internal::TcParseTable<
$table_size_log2$, $num_field_entries$, $num_field_aux$,
$name_table_size$, $field_lookup_size$>
_table_;
)cc");
}
void ParseFunctionGenerator::GenerateDataDefinitions(io::Printer* printer) {
@ -602,12 +622,12 @@ void ParseFunctionGenerator::GenerateTailCallTable(Formatter& format) {
format("}}, {{\n");
}
} // ordered_fields_.empty()
{
// field_names[]
auto field_name_scope = format.ScopedIndent();
GenerateFieldNames(format);
}
format("}},\n");
{
// field_names[]
auto field_name_scope = format.ScopedIndent();
GenerateFieldNames(format);
}
format("}},\n");
}
format("};\n\n"); // _table_
}
@ -615,7 +635,7 @@ void ParseFunctionGenerator::GenerateTailCallTable(Formatter& format) {
void ParseFunctionGenerator::GenerateFastFieldEntries(Formatter& format) {
for (const auto& info : tc_table_info_->fast_path_fields) {
if (info.field != nullptr) {
PrintFieldComment(format, info.field, options_);
PrintFieldComment(format, info.field, options_);
}
if (info.func_name.empty()) {
format("{::_pbi::TcParser::MiniParse, {}},\n");

@ -313,7 +313,10 @@ class PROTOC_EXPORT Version final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<2, 4, 0, 47, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
2, 4, 0,
47, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -565,7 +568,10 @@ class PROTOC_EXPORT CodeGeneratorRequest final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<3, 5, 3, 79, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
3, 5, 3,
79, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -787,7 +793,10 @@ class PROTOC_EXPORT CodeGeneratorResponse_File final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<2, 4, 1, 86, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
2, 4, 1,
86, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -1009,7 +1018,10 @@ class PROTOC_EXPORT CodeGeneratorResponse final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<2, 3, 1, 60, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
2, 3, 1,
60, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;

@ -219,7 +219,10 @@ class PROTOBUF_EXPORT CppFeatures final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<0, 1, 0, 0, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
0, 1, 0,
0, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;

@ -862,7 +862,10 @@ class PROTOBUF_EXPORT FileDescriptorSet final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<0, 1, 1, 0, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
0, 1, 1,
0, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -1256,7 +1259,10 @@ class PROTOBUF_EXPORT FileDescriptorProto final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<4, 13, 6, 86, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
4, 13, 6,
86, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -1456,7 +1462,10 @@ class PROTOBUF_EXPORT DescriptorProto_ExtensionRange final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<2, 3, 1, 0, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
2, 3, 1,
0, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -1630,7 +1639,10 @@ class PROTOBUF_EXPORT DescriptorProto_ReservedRange final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<1, 2, 0, 0, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
1, 2, 0,
0, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -1978,7 +1990,10 @@ class PROTOBUF_EXPORT DescriptorProto final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<4, 10, 8, 65, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
4, 10, 8,
65, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -2207,7 +2222,10 @@ class PROTOBUF_EXPORT ExtensionRangeOptions_Declaration final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<3, 5, 0, 71, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
3, 5, 0,
71, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -2598,7 +2616,10 @@ class PROTOBUF_EXPORT ExtensionRangeOptions final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<3, 4, 4, 0, 12> _table_;
static const ::google::protobuf::internal::TcParseTable<
3, 4, 4,
0, 12>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -2974,7 +2995,10 @@ class PROTOBUF_EXPORT FieldDescriptorProto final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<4, 11, 3, 96, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
4, 11, 3,
96, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -3166,7 +3190,10 @@ class PROTOBUF_EXPORT OneofDescriptorProto final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<1, 2, 1, 49, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
1, 2, 1,
49, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -3339,7 +3366,10 @@ class PROTOBUF_EXPORT EnumDescriptorProto_EnumReservedRange final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<1, 2, 0, 0, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
1, 2, 0,
0, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -3591,7 +3621,10 @@ class PROTOBUF_EXPORT EnumDescriptorProto final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<3, 5, 3, 61, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
3, 5, 3,
61, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -3789,7 +3822,10 @@ class PROTOBUF_EXPORT EnumValueDescriptorProto final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<2, 3, 1, 53, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
2, 3, 1,
53, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -3992,7 +4028,10 @@ class PROTOBUF_EXPORT ServiceDescriptorProto final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<2, 3, 2, 51, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
2, 3, 2,
51, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -4236,7 +4275,10 @@ class PROTOBUF_EXPORT MethodDescriptorProto final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<3, 6, 1, 71, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
3, 6, 1,
71, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -4896,7 +4938,10 @@ class PROTOBUF_EXPORT FileOptions final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<5, 22, 3, 202, 12> _table_;
static const ::google::protobuf::internal::TcParseTable<
5, 22, 3,
202, 12>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -5313,7 +5358,10 @@ class PROTOBUF_EXPORT MessageOptions final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<3, 7, 2, 0, 7> _table_;
static const ::google::protobuf::internal::TcParseTable<
3, 7, 2,
0, 7>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -5505,7 +5553,10 @@ class PROTOBUF_EXPORT FieldOptions_EditionDefault final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<1, 2, 0, 64, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
1, 2, 0,
64, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -6080,7 +6131,10 @@ class PROTOBUF_EXPORT FieldOptions final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<4, 13, 7, 0, 7> _table_;
static const ::google::protobuf::internal::TcParseTable<
4, 13, 7,
0, 7>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -6428,7 +6482,10 @@ class PROTOBUF_EXPORT OneofOptions final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<2, 2, 2, 0, 7> _table_;
static const ::google::protobuf::internal::TcParseTable<
2, 2, 2,
0, 7>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -6801,7 +6858,10 @@ class PROTOBUF_EXPORT EnumOptions final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<3, 5, 2, 0, 7> _table_;
static const ::google::protobuf::internal::TcParseTable<
3, 5, 2,
0, 7>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -7165,7 +7225,10 @@ class PROTOBUF_EXPORT EnumValueOptions final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<3, 4, 2, 0, 7> _table_;
static const ::google::protobuf::internal::TcParseTable<
3, 4, 2,
0, 7>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -7516,7 +7579,10 @@ class PROTOBUF_EXPORT ServiceOptions final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<2, 3, 2, 0, 12> _table_;
static const ::google::protobuf::internal::TcParseTable<
2, 3, 2,
0, 12>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -7899,7 +7965,10 @@ class PROTOBUF_EXPORT MethodOptions final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<3, 4, 3, 0, 12> _table_;
static const ::google::protobuf::internal::TcParseTable<
3, 4, 3,
0, 12>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -8082,7 +8151,10 @@ class PROTOBUF_EXPORT UninterpretedOption_NamePart final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<1, 2, 0, 62, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
1, 2, 0,
62, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -8342,7 +8414,10 @@ class PROTOBUF_EXPORT UninterpretedOption final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<3, 7, 1, 75, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
3, 7, 1,
75, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -8863,7 +8938,10 @@ class PROTOBUF_EXPORT FeatureSet final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<3, 7, 7, 0, 7> _table_;
static const ::google::protobuf::internal::TcParseTable<
3, 7, 7,
0, 7>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -9122,7 +9200,10 @@ class PROTOBUF_EXPORT SourceCodeInfo_Location final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<3, 5, 0, 106, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
3, 5, 0,
106, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -9297,7 +9378,10 @@ class PROTOBUF_EXPORT SourceCodeInfo final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<0, 1, 1, 0, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
0, 1, 1,
0, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -9538,7 +9622,10 @@ class PROTOBUF_EXPORT GeneratedCodeInfo_Annotation final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<3, 5, 1, 64, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
3, 5, 1,
64, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;
@ -9712,7 +9799,10 @@ class PROTOBUF_EXPORT GeneratedCodeInfo final :
class _Internal;
friend class ::google::protobuf::internal::TcParser;
static const ::google::protobuf::internal::TcParseTable<0, 1, 1, 0, 2> _table_;
static const ::google::protobuf::internal::TcParseTable<
0, 1, 1,
0, 2>
_table_;
template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
typedef void InternalArenaConstructable_;
typedef void DestructorSkippable_;

Loading…
Cancel
Save