https://gcc.gnu.org/g:57f930fa9774ab3ec7479fc85d70135df271a8b0
commit r14-11685-g57f930fa9774ab3ec7479fc85d70135df271a8b0 Author: John David Anglin <dang...@gcc.gnu.org> Date: Thu Apr 10 10:00:13 2025 -0400 libbacktrace: Add hpux fileline support Fixes libstdc++ stacktrace tests. 2025-04-10 John David Anglin <dang...@gcc.gnu.org> libbacktrace/ChangeLog: * fileline.c (hpux_get_executable_path): New. (fileline_initialize): Add pass to get hpux executable path. Diff: --- libbacktrace/fileline.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/libbacktrace/fileline.c b/libbacktrace/fileline.c index 68e80c6d2742..767e08e87b89 100644 --- a/libbacktrace/fileline.c +++ b/libbacktrace/fileline.c @@ -47,6 +47,10 @@ POSSIBILITY OF SUCH DAMAGE. */ #include <mach-o/dyld.h> #endif +#ifdef __hpux__ +#include <dl.h> +#endif + #ifdef HAVE_WINDOWS_H #ifndef WIN32_MEAN_AND_LEAN #define WIN32_MEAN_AND_LEAN @@ -66,6 +70,33 @@ POSSIBILITY OF SUCH DAMAGE. */ #define getexecname() NULL #endif +#ifdef __hpux__ +static char * +hpux_get_executable_path (struct backtrace_state *state, + backtrace_error_callback error_callback, void *data) +{ + struct shl_descriptor *desc; + size_t len = sizeof (struct shl_descriptor); + + desc = backtrace_alloc (state, len, error_callback, data); + if (desc == NULL) + return NULL; + + if (shl_get_r (0, desc) == -1) + { + backtrace_free (state, desc, len, error_callback, data); + return NULL; + } + + return desc->filename; +} + +#else + +#define hpux_get_executable_path(state, error_callback, data) NULL + +#endif + #if !defined (HAVE_KERN_PROC_ARGS) && !defined (HAVE_KERN_PROC) #define sysctl_exec_name1(state, error_callback, data) NULL @@ -245,7 +276,7 @@ fileline_initialize (struct backtrace_state *state, descriptor = -1; called_error_callback = 0; - for (pass = 0; pass < 10; ++pass) + for (pass = 0; pass < 11; ++pass) { int does_not_exist; @@ -285,6 +316,9 @@ fileline_initialize (struct backtrace_state *state, case 9: filename = windows_get_executable_path (buf, error_callback, data); break; + case 10: + filename = hpux_get_executable_path (state, error_callback, data); + break; default: abort (); }