Description:
* This patch enables libbacktrace to handle XCOFF on AIX.
Tests:
* Fedora25/x86_64 + GCC v7.1.0 : Configure/Build: SUCCESS
- build made by means of a .spec file based on Fedora gcc-7.0.1-0.12 .spec
file
../configure --enable-bootstrap
--enable-languages=c,c++,objc,obj-c++,fortran,go,lto --prefix=/usr
--mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared
--enable-threads=posix --enable-checking=release --enable-multilib
--with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
--enable-gnu-unique-object --enable-linker-build-id
--with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin
--enable-initfini-array --with-isl --enable-libmpx
--enable-offload-targets=nvptx-none --without-cuda-driver
--enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686
--build=x86_64-redhat-linux
ChangeLog:
* libbacktrace/Makefile.am : Add xcoff.c
* libbacktrace/Makefile.in : Regenerated
* libbacktrace/configure.ac : Add XCOFF output file type
* libbacktrace/configure : Regenerated
* libbacktrace/fileline.c : Handle AIX procfs tree
* libbacktrace/filetype.awk : Add AIX XCOFF type detection
* libbacktrace/xcoff.c : New file for handling XCOFF format
Regards,
Tony Reix
Bull - ATOS
IBM Coop Architect & Technical Leader
Office : +33 (0) 4 76 29 72 67
1 rue de Provence - 38432 Échirolles - France
www.atos.net
diff -Nur gcc-7-20170203.orig/libbacktrace/Makefile.am
gcc-7-20170203/libbacktrace/Makefile.am
--- gcc-7-20170203.orig/libbacktrace/Makefile.am 2017-01-02 01:19:31
-0600
+++ gcc-7-20170203/libbacktrace/Makefile.am 2017-03-22 14:09:40 -0500
@@ -57,7 +57,8 @@
FORMAT_FILES = \
elf.c \
pecoff.c \
- unknown.c
+ unknown.c \
+ xcoff.c
VIEW_FILES = \
read.c \
@@ -134,3 +135,5 @@
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 -Nur gcc-7-20170203.orig/libbacktrace/Makefile.in
gcc-7-20170203/libbacktrace/Makefile.in
--- gcc-7-20170203.orig/libbacktrace/Makefile.in 2016-11-16 16:36:10
-0600
+++ gcc-7-20170203/libbacktrace/Makefile.in 2017-03-22 14:06:51 -0500
@@ -301,7 +301,8 @@
FORMAT_FILES = \
elf.c \
pecoff.c \
- unknown.c
+ unknown.c \
+ xcoff.c
VIEW_FILES = \
read.c \
@@ -764,6 +765,7 @@
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 -Nur gcc-7-20170203.orig/libbacktrace/configure
gcc-7-20170203/libbacktrace/configure
--- gcc-7-20170203.orig/libbacktrace/configure 2016-11-16 16:36:13 -0600
+++ gcc-7-20170203/libbacktrace/configure 2017-03-22 14:13:40 -0500
@@ -11844,6 +11844,9 @@
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 -Nur gcc-7-20170203.orig/libbacktrace/configure.ac
gcc-7-20170203/libbacktrace/configure.ac
--- gcc-7-20170203.orig/libbacktrace/configure.ac 2017-01-02 01:19:31
-0600
+++ gcc-7-20170203/libbacktrace/configure.ac 2017-03-22 13:59:23 -0500
@@ -231,6 +231,9 @@
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 -Nur gcc-7-20170203.orig/libbacktrace/fileline.c
gcc-7-20170203/libbacktrace/fileline.c
--- gcc-7-20170203.orig/libbacktrace/fileline.c 2017-01-02 01:19:54 -0600
+++ gcc-7-20170203/libbacktrace/fileline.c 2017-02-27 13:46:50 -0600
@@ -37,6 +37,9 @@
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
+#ifdef _AIX
+#include <unistd.h> /* getpid */
+#endif
#include "backtrace.h"
#include "internal.h"
@@ -83,6 +86,9 @@
for (pass = 0; pass < 4; ++pass)
{
const char *filename;
+#ifdef _AIX
+ char buf[64];
+#endif
int does_not_exist;
switch (pass)
@@ -94,7 +100,12 @@
filename = getexecname ();
break;
case 2:
+#ifdef _AIX
+ snprintf(buf, sizeof(buf), "/proc/%d/object/a.out", getpid());
+ filename = buf;
+#else
filename = "/proc/self/exe";
+#endif
break;
case 3:
filename = "/proc/curproc/file";
diff -Nur gcc-7-20170203.orig/libbacktrace/filetype.awk
gcc-7-20170203/libbacktrace/filetype.awk
--- gcc-7-20170203.orig/libbacktrace/filetype.awk 2016-11-16 16:36:10
-0600
+++ gcc-7-20170203/libbacktrace/filetype.awk 2017-03-22 14:06:04 -0500
@@ -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 -Nur gcc-7-20170203.orig/libbacktrace/xcoff.c
gcc-7-20170203/libbacktrace/xcoff.c
--- gcc-7-20170203.orig/libbacktrace/xcoff.c 1969-12-31 18:00:00 -0600
+++ gcc-7-20170203/libbacktrace/xcoff.c 2017-03-23 12:04:32 -0500
@@ -0,0 +1,77 @@
+/* xcoff.c -- Get debug data from a XCOFFF file for backtraces.
+ Copyright (C) 2012-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;
+}
+