ladybird/Tests/LibELF/TestTLS.cpp
Sönke Holz 9881d10e38 LibELF: Add a small local-exec TLS test
Part 1 of this test uses a large array so we are more likely getting
segfaults when using an incorrect TLS layout.

The `volatile`s and `taint_for_optimiter`s should hopefully prevent the
compiler from optimizing the tests out.
2024-04-19 16:46:47 -06:00

39 lines
1.1 KiB
C++

/*
* Copyright (c) 2023, Daniel Bertalan <dani@danielbertalan.dev>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibTest/TestCase.h>
// When linking an executable, TLS relaxations might be relaxed to different
// access modes than intended. Hence, the actual logic has been moved to a
// shared library, and this executable just calls it.
extern void run_test();
TEST_CASE(basic)
{
run_test();
}
TEST_CASE(local_exec)
{
[[gnu::tls_model("local-exec")]] static volatile __thread char test1[PAGE_SIZE * 4 + 10];
for (size_t i = 0; i < sizeof(test1); i++) {
test1[i] = static_cast<char>(i);
AK::taint_for_optimizer(test1[i]);
}
for (size_t i = 0; i < sizeof(test1); i++) {
AK::taint_for_optimizer(test1[i]);
EXPECT_EQ(test1[i], static_cast<char>(i));
}
[[gnu::tls_model("local-exec")]] static volatile __thread u16 test2[] = { 0x1234, 0x5678, 0xabcd };
AK::taint_for_optimizer(test2[0]);
EXPECT_EQ(test2[0], 0x1234);
AK::taint_for_optimizer(test2[1]);
EXPECT_EQ(test2[1], 0x5678);
AK::taint_for_optimizer(test2[2]);
EXPECT_EQ(test2[2], 0xabcd);
}