Summary: We call the global constructors by function pointer. For whatever reason the NVPTX architecture relies very specifically on the arguments to the function pointer invocation matching what the function is implemented as. This is problematic as most of these constructors are generated with no arguments. This patch removes the extended arguments that GNU and LLVM use for the constructors optionally so that it can support the common case.
61 lines
1.4 KiB
C++
61 lines
1.4 KiB
C++
//===-- 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 argc, char **argv, char **env) {
|
|
ASSERT_EQ(global.get(GLOBAL_INDEX), INITVAL_INITIALIZER);
|
|
ASSERT_EQ(initval, INITVAL_INITIALIZER);
|
|
return 0;
|
|
}
|