diff --git a/libc/startup/gpu/amdgpu/start.cpp b/libc/startup/gpu/amdgpu/start.cpp index 89b0be208d2e7f..9d7f04c10b4882 100644 --- a/libc/startup/gpu/amdgpu/start.cpp +++ b/libc/startup/gpu/amdgpu/start.cpp @@ -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(__fini_array_start[i])(); + for (size_t i = fini_array_size; i > 0; --i) + reinterpret_cast(__fini_array_start[i - 1])(); } } // namespace LIBC_NAMESPACE diff --git a/libc/startup/gpu/nvptx/start.cpp b/libc/startup/gpu/nvptx/start.cpp index 1ff187a577789f..2c09430c5971ef 100644 --- a/libc/startup/gpu/nvptx/start.cpp +++ b/libc/startup/gpu/nvptx/start.cpp @@ -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(__fini_array_start[i])(); + for (size_t i = fini_array_size; i > 0; --i) + reinterpret_cast(__fini_array_start[i - 1])(); } } // namespace LIBC_NAMESPACE diff --git a/libc/utils/gpu/loader/nvptx/Loader.cpp b/libc/utils/gpu/loader/nvptx/Loader.cpp index e920b65a7e10cc..5388f287063b7f 100644 --- a/libc/utils/gpu/loader/nvptx/Loader.cpp +++ b/libc/utils/gpu/loader/nvptx/Loader.cpp @@ -83,7 +83,6 @@ Expected 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(allocator(