19a077806SSiva Chandra Reddy //===-- Loader test to test init and fini array iteration -----------------===// 29a077806SSiva Chandra Reddy // 39a077806SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 49a077806SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 59a077806SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 69a077806SSiva Chandra Reddy // 79a077806SSiva Chandra Reddy //===----------------------------------------------------------------------===// 89a077806SSiva Chandra Reddy 9*af1315c2SSiva Chandra Reddy #include "test/IntegrationTest/test.h" 109a077806SSiva Chandra Reddy 119a077806SSiva Chandra Reddy #include <stddef.h> 129a077806SSiva Chandra Reddy 139a077806SSiva Chandra Reddy int global_destroyed = false; 149a077806SSiva Chandra Reddy 159a077806SSiva Chandra Reddy class A { 169a077806SSiva Chandra Reddy private: 179a077806SSiva Chandra Reddy int val[1024]; 189a077806SSiva Chandra Reddy 199a077806SSiva Chandra Reddy public: A(int i,int a)209a077806SSiva Chandra Reddy A(int i, int a) { 219a077806SSiva Chandra Reddy for (int k = 0; k < 1024; ++k) 229a077806SSiva Chandra Reddy val[k] = 0; 239a077806SSiva Chandra Reddy val[i] = a; 249a077806SSiva Chandra Reddy } 259a077806SSiva Chandra Reddy ~A()269a077806SSiva Chandra Reddy ~A() { global_destroyed = true; } 279a077806SSiva Chandra Reddy get(int i) const289a077806SSiva Chandra Reddy int get(int i) const { return val[i]; } 299a077806SSiva Chandra Reddy }; 309a077806SSiva Chandra Reddy 319a077806SSiva Chandra Reddy int GLOBAL_INDEX = 512; 329a077806SSiva Chandra Reddy int INITVAL_INITIALIZER = 0x600D; 339a077806SSiva Chandra Reddy 349a077806SSiva Chandra Reddy A global(GLOBAL_INDEX, INITVAL_INITIALIZER); 359a077806SSiva Chandra Reddy 369a077806SSiva Chandra Reddy int initval = 0; 379a077806SSiva Chandra Reddy int preinitval = 0; 389a077806SSiva Chandra Reddy set_initval()399a077806SSiva Chandra Reddy__attribute__((constructor)) void set_initval() { 409a077806SSiva Chandra Reddy initval = INITVAL_INITIALIZER; 419a077806SSiva Chandra Reddy } reset_initval()429a077806SSiva Chandra Reddy__attribute__((destructor(1))) void reset_initval() { 439a077806SSiva Chandra Reddy ASSERT_TRUE(global_destroyed); 449a077806SSiva Chandra Reddy ASSERT_EQ(preinitval, 0); 459a077806SSiva Chandra Reddy initval = 0; 469a077806SSiva Chandra Reddy } 479a077806SSiva Chandra Reddy set_preinitval()489a077806SSiva Chandra Reddyvoid set_preinitval() { preinitval = INITVAL_INITIALIZER; } reset_preinitval()499a077806SSiva Chandra Reddy__attribute__((destructor(2))) void reset_preinitval() { 509a077806SSiva Chandra Reddy ASSERT_TRUE(global_destroyed); 519a077806SSiva Chandra Reddy ASSERT_EQ(initval, INITVAL_INITIALIZER); 529a077806SSiva Chandra Reddy preinitval = 0; 539a077806SSiva Chandra Reddy } 549a077806SSiva Chandra Reddy 559a077806SSiva Chandra Reddy using PreInitFunc = void(); 569a077806SSiva Chandra Reddy __attribute__((section(".preinit_array"))) PreInitFunc *preinit_func_ptr = 579a077806SSiva Chandra Reddy &set_preinitval; 589a077806SSiva Chandra Reddy TEST_MAIN()599a077806SSiva Chandra ReddyTEST_MAIN() { 609a077806SSiva Chandra Reddy ASSERT_EQ(global.get(GLOBAL_INDEX), INITVAL_INITIALIZER); 619a077806SSiva Chandra Reddy ASSERT_EQ(initval, INITVAL_INITIALIZER); 629a077806SSiva Chandra Reddy ASSERT_EQ(preinitval, INITVAL_INITIALIZER); 639a077806SSiva Chandra Reddy return 0; 649a077806SSiva Chandra Reddy } 65