xref: /llvm-project/libc/test/integration/startup/gpu/init_fini_array_test.cpp (revision abd85cd473afedf112bf00630a22382fee4a7853)
11b823abeSJoseph Huber //===-- Loader test to test init and fini array iteration -----------------===//
21b823abeSJoseph Huber //
31b823abeSJoseph Huber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41b823abeSJoseph Huber // See https://llvm.org/LICENSE.txt for license information.
51b823abeSJoseph Huber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61b823abeSJoseph Huber //
71b823abeSJoseph Huber //===----------------------------------------------------------------------===//
81b823abeSJoseph Huber 
91b823abeSJoseph Huber #include "test/IntegrationTest/test.h"
101b823abeSJoseph Huber 
111b823abeSJoseph Huber #include <stddef.h>
121b823abeSJoseph Huber 
131b823abeSJoseph Huber int global_destroyed = false;
141b823abeSJoseph Huber 
151b823abeSJoseph Huber class A {
161b823abeSJoseph Huber private:
171b823abeSJoseph Huber   int val[1024];
181b823abeSJoseph Huber 
191b823abeSJoseph Huber public:
A(int i,int a)201b823abeSJoseph Huber   A(int i, int a) {
211b823abeSJoseph Huber     for (int k = 0; k < 1024; ++k)
221b823abeSJoseph Huber       val[k] = 0;
231b823abeSJoseph Huber     val[i] = a;
241b823abeSJoseph Huber   }
251b823abeSJoseph Huber 
~A()261b823abeSJoseph Huber   ~A() { global_destroyed = true; }
271b823abeSJoseph Huber 
get(int i) const281b823abeSJoseph Huber   int get(int i) const { return val[i]; }
291b823abeSJoseph Huber };
301b823abeSJoseph Huber 
311b823abeSJoseph Huber int GLOBAL_INDEX = 512;
321b823abeSJoseph Huber int INITVAL_INITIALIZER = 0x600D;
331b823abeSJoseph Huber int BEFORE_INITIALIZER = 0xFEED;
341b823abeSJoseph Huber 
351b823abeSJoseph Huber A global(GLOBAL_INDEX, INITVAL_INITIALIZER);
361b823abeSJoseph Huber 
371b823abeSJoseph Huber int initval = 0;
381b823abeSJoseph Huber int before = 0;
391b823abeSJoseph Huber 
run_before()40*abd85cd4SJoseph Huber __attribute__((constructor(101))) void run_before() {
411b823abeSJoseph Huber   before = BEFORE_INITIALIZER;
421b823abeSJoseph Huber }
431b823abeSJoseph Huber 
run_after()44*abd85cd4SJoseph Huber __attribute__((constructor(65535))) void run_after() {
451b823abeSJoseph Huber   ASSERT_EQ(before, BEFORE_INITIALIZER);
461b823abeSJoseph Huber }
471b823abeSJoseph Huber 
set_initval()481b823abeSJoseph Huber __attribute__((constructor)) void set_initval() {
491b823abeSJoseph Huber   initval = INITVAL_INITIALIZER;
501b823abeSJoseph Huber }
reset_initval()51ce38cbb1SJoseph Huber __attribute__((destructor(101))) void reset_initval() {
521b823abeSJoseph Huber   ASSERT_TRUE(global_destroyed);
531b823abeSJoseph Huber   initval = 0;
541b823abeSJoseph Huber }
551b823abeSJoseph Huber 
TEST_MAIN(int argc,char ** argv,char ** env)562e1c0ec6SJoseph Huber TEST_MAIN(int argc, char **argv, char **env) {
571b823abeSJoseph Huber   ASSERT_EQ(global.get(GLOBAL_INDEX), INITVAL_INITIALIZER);
581b823abeSJoseph Huber   ASSERT_EQ(initval, INITVAL_INITIALIZER);
591b823abeSJoseph Huber   return 0;
601b823abeSJoseph Huber }
61