]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libbacktrace: Add hpux fileline support
authorJohn David Anglin <danglin@gcc.gnu.org>
Thu, 10 Apr 2025 14:00:13 +0000 (10:00 -0400)
committerJohn David Anglin <danglin@gcc.gnu.org>
Thu, 10 Apr 2025 14:00:13 +0000 (10:00 -0400)
Fixes libstdc++ stacktrace tests.

2025-04-10  John David Anglin  <danglin@gcc.gnu.org>

libbacktrace/ChangeLog:
* fileline.c (hpux_get_executable_path): New.
(fileline_initialize): Add pass to get hpux executable path.

libbacktrace/fileline.c

index c9fd86b8c0cd1321ea0d05790ac6677afc63993d..d2900aa3c66be1fe64cd3d44a11d5a8e63370639 100644 (file)
@@ -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_LEAN_AND_MEAN
 #define WIN32_LEAN_AND_MEAN
@@ -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 ();
        }