diff options
author | Justin DeMartino <jjdemartino@google.com> | 2020-09-21 13:23:58 -0700 |
---|---|---|
committer | Justin DeMartino <jjdemartino@google.com> | 2020-09-21 13:23:58 -0700 |
commit | 7e4fe6a28b718ab97c08811566238af2893ca65b (patch) | |
tree | 5413a5ec890b5a1ac4fbbe4548b5014e41a2591b /tests/libs/tls_properties_helper.cpp | |
parent | dcdcb3fa15004669823a3a118189d9d72ff30852 (diff) | |
parent | ab08b955a34423d53b28a6210e7530e67241af4a (diff) |
Merge SP1A.200921.001
Change-Id: Id2ab019914bb555dadf52c46b8403c0d5fb3c20a
Diffstat (limited to 'tests/libs/tls_properties_helper.cpp')
-rw-r--r-- | tests/libs/tls_properties_helper.cpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/tests/libs/tls_properties_helper.cpp b/tests/libs/tls_properties_helper.cpp new file mode 100644 index 000000000..3f8d11885 --- /dev/null +++ b/tests/libs/tls_properties_helper.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2019 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. + */ + +// Prevent tests from being compiled with glibc because thread_properties.h +// only exists in Bionic. +#if defined(__BIONIC__) + +#include <sys/thread_properties.h> + +#include <assert.h> +#include <dlfcn.h> +#include <stdio.h> +#include <unistd.h> // for gettid + +// Helper binary to use TLS-related functions in thread_properties + +// Tests __get_static_tls_bound. +thread_local int local_var; +void test_static_tls_bounds() { + local_var = 123; + void* start_addr = nullptr; + void* end_addr = nullptr; + + __libc_get_static_tls_bounds(reinterpret_cast<void**>(&start_addr), + reinterpret_cast<void**>(&end_addr)); + assert(start_addr != nullptr); + assert(end_addr != nullptr); + + assert(&local_var >= start_addr && &local_var < end_addr); + + printf("done_get_static_tls_bounds\n"); +} + +// Tests iterate_dynamic tls chunks. +// Export a var from the shared so. +__thread char large_tls_var[4 * 1024 * 1024]; +void test_iter_tls() { + void* lib = dlopen("libtest_elftls_dynamic.so", RTLD_LOCAL | RTLD_NOW); + + int i = 0; + auto cb = [&](void* dtls_begin, void* dtls_end, size_t dso_id, void* arg) { + printf("iterate_cb i = %d\n", i++); + }; + __libc_iterate_dynamic_tls(gettid(), cb, nullptr); + printf("done_iterate_dynamic_tls\n"); +} + +int main() { + test_static_tls_bounds(); + test_iter_tls(); + return 0; +} + +#else +int main() { + return 0; +} +#endif // __BIONIC__ |