[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:
Joseph Huber
2023-11-09 09:21:52 -06:00
parent 129a91ec01
commit dc30fa6aca
3 changed files with 4 additions and 5 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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(