[libcxx-commits] [libcxxabi] [libc++abi][AIX] Use different function pointer types for destructors with 1 or 2 args (PR #89624)
Xing Xue via libcxx-commits
libcxx-commits at lists.llvm.org
Wed May 1 09:45:13 PDT 2024
https://github.com/xingxue-ibm updated https://github.com/llvm/llvm-project/pull/89624
>From cef5fd596c669188770f7f0546636a5a9490c737 Mon Sep 17 00:00:00 2001
From: Xing Xue <xingxue at outlook.com>
Date: Mon, 22 Apr 2024 12:08:01 -0400
Subject: [PATCH 1/2] Use different function pointers in the union of FSMEntry
for destructors with 1 or 2 arguments.
---
libcxxabi/src/aix_state_tab_eh.inc | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)
diff --git a/libcxxabi/src/aix_state_tab_eh.inc b/libcxxabi/src/aix_state_tab_eh.inc
index 9f46001b020906..7a0d03fd59dbea 100644
--- a/libcxxabi/src/aix_state_tab_eh.inc
+++ b/libcxxabi/src/aix_state_tab_eh.inc
@@ -102,8 +102,6 @@ static bool state_tab_dbg() {
namespace __state_table_eh {
-using destruct_f = void (*)(void*);
-
// Definition of flags for the state table entry field 'action flag'.
enum FSMEntryCount : intptr_t { beginCatch = -1, endCatch = -2, deleteObject = -3, cleanupLabel = -4, terminate = -5 };
@@ -145,8 +143,10 @@ struct FSMEntry {
intptr_t nextStatePtr;
};
union {
- // Address of the destructor function.
- void (*destructor)(void*, size_t);
+ // Address of the destructor function with 1 argument.
+ void (*destructor)(void*);
+ // Address of the destructor function with 2 arguments.
+ void (*destructor2)(void*, size_t);
// The address of the catch block or cleanup code.
void* landingPad;
};
@@ -191,17 +191,12 @@ static void invoke_destructor(FSMEntry* fsmEntry, void* addr) {
try {
if (fsmEntry->elementCount == 1) {
_LIBCXXABI_TRACE_STATETAB0("calling scalar destructor\n");
- (*fsmEntry->destructor)(addr, dtorArgument);
+ (*fsmEntry->destructor2)(addr, dtorArgument);
_LIBCXXABI_TRACE_STATETAB0("returned from scalar destructor\n");
} else {
_LIBCXXABI_TRACE_STATETAB0("calling vector destructor\n");
- // TODO: in the legacy ABI, destructors had a second argument. We don't expect to encounter
- // destructors of this type in the itanium-based ABI, so this should be safe, but this could use some cleanup.
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wcast-function-type"
__cxa_vec_cleanup(addr, reinterpret_cast<size_t>(fsmEntry->elementCount), fsmEntry->elemSize,
- reinterpret_cast<destruct_f>(fsmEntry->destructor));
-#pragma GCC diagnostic pop
+ fsmEntry->destructor);
_LIBCXXABI_TRACE_STATETAB0("returned from vector destructor\n");
}
} catch (...) {
@@ -218,7 +213,7 @@ static void invoke_delete(FSMEntry* fsmEntry, void* addr) {
try {
_LIBCXXABI_TRACE_STATETAB0("..calling delete()\n");
// 'destructor' holds a function pointer to delete().
- (*fsmEntry->destructor)(objectAddress, fsmEntry->elemSize);
+ (*fsmEntry->destructor2)(objectAddress, fsmEntry->elemSize);
_LIBCXXABI_TRACE_STATETAB0("..returned from delete()\n");
} catch (...) {
_LIBCXXABI_TRACE_STATETAB0("Uncaught exception in delete(), terminating\n");
>From 0733800fd51760c79517cb89bc1415ba0eb8b452 Mon Sep 17 00:00:00 2001
From: Xing Xue <xingxue at outlook.com>
Date: Wed, 1 May 2024 12:44:09 -0400
Subject: [PATCH 2/2] Addressed comments. - rename destructor2 as xlCDestructor
---
libcxxabi/src/aix_state_tab_eh.inc | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/libcxxabi/src/aix_state_tab_eh.inc b/libcxxabi/src/aix_state_tab_eh.inc
index 7a0d03fd59dbea..285c9ac71d60d5 100644
--- a/libcxxabi/src/aix_state_tab_eh.inc
+++ b/libcxxabi/src/aix_state_tab_eh.inc
@@ -146,7 +146,7 @@ struct FSMEntry {
// Address of the destructor function with 1 argument.
void (*destructor)(void*);
// Address of the destructor function with 2 arguments.
- void (*destructor2)(void*, size_t);
+ void (*xlCDestructor)(void*, size_t);
// The address of the catch block or cleanup code.
void* landingPad;
};
@@ -191,7 +191,7 @@ static void invoke_destructor(FSMEntry* fsmEntry, void* addr) {
try {
if (fsmEntry->elementCount == 1) {
_LIBCXXABI_TRACE_STATETAB0("calling scalar destructor\n");
- (*fsmEntry->destructor2)(addr, dtorArgument);
+ (*fsmEntry->xlCDestructor)(addr, dtorArgument);
_LIBCXXABI_TRACE_STATETAB0("returned from scalar destructor\n");
} else {
_LIBCXXABI_TRACE_STATETAB0("calling vector destructor\n");
@@ -213,7 +213,7 @@ static void invoke_delete(FSMEntry* fsmEntry, void* addr) {
try {
_LIBCXXABI_TRACE_STATETAB0("..calling delete()\n");
// 'destructor' holds a function pointer to delete().
- (*fsmEntry->destructor2)(objectAddress, fsmEntry->elemSize);
+ (*fsmEntry->xlCDestructor)(objectAddress, fsmEntry->elemSize);
_LIBCXXABI_TRACE_STATETAB0("..returned from delete()\n");
} catch (...) {
_LIBCXXABI_TRACE_STATETAB0("Uncaught exception in delete(), terminating\n");
More information about the libcxx-commits
mailing list