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 ();
        }

Reply via email to