upb: first attempt at implementing name mangling for minitable symbols

PiperOrigin-RevId: 571636273
diff --git a/python/descriptor.c b/python/descriptor.c
index d1726e4..2e4c447 100644
--- a/python/descriptor.c
+++ b/python/descriptor.c
@@ -369,7 +369,7 @@
 static PyObject* PyUpb_Descriptor_GetOptions(PyObject* _self, PyObject* args) {
   PyUpb_DescriptorBase* self = (void*)_self;
   return PyUpb_DescriptorBase_GetOptions(
-      self, upb_MessageDef_Options(self->def), &google_protobuf_MessageOptions_msg_init,
+      self, upb_MessageDef_Options(self->def), &google__protobuf__MessageOptions_msg_init,
       PYUPB_DESCRIPTOR_PROTO_PACKAGE ".MessageOptions");
 }
 
@@ -377,7 +377,7 @@
                                               PyObject* py_proto) {
   return PyUpb_DescriptorBase_CopyToProto(
       _self, (PyUpb_ToProto_Func*)&upb_MessageDef_ToProto,
-      &google_protobuf_DescriptorProto_msg_init,
+      &google__protobuf__DescriptorProto_msg_init,
       PYUPB_DESCRIPTOR_PROTO_PACKAGE ".DescriptorProto", py_proto);
 }
 
@@ -793,7 +793,7 @@
                                                  PyObject* args) {
   PyUpb_DescriptorBase* self = (void*)_self;
   return PyUpb_DescriptorBase_GetOptions(
-      self, upb_EnumDef_Options(self->def), &google_protobuf_EnumOptions_msg_init,
+      self, upb_EnumDef_Options(self->def), &google__protobuf__EnumOptions_msg_init,
       PYUPB_DESCRIPTOR_PROTO_PACKAGE ".EnumOptions");
 }
 
@@ -801,7 +801,7 @@
                                                   PyObject* py_proto) {
   return PyUpb_DescriptorBase_CopyToProto(
       _self, (PyUpb_ToProto_Func*)&upb_EnumDef_ToProto,
-      &google_protobuf_EnumDescriptorProto_msg_init,
+      &google__protobuf__EnumDescriptorProto_msg_init,
       PYUPB_DESCRIPTOR_PROTO_PACKAGE ".EnumDescriptorProto", py_proto);
 }
 
@@ -884,7 +884,7 @@
   PyUpb_DescriptorBase* self = (void*)_self;
   return PyUpb_DescriptorBase_GetOptions(
       self, upb_EnumValueDef_Options(self->def),
-      &google_protobuf_EnumValueOptions_msg_init,
+      &google__protobuf__EnumValueOptions_msg_init,
       PYUPB_DESCRIPTOR_PROTO_PACKAGE ".EnumValueOptions");
 }
 
@@ -1084,7 +1084,7 @@
                                                   PyObject* args) {
   PyUpb_DescriptorBase* self = (void*)_self;
   return PyUpb_DescriptorBase_GetOptions(
-      self, upb_FieldDef_Options(self->def), &google_protobuf_FieldOptions_msg_init,
+      self, upb_FieldDef_Options(self->def), &google__protobuf__FieldOptions_msg_init,
       PYUPB_DESCRIPTOR_PROTO_PACKAGE ".FieldOptions");
 }
 
@@ -1222,7 +1222,7 @@
                                                       void* closure) {
   return PyUpb_DescriptorBase_GetSerializedProto(
       self, (PyUpb_ToProto_Func*)&upb_FileDef_ToProto,
-      &google_protobuf_FileDescriptorProto_msg_init);
+      &google__protobuf__FileDescriptorProto_msg_init);
 }
 
 static PyObject* PyUpb_FileDescriptor_GetMessageTypesByName(PyObject* _self,
@@ -1325,7 +1325,7 @@
                                                  PyObject* args) {
   PyUpb_DescriptorBase* self = (void*)_self;
   return PyUpb_DescriptorBase_GetOptions(
-      self, upb_FileDef_Options(self->def), &google_protobuf_FileOptions_msg_init,
+      self, upb_FileDef_Options(self->def), &google__protobuf__FileOptions_msg_init,
       PYUPB_DESCRIPTOR_PROTO_PACKAGE ".FileOptions");
 }
 
@@ -1333,7 +1333,7 @@
                                                   PyObject* py_proto) {
   return PyUpb_DescriptorBase_CopyToProto(
       _self, (PyUpb_ToProto_Func*)&upb_FileDef_ToProto,
-      &google_protobuf_FileDescriptorProto_msg_init,
+      &google__protobuf__FileDescriptorProto_msg_init,
       PYUPB_DESCRIPTOR_PROTO_PACKAGE ".FileDescriptorProto", py_proto);
 }
 
@@ -1445,7 +1445,7 @@
                                                    PyObject* args) {
   PyUpb_DescriptorBase* self = (void*)_self;
   return PyUpb_DescriptorBase_GetOptions(
-      self, upb_MethodDef_Options(self->def), &google_protobuf_MethodOptions_msg_init,
+      self, upb_MethodDef_Options(self->def), &google__protobuf__MethodOptions_msg_init,
       PYUPB_DESCRIPTOR_PROTO_PACKAGE ".MethodOptions");
 }
 
@@ -1453,7 +1453,7 @@
                                                     PyObject* py_proto) {
   return PyUpb_DescriptorBase_CopyToProto(
       _self, (PyUpb_ToProto_Func*)&upb_MethodDef_ToProto,
-      &google_protobuf_MethodDescriptorProto_msg_init,
+      &google__protobuf__MethodDescriptorProto_msg_init,
       PYUPB_DESCRIPTOR_PROTO_PACKAGE ".MethodDescriptorProto", py_proto);
 }
 
@@ -1549,7 +1549,7 @@
                                                   PyObject* args) {
   PyUpb_DescriptorBase* self = (void*)_self;
   return PyUpb_DescriptorBase_GetOptions(
-      self, upb_OneofDef_Options(self->def), &google_protobuf_OneofOptions_msg_init,
+      self, upb_OneofDef_Options(self->def), &google__protobuf__OneofOptions_msg_init,
       PYUPB_DESCRIPTOR_PROTO_PACKAGE ".OneofOptions");
 }
 
@@ -1649,7 +1649,7 @@
                                                     PyObject* args) {
   PyUpb_DescriptorBase* self = (void*)_self;
   return PyUpb_DescriptorBase_GetOptions(
-      self, upb_ServiceDef_Options(self->def), &google_protobuf_ServiceOptions_msg_init,
+      self, upb_ServiceDef_Options(self->def), &google__protobuf__ServiceOptions_msg_init,
       PYUPB_DESCRIPTOR_PROTO_PACKAGE ".ServiceOptions");
 }
 
@@ -1657,7 +1657,7 @@
                                                      PyObject* py_proto) {
   return PyUpb_DescriptorBase_CopyToProto(
       _self, (PyUpb_ToProto_Func*)&upb_ServiceDef_ToProto,
-      &google_protobuf_ServiceDescriptorProto_msg_init,
+      &google__protobuf__ServiceDescriptorProto_msg_init,
       PYUPB_DESCRIPTOR_PROTO_PACKAGE ".ServiceDescriptorProto", py_proto);
 }
 
diff --git a/upb/message/BUILD b/upb/message/BUILD
index c357549..72a4500 100644
--- a/upb/message/BUILD
+++ b/upb/message/BUILD
@@ -7,6 +7,10 @@
 
 load("//bazel:build_defs.bzl", "UPB_DEFAULT_COPTS")
 load(
+    "//bazel:upb_minitable_proto_library.bzl",
+    "upb_minitable_proto_library",
+)
+load(
     "//bazel:upb_proto_library.bzl",
     "upb_proto_library",
     "upb_proto_reflection_library",
@@ -154,11 +158,11 @@
         ":accessors_internal",
         ":internal",
         ":message",
+        ":tagged_ptr",
         ":types",
         "//upb:base",
         "//upb:eps_copy_input_stream",
         "//upb:mem",
-        "//upb:message_tagged_ptr",
         "//upb:mini_table",
         "//upb:mini_table_internal",
         "//upb:port",
@@ -225,6 +229,12 @@
     deps = ["//src/google/protobuf:test_messages_proto3_proto"],
 )
 
+upb_minitable_proto_library(
+    name = "message_test_upb_minitable_proto",
+    testonly = 1,
+    deps = [":message_test_proto"],
+)
+
 upb_proto_library(
     name = "message_test_upb_proto",
     testonly = 1,
@@ -246,12 +256,15 @@
         "//:protobuf",
         "@com_google_googletest//:gtest_main",
         "//upb:base",
+        "//upb:mem",
         "//upb:mini_descriptor",
         "//upb:mini_descriptor_internal",
         "//upb:mini_table",
         "//upb:port",
         "//upb:wire",
+        "//upb/test:test_messages_proto2_upb_minitable",
         "//upb/test:test_messages_proto2_upb_proto",
+        "//upb/test:test_messages_proto3_upb_minitable",
         "//upb/test:test_messages_proto3_upb_proto",
         "//upb/test:test_upb_proto",
         "@com_google_absl//absl/container:flat_hash_set",
@@ -283,8 +296,8 @@
         "//upb:mem",
         "//upb:mini_table",
         "//upb:wire",
+        "//upb/test:test_messages_proto2_upb_minitable",
         "//upb/test:test_messages_proto2_upb_proto",
-        "//upb/test:test_messages_proto3_upb_proto",
         "//upb/test:test_upb_proto",
         "@com_google_absl//absl/container:flat_hash_set",
     ],
@@ -307,18 +320,22 @@
     deps = [
         ":accessors",
         ":copy",
+        ":internal",
         ":message",
         ":promote",
+        ":tagged_ptr",
         "//:protobuf",
         "@com_google_googletest//:gtest_main",
         "//upb:base",
         "//upb:mem",
+        "//upb:mini_descriptor",
         "//upb:mini_descriptor_internal",
         "//upb:mini_table",
         "//upb:port",
         "//upb:wire",
         "//upb/test:test_messages_proto2_upb_proto",
         "//upb/test:test_messages_proto3_upb_proto",
+        "//upb/test:test_proto_upb_minitable",
         "//upb/test:test_upb_proto",
         "@com_google_absl//absl/container:flat_hash_set",
     ],
@@ -330,12 +347,16 @@
     name = "test",
     srcs = ["test.cc"],
     deps = [
+        ":message_test_upb_minitable_proto",
         ":message_test_upb_proto",
         ":message_test_upb_proto_reflection",
+        ":value",
         "@com_google_googletest//:gtest_main",
         "//upb:base",
         "//upb:json",
         "//upb:mem",
+        "//upb:message",
+        "//upb:mini_table",
         "//upb:reflection",
         "//upb:wire",
         "//upb/test:fuzz_util",
@@ -350,6 +371,12 @@
     deps = ["//src/google/protobuf:test_messages_proto3_proto"],
 )
 
+upb_minitable_proto_library(
+    name = "utf8_test_upb_minitable_proto",
+    testonly = 1,
+    deps = [":utf8_test_proto"],
+)
+
 upb_proto_library(
     name = "utf8_test_upb_proto",
     testonly = 1,
@@ -360,6 +387,7 @@
     name = "utf8_test",
     srcs = ["utf8_test.cc"],
     deps = [
+        ":utf8_test_upb_minitable_proto",
         ":utf8_test_upb_proto",
         "@com_google_googletest//:gtest_main",
         "//upb:base",
diff --git a/upb/message/accessors_test.cc b/upb/message/accessors_test.cc
index e6a934c..50c3921 100644
--- a/upb/message/accessors_test.cc
+++ b/upb/message/accessors_test.cc
@@ -13,18 +13,28 @@
 
 #include "upb/message/accessors.h"
 
+#include <string.h>
+
+#include <cstddef>
+#include <cstdint>
 #include <string>
 
 #include <gtest/gtest.h>
 #include "google/protobuf/test_messages_proto2.upb.h"
+#include "google/protobuf/test_messages_proto2.upb_minitable.h"
 #include "google/protobuf/test_messages_proto3.upb.h"
+#include "google/protobuf/test_messages_proto3.upb_minitable.h"
+#include "upb/base/descriptor_constants.h"
+#include "upb/base/status.h"
 #include "upb/base/string_view.h"
+#include "upb/mem/arena.h"
 #include "upb/message/array.h"
+#include "upb/message/message.h"
 #include "upb/mini_descriptor/decode.h"
 #include "upb/mini_descriptor/internal/encode.hpp"
 #include "upb/mini_descriptor/internal/modifiers.h"
-#include "upb/test/test.upb.h"
-#include "upb/wire/decode.h"
+#include "upb/mini_table/field.h"
+#include "upb/mini_table/message.h"
 
 // Must be last
 #include "upb/port/def.inc"
@@ -53,12 +63,14 @@
 
 const upb_MiniTableField* find_proto3_field(int field_number) {
   return upb_MiniTable_FindFieldByNumber(
-      &protobuf_test_messages_proto3_TestAllTypesProto3_msg_init, field_number);
+      &protobuf_0test_0messages__proto3__TestAllTypesProto3_msg_init,
+      field_number);
 }
 
 const upb_MiniTableField* find_proto2_field(int field_number) {
   return upb_MiniTable_FindFieldByNumber(
-      &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init, field_number);
+      &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init,
+      field_number);
 }
 
 TEST(GeneratedCode, HazzersProto2) {
@@ -265,7 +277,7 @@
 
   const upb_MiniTableField* nested_message_a_field =
       upb_MiniTable_FindFieldByNumber(
-          &protobuf_test_messages_proto2_TestAllTypesProto2_NestedMessage_msg_init,
+          &protobuf_0test_0messages__proto2__TestAllTypesProto2__NestedMessage_msg_init,
           kFieldOptionalNestedMessageA);
   EXPECT_EQ(5, upb_Message_GetInt32(sub_message, nested_message_a_field, 0));
 
@@ -281,11 +293,11 @@
   upb_Message_SetInt32(new_nested_message, nested_message_a_field, 123,
                        nullptr);
   upb_Message_SetMessage(
-      msg, &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init,
+      msg, &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init,
       optional_message_field, new_nested_message);
 
   upb_Message* mutable_message = upb_Message_GetOrCreateMutableMessage(
-      msg, &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init,
+      msg, &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init,
       optional_message_field, arena);
   EXPECT_EQ(
       true,
@@ -358,10 +370,10 @@
   const upb_MiniTableField* optional_message_field =
       find_proto2_field(kFieldOptionalNestedMessage);
   upb_Message* msg1 = upb_Message_GetOrCreateMutableMessage(
-      msg, &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init,
+      msg, &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init,
       optional_message_field, arena);
   upb_Message* msg2 = upb_Message_GetOrCreateMutableMessage(
-      msg, &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init,
+      msg, &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init,
       optional_message_field, arena);
   // Verify that newly constructed sub message is stored in msg.
   EXPECT_EQ(msg1, msg2);
diff --git a/upb/message/copy_test.cc b/upb/message/copy_test.cc
index febeeab..ad50f66 100644
--- a/upb/message/copy_test.cc
+++ b/upb/message/copy_test.cc
@@ -21,12 +21,14 @@
 
 #include <gtest/gtest.h>
 #include "google/protobuf/test_messages_proto2.upb.h"
+#include "google/protobuf/test_messages_proto2.upb_minitable.h"
 #include "upb/base/string_view.h"
 #include "upb/mem/arena.h"
 #include "upb/message/accessors.h"
 #include "upb/message/internal/message.h"
 #include "upb/message/map.h"
 #include "upb/message/message.h"
+#include "upb/mini_table/field.h"
 #include "upb/mini_table/message.h"
 #include "upb/wire/encode.h"
 
@@ -44,7 +46,8 @@
 
 const upb_MiniTableField* find_proto2_field(int field_number) {
   return upb_MiniTable_FindFieldByNumber(
-      &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init, field_number);
+      &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init,
+      field_number);
 }
 
 TEST(GeneratedCode, DeepCloneMessageScalarAndString) {
@@ -66,7 +69,7 @@
   upb_Arena* arena = upb_Arena_New();
   protobuf_test_messages_proto2_TestAllTypesProto2* clone =
       (protobuf_test_messages_proto2_TestAllTypesProto2*)upb_Message_DeepClone(
-          msg, &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init,
+          msg, &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init,
           arena);
   // After cloning overwrite values and destroy source arena for MSAN.
   memset(string_in_arena, 0, sizeof(kTestStr1));
@@ -97,12 +100,12 @@
   protobuf_test_messages_proto2_TestAllTypesProto2_NestedMessage_set_a(
       nested, kTestNestedInt32);
   upb_Message_SetMessage(
-      msg, &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init,
+      msg, &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init,
       nested_message_field, nested);
   upb_Arena* arena = upb_Arena_New();
   protobuf_test_messages_proto2_TestAllTypesProto2* clone =
       (protobuf_test_messages_proto2_TestAllTypesProto2*)upb_Message_DeepClone(
-          msg, &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init,
+          msg, &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init,
           arena);
   // After cloning overwrite values and destroy source arena for MSAN.
   protobuf_test_messages_proto2_TestAllTypesProto2_NestedMessage_set_a(nested,
@@ -132,7 +135,7 @@
   upb_Arena* arena = upb_Arena_New();
   protobuf_test_messages_proto2_TestAllTypesProto2* clone =
       (protobuf_test_messages_proto2_TestAllTypesProto2*)upb_Message_DeepClone(
-          msg, &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init,
+          msg, &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init,
           arena);
   protobuf_test_messages_proto2_TestAllTypesProto2_clear_repeated_sint32(msg);
   upb_Arena_Free(source_arena);
@@ -171,7 +174,7 @@
   upb_Arena* arena = upb_Arena_New();
   protobuf_test_messages_proto2_TestAllTypesProto2* clone =
       (protobuf_test_messages_proto2_TestAllTypesProto2*)upb_Message_DeepClone(
-          msg, &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init,
+          msg, &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init,
           arena);
   protobuf_test_messages_proto2_TestAllTypesProto2_NestedMessage_set_a(nested,
                                                                        0);
@@ -248,7 +251,7 @@
       (protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrect*)
           upb_Message_DeepClone(
               msg,
-              &protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrect_msg_init,
+              &protobuf_0test_0messages__proto2__TestAllTypesProto2__MessageSetCorrect_msg_init,
               arena);
 
   // Mutate original extension.
@@ -291,10 +294,10 @@
   size_t len;
   char* data;
   upb_Arena* encode_arena = upb_Arena_New();
-  upb_EncodeStatus status =
-      upb_Encode(unknown_source,
-                 &protobuf_test_messages_proto2_UnknownToTestAllTypes_msg_init,
-                 kUpb_EncodeOption_CheckRequired, encode_arena, &data, &len);
+  upb_EncodeStatus status = upb_Encode(
+      unknown_source,
+      &protobuf_0test_0messages__proto2__UnknownToTestAllTypes_msg_init,
+      kUpb_EncodeOption_CheckRequired, encode_arena, &data, &len);
   ASSERT_EQ(status, kUpb_EncodeStatus_Ok);
   std::string unknown_data(data, len);
   // Add unknown data.
@@ -303,7 +306,7 @@
   upb_Arena* clone_arena = upb_Arena_New();
   protobuf_test_messages_proto2_TestAllTypesProto2* clone =
       (protobuf_test_messages_proto2_TestAllTypesProto2*)upb_Message_DeepClone(
-          msg, &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init,
+          msg, &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init,
           clone_arena);
   upb_Arena_Free(source_arena);
   upb_Arena_Free(unknown_arena);
diff --git a/upb/message/promote_test.cc b/upb/message/promote_test.cc
index 2b86f95..1bfbb15 100644
--- a/upb/message/promote_test.cc
+++ b/upb/message/promote_test.cc
@@ -13,20 +13,37 @@
 
 #include "upb/message/promote.h"
 
+#include <string.h>
+
+#include <cstddef>
+#include <cstdint>
 #include <string>
 
 #include <gtest/gtest.h>
-#include "google/protobuf/test_messages_proto2.upb.h"
-#include "google/protobuf/test_messages_proto3.upb.h"
+#include "upb/base/descriptor_constants.h"
+#include "upb/base/status.h"
 #include "upb/base/string_view.h"
+#include "upb/mem/arena.h"
 #include "upb/mem/arena.hpp"
 #include "upb/message/accessors.h"
 #include "upb/message/array.h"
 #include "upb/message/copy.h"
+#include "upb/message/internal/extension.h"
+#include "upb/message/internal/message.h"
+#include "upb/message/map.h"
+#include "upb/message/message.h"
+#include "upb/message/tagged_ptr.h"
+#include "upb/mini_descriptor/decode.h"
 #include "upb/mini_descriptor/internal/encode.hpp"
 #include "upb/mini_descriptor/internal/modifiers.h"
+#include "upb/mini_descriptor/link.h"
+#include "upb/mini_table/field.h"
+#include "upb/mini_table/message.h"
+#include "upb/mini_table/sub.h"
 #include "upb/test/test.upb.h"
+#include "upb/test/test.upb_minitable.h"
 #include "upb/wire/decode.h"
+#include "upb/wire/encode.h"
 
 // Must be last
 #include "upb/port/def.inc"
@@ -349,7 +366,7 @@
   // Update mini table and promote unknown to a message.
   EXPECT_TRUE(
       upb_MiniTable_SetSubMessage(mini_table, (upb_MiniTableField*)submsg_field,
-                                  &upb_test_ModelWithExtensions_msg_init));
+                                  &upb_0test__ModelWithExtensions_msg_init));
 
   const int decode_options =
       upb_DecodeOptions_MaxDepth(0);  // UPB_DECODE_ALIAS disabled.
@@ -397,7 +414,7 @@
       upb_MiniTable_FindFieldByNumber(mini_table, 5);
   EXPECT_TRUE(
       upb_MiniTable_SetSubMessage(mini_table, (upb_MiniTableField*)submsg_field,
-                                  &upb_test_ModelWithExtensions_msg_init));
+                                  &upb_0test__ModelWithExtensions_msg_init));
 
   const int decode_options =
       upb_DecodeOptions_MaxDepth(0);  // UPB_DECODE_ALIAS disabled.
@@ -447,7 +464,7 @@
       upb_MiniTable_FindFieldByNumber(mini_table, 5);
   EXPECT_TRUE(
       upb_MiniTable_SetSubMessage(mini_table, (upb_MiniTableField*)submsg_field,
-                                  &upb_test_ModelWithExtensions_msg_init));
+                                  &upb_0test__ModelWithExtensions_msg_init));
 
   // Parse again.  This will promote the message.  An explicit promote will not
   // be required.
@@ -526,11 +543,11 @@
   // Update mini table and promote unknown to a message.
   EXPECT_TRUE(upb_MiniTable_SetSubMessage(
       mini_table, (upb_MiniTableField*)repeated_field,
-      &upb_test_ModelWithExtensions_msg_init));
+      &upb_0test__ModelWithExtensions_msg_init));
   const int decode_options =
       upb_DecodeOptions_MaxDepth(0);  // UPB_DECODE_ALIAS disabled.
   upb_DecodeStatus promote_result =
-      upb_Array_PromoteMessages(array, &upb_test_ModelWithExtensions_msg_init,
+      upb_Array_PromoteMessages(array, &upb_0test__ModelWithExtensions_msg_init,
                                 decode_options, arena.ptr());
   EXPECT_EQ(promote_result, kUpb_DecodeStatus_Ok);
   const upb_Message* promoted_message = upb_Array_Get(array, 0).msg_val;
@@ -597,9 +614,9 @@
   upb_MiniTableField* entry_value = const_cast<upb_MiniTableField*>(
       upb_MiniTable_FindFieldByNumber(entry, 2));
   upb_MiniTable_SetSubMessage(entry, entry_value,
-                              &upb_test_ModelWithExtensions_msg_init);
+                              &upb_0test__ModelWithExtensions_msg_init);
   upb_DecodeStatus promote_result = upb_Map_PromoteMessages(
-      map, &upb_test_ModelWithExtensions_msg_init, 0, arena.ptr());
+      map, &upb_0test__ModelWithExtensions_msg_init, 0, arena.ptr());
   EXPECT_EQ(promote_result, kUpb_DecodeStatus_Ok);
 
   upb_MessageValue key;
@@ -706,13 +723,13 @@
   // Update mini table and promote unknown to a message.
   EXPECT_TRUE(upb_MiniTable_SetSubMessage(
       mini_table, (upb_MiniTableField*)&mini_table->fields[1],
-      &upb_test_ModelWithExtensions_msg_init));
+      &upb_0test__ModelWithExtensions_msg_init));
   const int decode_options =
       upb_DecodeOptions_MaxDepth(0);  // UPB_DECODE_ALIAS disabled.
   upb_UnknownToMessageRet promote_result =
       upb_MiniTable_PromoteUnknownToMessage(
           msg, mini_table, &mini_table->fields[1],
-          &upb_test_ModelWithExtensions_msg_init, decode_options, arena);
+          &upb_0test__ModelWithExtensions_msg_init, decode_options, arena);
   EXPECT_EQ(promote_result.status, kUpb_UnknownToMessage_Ok);
   const upb_Message* promoted_message =
       upb_Message_GetMessage(msg, &mini_table->fields[1], nullptr);
@@ -755,12 +772,12 @@
   // Update mini table and promote unknown to a message.
   EXPECT_TRUE(upb_MiniTable_SetSubMessage(
       mini_table, (upb_MiniTableField*)&mini_table->fields[2],
-      &upb_test_ModelWithExtensions_msg_init));
+      &upb_0test__ModelWithExtensions_msg_init));
   const int decode_options =
       upb_DecodeOptions_MaxDepth(0);  // UPB_DECODE_ALIAS disabled.
   upb_UnknownToMessage_Status promote_result =
       upb_MiniTable_PromoteUnknownToMessageArray(
-          msg, &mini_table->fields[2], &upb_test_ModelWithExtensions_msg_init,
+          msg, &mini_table->fields[2], &upb_0test__ModelWithExtensions_msg_init,
           decode_options, arena);
   EXPECT_EQ(promote_result, kUpb_UnknownToMessage_Ok);
 
diff --git a/upb/message/test.cc b/upb/message/test.cc
index d28f60a..97ebef0 100644
--- a/upb/message/test.cc
+++ b/upb/message/test.cc
@@ -5,21 +5,34 @@
 // license that can be found in the LICENSE file or at
 // https://developers.google.com/open-source/licenses/bsd
 
+#include <cstddef>
+#include <cstdint>
 #include <string>
 #include <string_view>
+#include <vector>
 
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
 #include "google/protobuf/test_messages_proto3.upb.h"
 #include "upb/base/status.hpp"
+#include "upb/base/string_view.h"
 #include "upb/json/decode.h"
 #include "upb/json/encode.h"
+#include "upb/mem/arena.h"
 #include "upb/mem/arena.hpp"
+#include "upb/message/message.h"
 #include "upb/message/test.upb.h"
+#include "upb/message/test.upb_minitable.h"
 #include "upb/message/test.upbdefs.h"
+#include "upb/message/value.h"
+#include "upb/mini_table/extension_registry.h"
+#include "upb/mini_table/message.h"
+#include "upb/reflection/def.h"
 #include "upb/reflection/def.hpp"
+#include "upb/reflection/message.h"
 #include "upb/test/fuzz_util.h"
 #include "upb/wire/decode.h"
+#include "upb/wire/encode.h"
 
 // begin:google_only
 // #include "testing/fuzzing/fuzztest.h"
@@ -300,7 +313,7 @@
   // Fails, because required fields are missing.
   EXPECT_EQ(
       kUpb_DecodeStatus_MissingRequired,
-      upb_Decode(nullptr, 0, test_msg, &upb_test_TestRequiredFields_msg_init,
+      upb_Decode(nullptr, 0, test_msg, &upb_0test__TestRequiredFields_msg_init,
                  nullptr, kUpb_DecodeOption_CheckRequired, arena.ptr()));
 
   upb_test_TestRequiredFields_set_required_int32(test_msg, 1);
@@ -314,7 +327,7 @@
   // payload is not empty.
   EXPECT_EQ(kUpb_DecodeStatus_MissingRequired,
             upb_Decode(serialized, size, test_msg,
-                       &upb_test_TestRequiredFields_msg_init, nullptr,
+                       &upb_0test__TestRequiredFields_msg_init, nullptr,
                        kUpb_DecodeOption_CheckRequired, arena.ptr()));
 
   empty_msg = upb_test_EmptyMessage_new(arena.ptr());
@@ -325,7 +338,7 @@
   // Succeeds, because required fields are present (though not in the input).
   EXPECT_EQ(
       kUpb_DecodeStatus_Ok,
-      upb_Decode(nullptr, 0, test_msg, &upb_test_TestRequiredFields_msg_init,
+      upb_Decode(nullptr, 0, test_msg, &upb_0test__TestRequiredFields_msg_init,
                  nullptr, kUpb_DecodeOption_CheckRequired, arena.ptr()));
 
   // Serialize a complete payload.
@@ -344,7 +357,7 @@
       test_msg2, upb_test_TestRequiredFields_new(arena.ptr()));
   EXPECT_EQ(kUpb_DecodeStatus_Ok,
             upb_Decode(serialized, size, test_msg2,
-                       &upb_test_TestRequiredFields_msg_init, nullptr,
+                       &upb_0test__TestRequiredFields_msg_init, nullptr,
                        kUpb_DecodeOption_CheckRequired, arena.ptr()));
 }
 
diff --git a/upb/message/utf8_test.cc b/upb/message/utf8_test.cc
index 5f63bb2..cba8953 100644
--- a/upb/message/utf8_test.cc
+++ b/upb/message/utf8_test.cc
@@ -35,6 +35,7 @@
 #include "upb/mem/arena.h"
 #include "upb/mem/arena.hpp"
 #include "upb/message/utf8_test.upb.h"
+#include "upb/message/utf8_test.upb_minitable.h"
 #include "upb/wire/decode.h"
 
 namespace {
@@ -69,7 +70,7 @@
       upb_test_TestUtf8Proto3String_new(arena.ptr());
 
   upb_DecodeStatus status =
-      upb_Decode(data, size, msg, &upb_test_TestUtf8Proto3String_msg_init,
+      upb_Decode(data, size, msg, &upb_0test__TestUtf8Proto3String_msg_init,
                  nullptr, 0, arena.ptr());
 
   // Parse fails, because proto3 string fields validate UTF-8.
@@ -85,8 +86,8 @@
       upb_test_TestUtf8RepeatedProto3String_new(arena.ptr());
 
   upb_DecodeStatus status = upb_Decode(
-      data, size, msg, &upb_test_TestUtf8RepeatedProto3String_msg_init, nullptr,
-      0, arena.ptr());
+      data, size, msg, &upb_0test__TestUtf8RepeatedProto3String_msg_init,
+      nullptr, 0, arena.ptr());
 
   // Parse fails, because proto3 string fields validate UTF-8.
   ASSERT_EQ(kUpb_DecodeStatus_BadUtf8, status);
@@ -101,9 +102,9 @@
 //   upb_test_TestUtf8Proto3StringMixed* msg =
 //       upb_test_TestUtf8Proto3StringMixed_new(arena.ptr());
 //
-//   upb_DecodeStatus status =
-//       upb_Decode(data, size, msg, &upb_test_TestUtf8Proto3StringMixed_msg_init,
-//                  nullptr, 0, arena.ptr());
+//   upb_DecodeStatus status = upb_Decode(
+//       data, size, msg, &upb_0test__TestUtf8Proto3StringMixed_msg_init, nullptr,
+//       0, arena.ptr());
 //
 //   // Parse fails, because proto3 string fields validate UTF-8.
 //   ASSERT_EQ(kUpb_DecodeStatus_BadUtf8, status);
diff --git a/upb/mini_table/BUILD b/upb/mini_table/BUILD
index 1623c05..ecf2bbb 100644
--- a/upb/mini_table/BUILD
+++ b/upb/mini_table/BUILD
@@ -83,8 +83,8 @@
     deps = [
         "@com_google_googletest//:gtest_main",
         "//upb:mini_table_compat",
-        "//upb/test:test_messages_proto2_upb_proto",
-        "//upb/test:test_messages_proto3_upb_proto",
+        "//upb/test:test_messages_proto2_upb_minitable",
+        "//upb/test:test_messages_proto3_upb_minitable",
         "//upb/test:test_upb_proto",
     ],
 )
diff --git a/upb/mini_table/compat_test.cc b/upb/mini_table/compat_test.cc
index e999e17..0a46060 100644
--- a/upb/mini_table/compat_test.cc
+++ b/upb/mini_table/compat_test.cc
@@ -14,21 +14,21 @@
 #include "upb/mini_table/compat.h"
 
 #include <gtest/gtest.h>
-#include "google/protobuf/test_messages_proto2.upb.h"
-#include "google/protobuf/test_messages_proto3.upb.h"
+#include "google/protobuf/test_messages_proto2.upb_minitable.h"
+#include "google/protobuf/test_messages_proto3.upb_minitable.h"
 
 namespace {
 
 TEST(GeneratedCode, EqualsTestProto2) {
   EXPECT_TRUE(upb_MiniTable_Equals(
-      &protobuf_test_messages_proto2_ProtoWithKeywords_msg_init,
-      &protobuf_test_messages_proto2_ProtoWithKeywords_msg_init));
+      &protobuf_0test_0messages__proto2__ProtoWithKeywords_msg_init,
+      &protobuf_0test_0messages__proto2__ProtoWithKeywords_msg_init));
 }
 
 TEST(GeneratedCode, EqualsTestProto3) {
   EXPECT_TRUE(upb_MiniTable_Equals(
-      &protobuf_test_messages_proto3_TestAllTypesProto3_msg_init,
-      &protobuf_test_messages_proto3_TestAllTypesProto3_msg_init));
+      &protobuf_0test_0messages__proto3__TestAllTypesProto3_msg_init,
+      &protobuf_0test_0messages__proto3__TestAllTypesProto3_msg_init));
 }
 
 }  // namespace
diff --git a/upb/test/BUILD b/upb/test/BUILD
index 2270476..b147e06 100644
--- a/upb/test/BUILD
+++ b/upb/test/BUILD
@@ -10,6 +10,10 @@
     "UPB_DEFAULT_CPPOPTS",
 )
 load(
+    "//bazel:upb_minitable_proto_library.bzl",
+    "upb_minitable_proto_library",
+)
+load(
     "//bazel:upb_proto_library.bzl",
     "upb_proto_library",
     "upb_proto_reflection_library",
@@ -66,6 +70,13 @@
     srcs = ["test.proto"],
 )
 
+upb_minitable_proto_library(
+    name = "test_proto_upb_minitable",
+    testonly = 1,
+    visibility = ["//upb:__subpackages__"],
+    deps = [":test_proto"],
+)
+
 upb_proto_library(
     name = "test_upb_proto",
     testonly = 1,
@@ -89,6 +100,20 @@
     deps = ["test_cpp_proto"],
 )
 
+upb_minitable_proto_library(
+    name = "test_messages_proto2_upb_minitable",
+    testonly = 1,
+    visibility = ["//upb:__subpackages__"],
+    deps = ["//src/google/protobuf:test_messages_proto2_proto"],
+)
+
+upb_minitable_proto_library(
+    name = "test_messages_proto3_upb_minitable",
+    testonly = 1,
+    visibility = ["//upb:__subpackages__"],
+    deps = ["//src/google/protobuf:test_messages_proto3_proto"],
+)
+
 upb_proto_library(
     name = "test_messages_proto2_upb_proto",
     testonly = 1,
@@ -182,12 +207,10 @@
     ],
     deps = [
         ":empty_upb_proto_reflection",
-        ":test_messages_proto2_upb_proto",
-        ":test_messages_proto3_upb_proto",
+        ":test_messages_proto2_upb_minitable",
         ":test_upb_proto",
         "@com_google_googletest//:gtest_main",
         "//upb:mini_table",
-        "//upb:mini_table_internal",
         "//upb:port",
     ],
 )
@@ -223,6 +246,12 @@
     deps = [":empty_srcs_3_proto"],
 )
 
+upb_minitable_proto_library(
+    name = "test_import_empty_srcs_upb_minitable_proto",
+    testonly = 1,
+    deps = [":test_import_empty_srcs_proto"],
+)
+
 upb_proto_library(
     name = "test_import_empty_srcs_upb_proto",
     testonly = 1,
@@ -233,7 +262,7 @@
     name = "test_import_empty_srcs",
     srcs = ["test_import_empty_srcs.cc"],
     deps = [
-        ":test_import_empty_srcs_upb_proto",
+        ":test_import_empty_srcs_upb_minitable_proto",
         "@com_google_googletest//:gtest_main",
     ],
 )
diff --git a/upb/test/test_import_empty_srcs.cc b/upb/test/test_import_empty_srcs.cc
index cefa522..59995ae 100644
--- a/upb/test/test_import_empty_srcs.cc
+++ b/upb/test/test_import_empty_srcs.cc
@@ -6,9 +6,9 @@
 // https://developers.google.com/open-source/licenses/bsd
 
 #include <gtest/gtest.h>
-#include "upb/test/test_import_empty_srcs.upb.h"
+#include "upb/test/test_import_empty_srcs.upb_minitable.h"
 
 TEST(Test, Reexport) {
   // This test really just ensures that compilation succeeds.
-  ASSERT_GT(sizeof(upb_test_ContainsImported_msg_init), 0);
+  ASSERT_GT(sizeof(upb_0test__ContainsImported_msg_init), 0);
 }
diff --git a/upb/test/test_mini_table_oneof.cc b/upb/test/test_mini_table_oneof.cc
index 434e5fb..3c0ecae 100644
--- a/upb/test/test_mini_table_oneof.cc
+++ b/upb/test/test_mini_table_oneof.cc
@@ -6,11 +6,9 @@
 // https://developers.google.com/open-source/licenses/bsd
 
 #include <gtest/gtest.h>
-#include "google/protobuf/test_messages_proto2.upb.h"
-#include "google/protobuf/test_messages_proto3.upb.h"
+#include "google/protobuf/test_messages_proto2.upb_minitable.h"
 #include "upb/mini_table/field.h"
 #include "upb/mini_table/message.h"
-#include "upb/test/test.upb.h"
 
 // Must be last.
 #include "upb/port/def.inc"
@@ -20,7 +18,7 @@
   constexpr int oneof_test_field_number = 116;
 
   const upb_MiniTable* google_protobuf_table =
-      &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init;
+      &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init;
   const upb_MiniTableField* field =
       upb_MiniTable_FindFieldByNumber(google_protobuf_table, oneof_test_field_number);
   ASSERT_TRUE(field != nullptr);
@@ -34,7 +32,7 @@
 TEST(MiniTableOneofTest, InitialFieldNotOneOf) {
   constexpr int test_field_number = 1;  // optional int that is not a oneof
   const upb_MiniTable* google_protobuf_table =
-      &protobuf_test_messages_proto2_TestAllTypesProto2_msg_init;
+      &protobuf_0test_0messages__proto2__TestAllTypesProto2_msg_init;
   const upb_MiniTableField* field =
       upb_MiniTable_FindFieldByNumber(google_protobuf_table, test_field_number);
   ASSERT_TRUE(field != nullptr);
diff --git a/upb_generator/common.cc b/upb_generator/common.cc
index c81bcb0..ecd0da6 100644
--- a/upb_generator/common.cc
+++ b/upb_generator/common.cc
@@ -48,6 +48,11 @@
 // Must be last
 #include "upb/port/def.inc"
 
+// Generate a mangled C name for a proto object.
+static std::string MangleName(absl::string_view name) {
+  return absl::StrReplaceAll(name, {{"_", "_0"}, {".", "__"}});
+}
+
 namespace upb {
 namespace generator {
 
@@ -78,6 +83,14 @@
       name);
 }
 
+std::string MessageInit(absl::string_view full_name) {
+  return MangleName(full_name) + "_msg_init";
+}
+
+std::string MessageInitName(upb::MessageDefPtr descriptor) {
+  return MessageInit(descriptor.full_name());
+}
+
 std::string MessageName(upb::MessageDefPtr descriptor) {
   return ToCIdent(descriptor.full_name());
 }
@@ -94,10 +107,6 @@
   return StripExtension(file.name()) + ".upb_minitable.h";
 }
 
-std::string MessageInit(absl::string_view full_name) {
-  return ToCIdent(full_name) + "_msg_init";
-}
-
 std::string EnumInit(upb::EnumDefPtr descriptor) {
   return ToCIdent(descriptor.full_name()) + "_enum_init";
 }
diff --git a/upb_generator/common.h b/upb_generator/common.h
index 5f4bd4e..bf4fd7c 100644
--- a/upb_generator/common.h
+++ b/upb_generator/common.h
@@ -81,12 +81,13 @@
 std::string ToCIdent(absl::string_view str);
 std::string ToPreproc(absl::string_view str);
 void EmitFileWarning(absl::string_view name, Output& output);
+std::string MessageInit(absl::string_view full_name);
+std::string MessageInitName(upb::MessageDefPtr descriptor);
 std::string MessageName(upb::MessageDefPtr descriptor);
 std::string FileLayoutName(upb::FileDefPtr file);
 std::string MiniTableHeaderFilename(upb::FileDefPtr file);
 std::string CApiHeaderFilename(upb::FileDefPtr file);
 
-std::string MessageInit(absl::string_view full_name);
 std::string EnumInit(upb::EnumDefPtr descriptor);
 
 std::string FieldInitializer(upb::FieldDefPtr field,
diff --git a/upb_generator/protoc-gen-upb.cc b/upb_generator/protoc-gen-upb.cc
index 60fa5be..eb83979 100644
--- a/upb_generator/protoc-gen-upb.cc
+++ b/upb_generator/protoc-gen-upb.cc
@@ -73,10 +73,6 @@
   return StripExtension(file.name()) + ".upb.c";
 }
 
-std::string MessageInitName(upb::MessageDefPtr descriptor) {
-  return absl::StrCat(MessageName(descriptor), "_msg_init");
-}
-
 std::string MessageMiniTableRef(upb::MessageDefPtr descriptor,
                                 const Options& options) {
   if (options.bootstrap) {
diff --git a/upb_generator/protoc-gen-upb_minitable.cc b/upb_generator/protoc-gen-upb_minitable.cc
index 69be262..3c6cd86 100644
--- a/upb_generator/protoc-gen-upb_minitable.cc
+++ b/upb_generator/protoc-gen-upb_minitable.cc
@@ -84,10 +84,6 @@
   return StripExtension(file.name()) + ".upb_minitable.c";
 }
 
-std::string MessageInitName(upb::MessageDefPtr descriptor) {
-  return absl::StrCat(MessageName(descriptor), "_msg_init");
-}
-
 std::string ExtensionIdentBase(upb::FieldDefPtr ext) {
   assert(ext.is_extension());
   std::string ext_scope;