xref: /llvm-project/libc/test/integration/startup/linux/init_fini_array_test.cpp (revision af1315c28f9bab76d3c2e1492a3d41e7c48215f8)
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 Reddy void 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 Reddy TEST_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