summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Reix <tony.reix@atos.net>2017-07-21 18:05:08 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2017-07-21 18:05:08 +0000
commitb3530b946f208bb581d2bcba2b311331a70bb97f (patch)
tree88ddb70d8e7d40f7a99e8fab445d41cce28e90b5
parent60f80e6541b845a20827b8584d8c276f54ed7506 (diff)
filetype.awk: Add AIX XCOFF type detection.
* 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
-rw-r--r--libbacktrace/ChangeLog10
-rw-r--r--libbacktrace/Makefile.am5
-rw-r--r--libbacktrace/Makefile.in4
-rwxr-xr-xlibbacktrace/configure3
-rw-r--r--libbacktrace/configure.ac3
-rw-r--r--libbacktrace/fileline.c8
-rw-r--r--libbacktrace/filetype.awk3
-rw-r--r--libbacktrace/xcoff.c76
8 files changed, 109 insertions, 3 deletions
diff --git a/libbacktrace/ChangeLog b/libbacktrace/ChangeLog
index eb9bb6ab889..b233f3e8cae 100644
--- a/libbacktrace/ChangeLog
+++ b/libbacktrace/ChangeLog
@@ -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.
diff --git a/libbacktrace/Makefile.am b/libbacktrace/Makefile.am
index 640eeec5e22..b91d6bca2d6 100644
--- a/libbacktrace/Makefile.am
+++ b/libbacktrace/Makefile.am
@@ -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
+
diff --git a/libbacktrace/Makefile.in b/libbacktrace/Makefile.in
index a57dc235b33..5b2159d77ba 100644
--- a/libbacktrace/Makefile.in
+++ b/libbacktrace/Makefile.in
@@ -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.
diff --git a/libbacktrace/configure b/libbacktrace/configure
index e6420ea94da..896b23561ab 100755
--- a/libbacktrace/configure
+++ b/libbacktrace/configure
@@ -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"
diff --git a/libbacktrace/configure.ac b/libbacktrace/configure.ac
index 47ebdc18af2..36a6d470fc3 100644
--- a/libbacktrace/configure.ac
+++ b/libbacktrace/configure.ac
@@ -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
diff --git a/libbacktrace/fileline.c b/libbacktrace/fileline.c
index 0fd350a30c9..303e4dce83a 100644
--- a/libbacktrace/fileline.c
+++ b/libbacktrace/fileline.c
@@ -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 ();
}
diff --git a/libbacktrace/filetype.awk b/libbacktrace/filetype.awk
index 57bab797a9a..7bee5e52253 100644
--- a/libbacktrace/filetype.awk
+++ b/libbacktrace/filetype.awk
@@ -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
index 00000000000..8f3a8495995
--- /dev/null
+++ b/libbacktrace/xcoff.c
@@ -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;
+}