mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 12:26:52 +08:00
[libc][fix] Call GPU destructors in the correct order
Summary: I was mistakenly iterating the list backwards. Regular semantics puts both arrays in priority order but the destructors are called backwards.
This commit is contained in:
@@ -37,8 +37,8 @@ static void call_init_array_callbacks(int argc, char **argv, char **env) {
|
||||
|
||||
static void call_fini_array_callbacks() {
|
||||
size_t fini_array_size = __fini_array_end - __fini_array_start;
|
||||
for (size_t i = 0; i < fini_array_size; ++i)
|
||||
reinterpret_cast<FiniCallback *>(__fini_array_start[i])();
|
||||
for (size_t i = fini_array_size; i > 0; --i)
|
||||
reinterpret_cast<FiniCallback *>(__fini_array_start[i - 1])();
|
||||
}
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
|
||||
@@ -35,8 +35,8 @@ static void call_init_array_callbacks(int argc, char **argv, char **env) {
|
||||
|
||||
static void call_fini_array_callbacks() {
|
||||
size_t fini_array_size = __fini_array_end - __fini_array_start;
|
||||
for (size_t i = 0; i < fini_array_size; ++i)
|
||||
reinterpret_cast<FiniCallback *>(__fini_array_start[i])();
|
||||
for (size_t i = fini_array_size; i > 0; --i)
|
||||
reinterpret_cast<FiniCallback *>(__fini_array_start[i - 1])();
|
||||
}
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
|
||||
@@ -83,7 +83,6 @@ Expected<void *> get_ctor_dtor_array(const void *image, const size_t size,
|
||||
// for destructors.
|
||||
llvm::sort(ctors, [](auto x, auto y) { return x.second < y.second; });
|
||||
llvm::sort(dtors, [](auto x, auto y) { return x.second < y.second; });
|
||||
llvm::reverse(dtors);
|
||||
|
||||
// Allocate host pinned memory to make these arrays visible to the GPU.
|
||||
CUdeviceptr *dev_memory = reinterpret_cast<CUdeviceptr *>(allocator(
|
||||
|
||||
Reference in New Issue
Block a user