Revert "Add a memtag-globals test to bionic"
Revert submission 2709995
Reason for revert: linker crash in soinfo::apply_relr_reloc
Reverted changes: /q/submissionid:2709995
Bug: 314038442
Change-Id: I416bff00ed3d530b3b6257362b2119c358e1d152
diff --git a/tests/Android.bp b/tests/Android.bp
index 3aea968..14b4e3e 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -353,89 +353,6 @@
},
}
-cc_defaults {
- name: "memtag_globals_defaults",
- defaults: [
- "bionic_testlib_defaults",
- "bionic_targets_only"
- ],
- cflags: [
- "-Wno-array-bounds",
- "-Wno-unused-variable",
- ],
- header_libs: ["bionic_libc_platform_headers"],
- sanitize: {
- hwaddress: false,
- memtag_heap: true,
- memtag_globals: true,
- diag: {
- memtag_heap: true,
- }
- },
- relative_install_path: "bionic-loader-test-libs/prebuilt-elf-files",
-}
-
-/// The following library and binary is to be used for testing the bionic linker
-/// against memtag globals. While we wait for the compiler to be updated, the
-/// files come as prebuilts (built using) the corresponding 'regular'
-/// cc_test_library and cc_test rules below, just with a tip-of-tree version of
-/// LLVM.
-///
-/// Updating the prebuilts can be done by installing a tip-of-tree compiler, and
-/// running:
-/// - m memtag_globals_binary memtag_globals_dso
-/// - cp $ANDROID_PRODUCT_OUT/symbols/data/nativetest64/bionic-loader-test-libs/prebuilt-elf-files/memtag_globals_* \
-/// $ANDROID_BUILD_TOP/bionic/tests/prebuilt-elf-files/arm64/
-///
-// cc_test_library {
-// name: "memtag_globals_dso",
-// defaults: [ "memtag_globals_defaults" ],
-// srcs: ["prebuilt-elf-files/arm64/src/memtag_globals_dso.cpp"],
-// }
-//
-// cc_test {
-// name: "memtag_globals_binary",
-// // Not actually a '.so' file, this is an executable; but the only way to
-// // get soong to be able to produce a properly located and linked prebuilt
-// // variant of this binary was through the cc_prebuilt_test_library_shared
-// // rule, which appends '.so' to the end. Once the prebuilts are removed,
-// // the suffix can be removed.
-// suffix: ".so",
-// defaults: [ "memtag_globals_defaults" ],
-// srcs: ["prebuilt-elf-files/arm64/src/memtag_globals_binary.cpp"],
-// shared_libs: [ "memtag_globals_dso" ],
-// // This binary is used in the bionic-unit-tests as a data dependency, and is
-// // in the same folder as memtag_globals_dso. But, the default cc_test rules
-// // make this binary (when just explicitly built and shoved in
-// // /data/nativetest64/) end up in a subfolder called
-// // 'memtag_globals_binary'. When this happens, the explicit build fails to
-// // find the DSO because the default rpath is just ${ORIGIN}, and because we
-// // want this to be usable both from bionic-unit-tests and explicit builds,
-// // let's just not put it in a subdirectory.
-// no_named_install_directory: true,
-// }
-
-cc_prebuilt_test_library_shared {
- name: "memtag_globals_dso",
- defaults: [ "memtag_globals_defaults" ],
- arch: {
- arm64: {
- srcs: ["prebuilt-elf-files/arm64/memtag_globals_dso.so"],
- },
- }
-}
-
-cc_prebuilt_test_library_shared {
- name: "memtag_globals_binary",
- defaults: [ "memtag_globals_defaults" ],
- arch: {
- arm64: {
- srcs: ["prebuilt-elf-files/arm64/memtag_globals_binary.so"],
- shared_libs: [ "memtag_globals_dso" ],
- },
- }
-}
-
// -----------------------------------------------------------------------------
// All standard tests.
// -----------------------------------------------------------------------------
@@ -510,7 +427,6 @@
"math_test.cpp",
"membarrier_test.cpp",
"memtag_stack_test.cpp",
- "memtag_globals_test.cpp",
"mntent_test.cpp",
"mte_test.cpp",
"netdb_test.cpp",
@@ -966,8 +882,6 @@
"preinit_syscall_test_helper",
"thread_exit_cb_helper",
"tls_properties_helper",
- "memtag_globals_binary",
- "memtag_globals_dso",
],
data_libs: [
"libatest_simple_zip",
diff --git a/tests/memtag_globals_test.cpp b/tests/memtag_globals_test.cpp
deleted file mode 100644
index 3736d4c..0000000
--- a/tests/memtag_globals_test.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <gtest/gtest.h>
-
-#if defined(__BIONIC__)
-#include "gtest_globals.h"
-#include "platform/bionic/mte.h"
-#include "utils.h"
-#endif
-
-#include <sys/stat.h>
-#include <unistd.h>
-#include <string>
-
-TEST(MemtagGlobalsTest, test) {
-#if defined(__BIONIC__) && defined(__aarch64__)
- std::string binary = GetPrebuiltElfDir() + "/memtag_globals_binary.so";
- chmod(binary.c_str(), 0755);
- ExecTestHelper eth;
- eth.SetArgs({binary.c_str(), nullptr});
- eth.Run(
- [&]() {
- execve(binary.c_str(), eth.GetArgs(), eth.GetEnv());
- GTEST_FAIL() << "Failed to execve: " << strerror(errno) << "\n";
- },
- // We catch the global-buffer-overflow and crash only when MTE is
- // supported.
- mte_supported() ? -SIGSEGV : 0, "Assertions were passed");
-#else
- GTEST_SKIP() << "bionic/arm64 only";
-#endif
-}
diff --git a/tests/prebuilt-elf-files/arm64/memtag_globals_binary.so b/tests/prebuilt-elf-files/arm64/memtag_globals_binary.so
deleted file mode 100755
index 43d7443..0000000
--- a/tests/prebuilt-elf-files/arm64/memtag_globals_binary.so
+++ /dev/null
Binary files differ
diff --git a/tests/prebuilt-elf-files/arm64/memtag_globals_dso.so b/tests/prebuilt-elf-files/arm64/memtag_globals_dso.so
deleted file mode 100755
index f472a70..0000000
--- a/tests/prebuilt-elf-files/arm64/memtag_globals_dso.so
+++ /dev/null
Binary files differ
diff --git a/tests/prebuilt-elf-files/arm64/src/memtag_globals.h b/tests/prebuilt-elf-files/arm64/src/memtag_globals.h
deleted file mode 100644
index b9a2ef1..0000000
--- a/tests/prebuilt-elf-files/arm64/src/memtag_globals.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <utility>
-#include <vector>
-
-void check_tagged(const void* a);
-void check_untagged(const void* a);
-void check_matching_tags(const void* a, const void* b);
-void check_eq(const void* a, const void* b);
-
-void dso_check_assertions(bool enforce_tagged);
-void dso_print_variables();
-
-void print_variable_address(const char* name, const void* ptr);
-void print_variables(const char* header,
- const std::vector<std::pair<const char*, const void*>>& tagged_variables,
- const std::vector<std::pair<const char*, const void*>>& untagged_variables);
\ No newline at end of file
diff --git a/tests/prebuilt-elf-files/arm64/src/memtag_globals_binary.cpp b/tests/prebuilt-elf-files/arm64/src/memtag_globals_binary.cpp
deleted file mode 100644
index c9ad261..0000000
--- a/tests/prebuilt-elf-files/arm64/src/memtag_globals_binary.cpp
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <string>
-#include <vector>
-
-#include "memtag_globals.h"
-
-// Adapted from the LLD test suite: lld/test/ELF/Inputs/aarch64-memtag-globals.s
-
-/// Global variables defined here, of various semantics.
-char global[30] = {};
-__attribute__((no_sanitize("memtag"))) int global_untagged = 0;
-const int const_global = 0;
-static const int hidden_const_global = 0;
-static char hidden_global[12] = {};
-__attribute__((visibility("hidden"))) int hidden_attr_global = 0;
-__attribute__((visibility("hidden"))) const int hidden_attr_const_global = 0;
-
-/// Should be untagged.
-__thread int tls_global;
-__thread static int hidden_tls_global;
-
-/// Tagged, from the other file.
-extern int global_extern;
-/// Untagged, from the other file.
-extern __attribute__((no_sanitize("memtag"))) int global_extern_untagged;
-/// Tagged here, but untagged in the definition found in the sister objfile
-/// (explicitly).
-extern int global_extern_untagged_definition_but_tagged_import;
-
-/// ABS64 relocations. Also, forces symtab entries for local and external
-/// globals.
-char* pointer_to_global = &global[0];
-char* pointer_inside_global = &global[17];
-char* pointer_to_global_end = &global[30];
-char* pointer_past_global_end = &global[48];
-int* pointer_to_global_untagged = &global_untagged;
-const int* pointer_to_const_global = &const_global;
-/// RELATIVE relocations.
-const int* pointer_to_hidden_const_global = &hidden_const_global;
-char* pointer_to_hidden_global = &hidden_global[0];
-int* pointer_to_hidden_attr_global = &hidden_attr_global;
-const int* pointer_to_hidden_attr_const_global = &hidden_attr_const_global;
-/// RELATIVE relocations with special AArch64 MemtagABI semantics, with the
-/// offset ('12' or '16') encoded in the place.
-char* pointer_to_hidden_global_end = &hidden_global[12];
-char* pointer_past_hidden_global_end = &hidden_global[16];
-/// ABS64 relocations.
-int* pointer_to_global_extern = &global_extern;
-int* pointer_to_global_extern_untagged = &global_extern_untagged;
-int* pointer_to_global_extern_untagged_definition_but_tagged_import =
- &global_extern_untagged_definition_but_tagged_import;
-
-// Force materialization of these globals into the symtab.
-int* get_address_to_tls_global() {
- return &tls_global;
-}
-int* get_address_to_hidden_tls_global() {
- return &hidden_tls_global;
-}
-
-static const std::vector<std::pair<const char*, const void*>>& get_expected_tagged_vars() {
- static std::vector<std::pair<const char*, const void*>> expected_tagged_vars = {
- {"global", &global},
- {"pointer_inside_global", pointer_inside_global},
- {"pointer_to_global_end", pointer_to_global_end},
- {"pointer_past_global_end", pointer_past_global_end},
- {"hidden_global", &hidden_global},
- {"hidden_attr_global", &hidden_attr_global},
- {"global_extern", &global_extern},
- };
- return expected_tagged_vars;
-}
-
-static const std::vector<std::pair<const char*, const void*>>& get_expected_untagged_vars() {
- static std::vector<std::pair<const char*, const void*>> expected_untagged_vars = {
- {"global_extern_untagged", &global_extern_untagged},
- {"global_extern_untagged_definition_but_tagged_import",
- &global_extern_untagged_definition_but_tagged_import},
- {"global_untagged", &global_untagged},
- {"const_global", &const_global},
- {"hidden_const_global", &hidden_const_global},
- {"hidden_attr_const_global", &hidden_attr_const_global},
- {"tls_global", &tls_global},
- {"hidden_tls_global", &hidden_tls_global},
- };
- return expected_untagged_vars;
-}
-
-void exe_print_variables() {
- print_variables(" Variables accessible from the binary:\n", get_expected_tagged_vars(),
- get_expected_untagged_vars());
-}
-
-// Dump the addresses of the global variables to stderr
-void dso_print();
-void dso_print_others();
-
-void exe_check_assertions(bool check_pointers_are_tagged) {
- // Check that non-const variables are writeable.
- *pointer_to_global = 0;
- *pointer_inside_global = 0;
- *(pointer_to_global_end - 1) = 0;
- *pointer_to_global_untagged = 0;
- *pointer_to_hidden_global = 0;
- *pointer_to_hidden_attr_global = 0;
- *(pointer_to_hidden_global_end - 1) = 0;
- *pointer_to_global_extern = 0;
- *pointer_to_global_extern_untagged = 0;
- *pointer_to_global_extern_untagged_definition_but_tagged_import = 0;
-
- if (check_pointers_are_tagged) {
- for (const auto& [_, pointer] : get_expected_tagged_vars()) {
- check_tagged(pointer);
- }
- }
-
- for (const auto& [_, pointer] : get_expected_untagged_vars()) {
- check_untagged(pointer);
- }
-
- check_matching_tags(pointer_to_global, pointer_inside_global);
- check_matching_tags(pointer_to_global, pointer_to_global_end);
- check_matching_tags(pointer_to_global, pointer_past_global_end);
- check_eq(pointer_inside_global, pointer_to_global + 17);
- check_eq(pointer_to_global_end, pointer_to_global + 30);
- check_eq(pointer_past_global_end, pointer_to_global + 48);
-
- check_matching_tags(pointer_to_hidden_global, pointer_to_hidden_global_end);
- check_matching_tags(pointer_to_hidden_global, pointer_past_hidden_global_end);
- check_eq(pointer_to_hidden_global_end, pointer_to_hidden_global + 12);
- check_eq(pointer_past_hidden_global_end, pointer_to_hidden_global + 16);
-}
-
-void crash() {
- *pointer_past_global_end = 0;
-}
-
-int main(int argc, char** argv) {
- bool check_pointers_are_tagged = false;
- // For an MTE-capable device, provide argv[1] == '1' to enable the assertions
- // that pointers should be tagged.
- if (argc >= 2 && argv[1][0] == '1') {
- check_pointers_are_tagged = true;
- }
-
- char* heap_ptr = static_cast<char*>(malloc(1));
- print_variable_address("heap address", heap_ptr);
- *heap_ptr = 0;
- if (check_pointers_are_tagged) check_tagged(heap_ptr);
- free(heap_ptr);
-
- exe_print_variables();
- dso_print_variables();
-
- exe_check_assertions(check_pointers_are_tagged);
- dso_check_assertions(check_pointers_are_tagged);
-
- printf("Assertions were passed. Now doing a global-buffer-overflow.\n");
- fflush(stdout);
- crash();
- printf("global-buffer-overflow went uncaught.\n");
- return 0;
-}
\ No newline at end of file
diff --git a/tests/prebuilt-elf-files/arm64/src/memtag_globals_dso.cpp b/tests/prebuilt-elf-files/arm64/src/memtag_globals_dso.cpp
deleted file mode 100644
index 877108e..0000000
--- a/tests/prebuilt-elf-files/arm64/src/memtag_globals_dso.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <vector>
-
-#include "memtag_globals.h"
-
-// Adapted from the LLD test suite: lld/test/ELF/Inputs/aarch64-memtag-globals.s
-
-int global_extern;
-static int global_extern_hidden;
-__attribute__((no_sanitize("memtag"))) int global_extern_untagged;
-__attribute__((no_sanitize("memtag"))) int global_extern_untagged_definition_but_tagged_import;
-
-void assertion_failure() {
- exit(1);
-}
-
-void check_tagged(const void* a) {
- uintptr_t a_uptr = reinterpret_cast<uintptr_t>(a);
-#if defined(__aarch64__)
- if ((a_uptr >> 56) == 0) {
- fprintf(stderr, "**********************************\n");
- fprintf(stderr, "Failed assertion:\n");
- fprintf(stderr, " tag(0x%zx) != 0\n", a_uptr);
- fprintf(stderr, "**********************************\n");
-
- assertion_failure();
- }
-#endif // defined(__aarch64__)
-}
-
-void check_untagged(const void* a) {
- uintptr_t a_uptr = reinterpret_cast<uintptr_t>(a);
-#if defined(__aarch64__)
- if ((a_uptr >> 56) != 0) {
- fprintf(stderr, "**********************************\n");
- fprintf(stderr, "Failed assertion:\n");
- fprintf(stderr, " tag(0x%zx) == 0\n", a_uptr);
- fprintf(stderr, "**********************************\n");
-
- assertion_failure();
- }
-#endif // defined(__aarch64__)
-}
-
-void check_matching_tags(const void* a, const void* b) {
- uintptr_t a_uptr = reinterpret_cast<uintptr_t>(a);
- uintptr_t b_uptr = reinterpret_cast<uintptr_t>(b);
-#if defined(__aarch64__)
- if (a_uptr >> 56 != b_uptr >> 56) {
- fprintf(stderr, "**********************************\n");
- fprintf(stderr, "Failed assertion:\n");
- fprintf(stderr, " tag(0x%zx) != tag(0x%zx)\n", a_uptr, b_uptr);
- fprintf(stderr, "**********************************\n");
-
- assertion_failure();
- }
-#endif // defined(__aarch64__)
-}
-
-void check_eq(const void* a, const void* b) {
- if (a != b) {
- fprintf(stderr, "**********************************\n");
- fprintf(stderr, "Failed assertion:\n");
- fprintf(stderr, " %p != %p\n", a, b);
- fprintf(stderr, "**********************************\n");
-
- assertion_failure();
- }
-}
-
-#define LONGEST_VARIABLE_NAME "51"
-void print_variable_address(const char* name, const void* ptr) {
- printf("%" LONGEST_VARIABLE_NAME "s: %16p\n", name, ptr);
-}
-
-static const std::vector<std::pair<const char*, const void*>>& get_expected_tagged_vars() {
- static std::vector<std::pair<const char*, const void*>> expected_tagged_vars = {
- {"global_extern", &global_extern},
- {"global_extern_hidden", &global_extern_hidden},
- };
- return expected_tagged_vars;
-}
-
-static const std::vector<std::pair<const char*, const void*>>& get_expected_untagged_vars() {
- static std::vector<std::pair<const char*, const void*>> expected_untagged_vars = {
- {"global_extern_untagged", &global_extern_untagged},
- {"global_extern_untagged_definition_but_tagged_import",
- &global_extern_untagged_definition_but_tagged_import},
- };
- return expected_untagged_vars;
-}
-
-void dso_print_variables() {
- print_variables(" Variables declared in the DSO:\n", get_expected_tagged_vars(),
- get_expected_untagged_vars());
-}
-
-void print_variables(const char* header,
- const std::vector<std::pair<const char*, const void*>>& tagged_variables,
- const std::vector<std::pair<const char*, const void*>>& untagged_variables) {
- printf("==========================================================\n");
- printf("%s", header);
- printf("==========================================================\n");
- printf(" Variables expected to be tagged:\n");
- printf("----------------------------------------------------------\n");
- for (const auto& [name, pointer] : tagged_variables) {
- print_variable_address(name, pointer);
- }
-
- printf("\n----------------------------------------------------------\n");
- printf(" Variables expected to be untagged:\n");
- printf("----------------------------------------------------------\n");
- for (const auto& [name, pointer] : untagged_variables) {
- print_variable_address(name, pointer);
- }
- printf("\n");
-}
-
-void dso_check_assertions(bool check_pointers_are_tagged) {
- // Check that non-const variables are writeable.
- global_extern = 0;
- global_extern_hidden = 0;
- global_extern_untagged = 0;
- global_extern_untagged_definition_but_tagged_import = 0;
-
- if (check_pointers_are_tagged) {
- for (const auto& [_, pointer] : get_expected_tagged_vars()) {
- check_tagged(pointer);
- }
- }
-
- for (const auto& [_, pointer] : get_expected_untagged_vars()) {
- check_untagged(pointer);
- }
-}