filetype.awk: Add AIX XCOFF type detection.
authorTony Reix <tony.reix@atos.net>
Fri, 21 Jul 2017 18:05:08 +0000 (18:05 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 21 Jul 2017 18:05:08 +0000 (18:05 +0000)
* filetype.awk: Add AIX XCOFF type detection.
* configure.ac: Recognize xcoff format.
* Makefile.am (FORMAT_FILES): Add xcoff.c.
* fileline.c: Include <unistd.h>.
(fileline_initialize): Add case for AIX procfs.
* xcoff.c: New file.
* configure, Makefile.in: Rebuild.

From-SVN: r250435

libbacktrace/ChangeLog
libbacktrace/Makefile.am
libbacktrace/Makefile.in
libbacktrace/configure
libbacktrace/configure.ac
libbacktrace/fileline.c
libbacktrace/filetype.awk
libbacktrace/xcoff.c [new file with mode: 0644]

index eb9bb6ab889047125dd717503baa88470fa4f232..b233f3e8cae4f7bfc49e0714cea18983333f7dec 100644 (file)
@@ -1,3 +1,13 @@
+2017-07-21  Tony Reix  <tony.reix@atos.net>
+
+       * filetype.awk: Add AIX XCOFF type detection.
+       * configure.ac: Recognize xcoff format.
+       * Makefile.am (FORMAT_FILES): Add xcoff.c.
+       * fileline.c: Include <unistd.h>.
+       (fileline_initialize): Add case for AIX procfs.
+       * xcoff.c: New file.
+       * configure, Makefile.in: Rebuild.
+
 2017-06-21  Richard Biener  <rguenther@suse.de>
 
        * configure.ac: Add AC_SYS_LARGEFILE.
index 640eeec5e22428cde304a8cf42d7745b48fbc670..b91d6bca2d6a46744173628cec991ba5f2f31bd0 100644 (file)
@@ -57,7 +57,8 @@ BACKTRACE_FILES = \
 FORMAT_FILES = \
        elf.c \
        pecoff.c \
-       unknown.c
+       unknown.c \
+       xcoff.c
 
 VIEW_FILES = \
        read.c \
@@ -155,3 +156,5 @@ sort.lo: config.h backtrace.h internal.h
 stest.lo: config.h backtrace.h internal.h
 state.lo: config.h backtrace.h backtrace-supported.h internal.h
 unknown.lo: config.h backtrace.h internal.h
+xcoff.lo: config.h backtrace.h internal.h
+
index a57dc235b33d8c57cf5af834890e0d30343c2216..5b2159d77ba402a4995127975652473e637a8b2a 100644 (file)
@@ -319,7 +319,8 @@ BACKTRACE_FILES = \
 FORMAT_FILES = \
        elf.c \
        pecoff.c \
-       unknown.c
+       unknown.c \
+       xcoff.c
 
 VIEW_FILES = \
        read.c \
@@ -817,6 +818,7 @@ sort.lo: config.h backtrace.h internal.h
 stest.lo: config.h backtrace.h internal.h
 state.lo: config.h backtrace.h backtrace-supported.h internal.h
 unknown.lo: config.h backtrace.h internal.h
+xcoff.lo: config.h backtrace.h internal.h
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
index e6420ea94daaf68abdbabaec452e6966b5b8b96e..896b23561ab22fa4eb2d0701de46ca5eb8336988 100755 (executable)
@@ -12048,6 +12048,9 @@ elf*) FORMAT_FILE="elf.lo" ;;
 pecoff) FORMAT_FILE="pecoff.lo"
         backtrace_supports_data=no
        ;;
+xcoff) FORMAT_FILE="xcoff.lo"
+       backtrace_supports_data=no
+       ;;
 *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not determine output file type" >&5
 $as_echo "$as_me: WARNING: could not determine output file type" >&2;}
    FORMAT_FILE="unknown.lo"
index 47ebdc18af201b4ea327fc1e178616282d01a9b5..36a6d470fc3be6cccf452854bba9e3ea9ead52d4 100644 (file)
@@ -233,6 +233,9 @@ elf*) FORMAT_FILE="elf.lo" ;;
 pecoff) FORMAT_FILE="pecoff.lo"
         backtrace_supports_data=no
        ;;
+xcoff) FORMAT_FILE="xcoff.lo"
+       backtrace_supports_data=no
+       ;;
 *) AC_MSG_WARN([could not determine output file type])
    FORMAT_FILE="unknown.lo"
    backtrace_supported=no
index 0fd350a30c9e39ee76a4837272a5e6f6aed8d131..303e4dce83a737b3b441dba873a75a5020b6ab3a 100644 (file)
@@ -37,6 +37,7 @@ POSSIBILITY OF SUCH DAMAGE.  */
 #include <errno.h>
 #include <fcntl.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #include "backtrace.h"
 #include "internal.h"
@@ -57,6 +58,7 @@ fileline_initialize (struct backtrace_state *state,
   int pass;
   int called_error_callback;
   int descriptor;
+  char buf[64];
 
   if (!state->threaded)
     failed = state->fileline_initialization_failed;
@@ -80,7 +82,7 @@ fileline_initialize (struct backtrace_state *state,
 
   descriptor = -1;
   called_error_callback = 0;
-  for (pass = 0; pass < 4; ++pass)
+  for (pass = 0; pass < 5; ++pass)
     {
       const char *filename;
       int does_not_exist;
@@ -99,6 +101,10 @@ fileline_initialize (struct backtrace_state *state,
        case 3:
          filename = "/proc/curproc/file";
          break;
+       case 4:
+         snprintf (buf, sizeof (buf), "/proc/%d/object/a.out", getpid ());
+         filename = buf;
+         break;
        default:
          abort ();
        }
index 57bab797a9a8abc1a1310ec077786f499775cfaa..7bee5e522536765cb0d0f27b6c802db5524e43c4 100644 (file)
@@ -3,3 +3,6 @@
 /\177ELF\002/ { if (NR == 1) { print "elf64"; exit } }
 /\114\001/    { if (NR == 1) { print "pecoff"; exit } }
 /\144\206/    { if (NR == 1) { print "pecoff"; exit } }
+/\001\337/    { if (NR == 1) { print "xcoff"; exit } }
+/\001\367/    { if (NR == 1) { print "xcoff"; exit } }
+
diff --git a/libbacktrace/xcoff.c b/libbacktrace/xcoff.c
new file mode 100644 (file)
index 0000000..8f3a849
--- /dev/null
@@ -0,0 +1,76 @@
+/* xcoff.c -- Get debug data from a XCOFFF file for backtraces.
+   Copyright (C) 2017 Free Software Foundation, Inc.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    (1) Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+    (2) Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.  */
+
+#include "config.h"
+
+#include <sys/types.h>
+
+#include "backtrace.h"
+#include "internal.h"
+
+/* A trivial routine that always fails to find fileline data.  */
+
+static int
+xcoff_fileline (struct backtrace_state *state ATTRIBUTE_UNUSED,
+               uintptr_t pc, backtrace_full_callback callback,
+               backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
+               void *data)
+
+{
+  static char buf[32];
+
+  snprintf (buf, sizeof(buf), "pc=0x%llx", (unsigned long long) pc);
+  return callback (data, pc, "unknown_file", 123, buf);
+}
+
+static void
+xcoff_syminfo (struct backtrace_state *state ATTRIBUTE_UNUSED, uintptr_t addr,
+               backtrace_syminfo_callback callback,
+               backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
+               void *data)
+{
+  callback (data, addr, "unknown", 0, 0);
+}
+
+/* Initialize the backtrace data when we don't know how to read the
+   debug info.  */
+
+int
+backtrace_initialize (struct backtrace_state *state ATTRIBUTE_UNUSED,
+                     int descriptor ATTRIBUTE_UNUSED,
+                     backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
+                     void *data ATTRIBUTE_UNUSED, fileline *fileline_fn)
+{
+  state->syminfo_fn = xcoff_syminfo;
+  state->fileline_data = NULL;
+  *fileline_fn = xcoff_fileline;
+  return 1;
+}