| |
| #include <gtest/gtest.h> |
| #include "upb/mini_table/extension_registry.h" |
| #include "upb/mini_table/generated_registry.h" |
| #include "upb/mini_table/generated_registry_empty_test.upb_minitable.h" |
| #include "upb/mini_table/message.h" |
| |
| namespace { |
| |
| // Tests that we can instantiate the registry even if no extensions are linked. |
| // This ensures that the sentinel object in the linker array properly ensures |
| // that the encapsulation symbols are defined (eg. __start_linkarr_exts, |
| // __stop_linkarr_exts) even when no extensions were linked. |
| TEST(GeneratedRegistryEmptyTest, Instantiate) { |
| // Strongly reference the generated MiniTable to ensure that the TU for |
| // generated_registry_empty_test.upb_minitable.c is pulled in. |
| const upb_MiniTable* volatile table = |
| &upb_0test_0empty_0registry__EmptyRegistryTestMessage_msg_init; |
| (void)table; |
| |
| // Test that the registry can be loaded, even if no extensions are linked. |
| // If we did not have a sentinel in the linker array, we would get a linker |
| // error here like: |
| // |
| // ld: error: undefined symbol: __start_linkarr_upb_AllExts |
| // >>> referenced by generated_registry_empty_test.upb_minitable.c |
| // >>> |
| // generated_registry_empty_test.upb_minitable.pic.o:(upb_GeneratedRegistry_Constructor_dont_copy_me__upb_internal_use_only.entry) |
| // >>> the encapsulation symbol needs to be retained under --gc-sections |
| // properly; consider -z nostart-stop-gc (see |
| // https://lld.llvm.org/ELF/start-stop-gc) |
| // |
| // ld: error: undefined symbol: __stop_linkarr_upb_AllExts |
| // >>> referenced by generated_registry_empty_test.upb_minitable.c |
| // >>> |
| // generated_registry_empty_test.upb_minitable.pic.o:(upb_GeneratedRegistry_Constructor_dont_copy_me__upb_internal_use_only.entry) |
| const upb_GeneratedRegistryRef* ref = upb_GeneratedRegistry_Load(); |
| EXPECT_NE(ref, nullptr); |
| const upb_ExtensionRegistry* reg = upb_GeneratedRegistry_Get(ref); |
| EXPECT_NE(reg, nullptr); |
| |
| upb_GeneratedRegistry_Release(ref); |
| } |
| |
| } // namespace |