| //===-- Loader test to test init and fini array iteration -----------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "test/IntegrationTest/test.h" | |
| #include <stddef.h> | |
| int global_destroyed = false; | |
| class A { | |
| private: | |
| int val[1024]; | |
| public: | |
| A(int i, int a) { | |
| for (int k = 0; k < 1024; ++k) | |
| val[k] = 0; | |
| val[i] = a; | |
| } | |
| ~A() { global_destroyed = true; } | |
| int get(int i) const { return val[i]; } | |
| }; | |
| int GLOBAL_INDEX = 512; | |
| int INITVAL_INITIALIZER = 0x600D; | |
| int BEFORE_INITIALIZER = 0xFEED; | |
| A global(GLOBAL_INDEX, INITVAL_INITIALIZER); | |
| int initval = 0; | |
| int before = 0; | |
| __attribute__((constructor(101))) void run_before() { | |
| before = BEFORE_INITIALIZER; | |
| } | |
| __attribute__((constructor(65535))) void run_after() { | |
| ASSERT_EQ(before, BEFORE_INITIALIZER); | |
| } | |
| __attribute__((constructor)) void set_initval() { | |
| initval = INITVAL_INITIALIZER; | |
| } | |
| __attribute__((destructor(101))) void reset_initval() { | |
| ASSERT_TRUE(global_destroyed); | |
| initval = 0; | |
| } | |
| TEST_MAIN(int, char **, char **) { | |
| ASSERT_EQ(global.get(GLOBAL_INDEX), INITVAL_INITIALIZER); | |
| ASSERT_EQ(initval, INITVAL_INITIALIZER); | |
| return 0; | |
| } |