From 972dcfcdbfe75dcfeb777150c136576cf1a71e99 Mon Sep 17 00:00:00 2001 From: Tudor Florea Date: Fri, 9 Oct 2015 22:59:03 +0200 Subject: initial commit for Enea Linux 5.0 arm Signed-off-by: Tudor Florea --- meta/recipes-devtools/gdb/gdb-7.7.1.inc | 10 + meta/recipes-devtools/gdb/gdb-common.inc | 70 + meta/recipes-devtools/gdb/gdb-cross-canadian.inc | 38 + .../gdb/gdb-cross-canadian_7.7.1.bb | 3 + meta/recipes-devtools/gdb/gdb-cross.inc | 26 + meta/recipes-devtools/gdb/gdb-cross_7.7.1.bb | 4 + meta/recipes-devtools/gdb/gdb.inc | 54 + .../gdb/0001-add-delay-before-run-exp-file.patch | 26 + .../0002-function-name-is-used-by-mistake.patch | 30 + .../change-scripts-support-from-ksh-to-bash.patch | 9 + .../gdb/gdb/gdb-ptest-attach.patch | 30 + .../gdb/gdb/gdbserver-cflags-last.diff | 25 + .../gdb/gdb/include_asm_ptrace.patch | 30 + .../gdb/gdb/kill_arm_map_symbols.patch | 26 + .../gdb/gdb/renesas-sh-native-support.patch | 1379 ++++++++++++++++++++ meta/recipes-devtools/gdb/gdb/run-ptest | 2 + meta/recipes-devtools/gdb/gdb/runtest-flags.patch | 30 + .../recipes-devtools/gdb/gdb/sim-install-6.6.patch | 14 + meta/recipes-devtools/gdb/gdb/sim-install.patch | 36 + meta/recipes-devtools/gdb/gdb/uclibc.patch | 196 +++ meta/recipes-devtools/gdb/gdb_7.7.1.bb | 24 + 21 files changed, 2062 insertions(+) create mode 100644 meta/recipes-devtools/gdb/gdb-7.7.1.inc create mode 100644 meta/recipes-devtools/gdb/gdb-common.inc create mode 100644 meta/recipes-devtools/gdb/gdb-cross-canadian.inc create mode 100644 meta/recipes-devtools/gdb/gdb-cross-canadian_7.7.1.bb create mode 100644 meta/recipes-devtools/gdb/gdb-cross.inc create mode 100644 meta/recipes-devtools/gdb/gdb-cross_7.7.1.bb create mode 100644 meta/recipes-devtools/gdb/gdb.inc create mode 100644 meta/recipes-devtools/gdb/gdb/0001-add-delay-before-run-exp-file.patch create mode 100644 meta/recipes-devtools/gdb/gdb/0002-function-name-is-used-by-mistake.patch create mode 100644 meta/recipes-devtools/gdb/gdb/change-scripts-support-from-ksh-to-bash.patch create mode 100644 meta/recipes-devtools/gdb/gdb/gdb-ptest-attach.patch create mode 100644 meta/recipes-devtools/gdb/gdb/gdbserver-cflags-last.diff create mode 100644 meta/recipes-devtools/gdb/gdb/include_asm_ptrace.patch create mode 100644 meta/recipes-devtools/gdb/gdb/kill_arm_map_symbols.patch create mode 100644 meta/recipes-devtools/gdb/gdb/renesas-sh-native-support.patch create mode 100755 meta/recipes-devtools/gdb/gdb/run-ptest create mode 100644 meta/recipes-devtools/gdb/gdb/runtest-flags.patch create mode 100644 meta/recipes-devtools/gdb/gdb/sim-install-6.6.patch create mode 100644 meta/recipes-devtools/gdb/gdb/sim-install.patch create mode 100644 meta/recipes-devtools/gdb/gdb/uclibc.patch create mode 100644 meta/recipes-devtools/gdb/gdb_7.7.1.bb (limited to 'meta/recipes-devtools/gdb') diff --git a/meta/recipes-devtools/gdb/gdb-7.7.1.inc b/meta/recipes-devtools/gdb/gdb-7.7.1.inc new file mode 100644 index 0000000000..aa16d5a09f --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb-7.7.1.inc @@ -0,0 +1,10 @@ +LICENSE = "GPLv2 & GPLv3 & LGPLv2 & LGPLv3" +LIC_FILES_CHKSUM = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552 \ + file://COPYING3;md5=d32239bcb673463ab874e80d47fae504 \ + file://COPYING3.LIB;md5=6a6a8e020838b23406c81b19c1d46df6 \ + file://COPYING.LIB;md5=9f604d8a4f8e74f4f5140845a21b6674" + +S = "${WORKDIR}/${BPN}-${PV}" + +SRC_URI[md5sum] = "45b07b53d81832d32ccd4829465d4886" +SRC_URI[sha256sum] = "eefadb9831e3695d1eaef34e98b8f1fb441df6fe5071317ea49c6bd6ba213eff" diff --git a/meta/recipes-devtools/gdb/gdb-common.inc b/meta/recipes-devtools/gdb/gdb-common.inc new file mode 100644 index 0000000000..93078028b0 --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb-common.inc @@ -0,0 +1,70 @@ +SUMMARY = "GNU debugger" +HOMEPAGE = "http://www.gnu.org/software/gdb/" +LICENSE = "GPLv3+" +SECTION = "devel" +DEPENDS = "expat zlib ncurses readline ${LTTNGUST}" + +LTTNGUST = "lttng-ust" +LTTNGUST_aarch64 = "" +LTTNGUST_libc-uclibc = "" +LTTNGUST_mips = "" +LTTNGUST_mipsel = "" +LTTNGUST_mips64 = "" +LTTNGUST_mips64el = "" +LTTNGUST_mips64n32 = "" +LTTNGUST_mips64eln32 = "" +LTTNGUST_sh4 = "" + +INC_PR = "r0" + +LIC_FILES_CHKSUM = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552 \ + file://COPYING.LIB;md5=9f604d8a4f8e74f4f5140845a21b6674 \ + file://COPYING3;md5=d32239bcb673463ab874e80d47fae504 \ + file://COPYING3.LIB;md5=6a6a8e020838b23406c81b19c1d46df6" +inherit autotools texinfo + +SRC_URI = "${GNU_MIRROR}/gdb/gdb-${PV}.tar.gz \ + " +export CC_FOR_BUILD = "${BUILD_CC}" +export CXX_FOR_BUILD = "${BUILD_CXX}" +export CPP_FOR_BUILD = "${BUILD_CPP}" +export CFLAGS_FOR_BUILD = "${BUILD_CFLAGS}" +export CXXFLAGS_FOR_BUILD = "${BUILD_CXXFLAGS}" +export CPPFLAGS_FOR_BUILD = "${BUILD_CPPFLAGS}" + +B = "${WORKDIR}/build-${TARGET_SYS}" + +EXTRA_OEMAKE = "'SUBDIRS=intl mmalloc libiberty opcodes bfd sim gdb etc utils'" + +EXPAT = "--with-expat --with-libexpat-prefix=${STAGING_DIR_HOST}" + +EXTRA_OECONF = "--disable-gdbtk --disable-tui --disable-x --disable-werror \ + --with-curses --disable-multilib --with-system-readline --disable-sim \ + --without-lzma \ + ${GDBPROPREFIX} ${EXPAT} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'multiarch', '--enable-64-bit-bfd', '', d)} \ + --disable-rpath \ + " + +GDBPROPREFIX = "--program-prefix=''" + +do_configure () { + # override this function to avoid the autoconf/automake/aclocal/autoheader + # calls for now + (cd ${S} && gnu-configize) || die "failure in running gnu-configize" + oe_runconf +} + +# we don't want gdb to provide bfd/iberty/opcodes, which instead will override the +# right bits installed by binutils. +do_install_append() { + rm -rf ${D}${libdir} + rm -rf ${D}${includedir} + rm -rf ${D}${datadir}/locale +} + +RRECOMMENDS_gdb_append_linux = " glibc-thread-db " +RRECOMMENDS_gdb_append_linux-gnueabi = " glibc-thread-db " +RRECOMMENDS_gdbserver_append_linux = " glibc-thread-db " +RRECOMMENDS_gdbserver_append_linux-gnueabi = " glibc-thread-db " + diff --git a/meta/recipes-devtools/gdb/gdb-cross-canadian.inc b/meta/recipes-devtools/gdb/gdb-cross-canadian.inc new file mode 100644 index 0000000000..844dce9451 --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb-cross-canadian.inc @@ -0,0 +1,38 @@ +inherit cross-canadian +inherit python-dir + +SUMMARY = "GNU debugger (cross-canadian gdb for ${TARGET_ARCH} target)" +PN = "gdb-cross-canadian-${TRANSLATED_TARGET_ARCH}" +BPN = "gdb" + +DEPENDS = "nativesdk-ncurses nativesdk-expat nativesdk-gettext nativesdk-readline nativesdk-python" +RDEPENDS_${PN} += "nativesdk-python-core nativesdk-python-lang nativesdk-python-re \ + nativesdk-python-codecs nativesdk-python-netclient" + +GDBPROPREFIX = "--program-prefix='${TARGET_PREFIX}'" + +EXTRA_OECONF_append = "--with-python=${WORKDIR}/python" + +SSTATE_DUPWHITELIST += "${STAGING_DATADIR}/gdb" + +do_configure_prepend() { +cat > ${WORKDIR}/python << EOF +#! /bin/sh +case "\$2" in + --includes) echo "-I${STAGING_INCDIR}/${PYTHON_DIR}/" ;; + --ldflags) echo "-Wl,-rpath-link,${STAGING_LIBDIR}/.. -Wl,-rpath,${libdir}/.. -lpthread -ldl -lutil -lm -lpython${PYTHON_BASEVERSION}" ;; + --exec-prefix) echo "${exec_prefix}" ;; + *) exit 1 ;; +esac +exit 0 +EOF + chmod +x ${WORKDIR}/python +} + +# we don't want gdb to provide bfd/iberty/opcodes, which instead will override the +# right bits installed by binutils. +do_install_append() { + rm -rf ${D}${exec_prefix}/lib + cross_canadian_bindirlinks +} + diff --git a/meta/recipes-devtools/gdb/gdb-cross-canadian_7.7.1.bb b/meta/recipes-devtools/gdb/gdb-cross-canadian_7.7.1.bb new file mode 100644 index 0000000000..301035940c --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb-cross-canadian_7.7.1.bb @@ -0,0 +1,3 @@ +require gdb-common.inc +require gdb-cross-canadian.inc +require gdb-${PV}.inc diff --git a/meta/recipes-devtools/gdb/gdb-cross.inc b/meta/recipes-devtools/gdb/gdb-cross.inc new file mode 100644 index 0000000000..6e44778cd3 --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb-cross.inc @@ -0,0 +1,26 @@ +require gdb-common.inc + +DEPENDS = "expat-native ncurses-native readline-native python-native" + +inherit pythonnative + +EXTRA_OECONF += "--with-python=${STAGING_BINDIR_NATIVE}/python-native/python" + +do_compile_prepend() { + export BUILD_SYS="${BUILD_SYS}" + export HOST_SYS="${HOST_SYS}" + export STAGING_LIBDIR="${STAGING_LIBDIR_NATIVE}" + export STAGING_INCDIR="${STAGING_INCDIR_NATIVE}" +} + +#EXTRA_OEMAKE += "LDFLAGS='${BUILD_LDFLAGS}'" + +GDBPROPREFIX = "" + +PN = "gdb-cross-${TARGET_ARCH}" +BPN = "gdb" + +inherit cross +inherit gettext + +datadir .= "/gdb-${TUNE_PKGARCH}${TARGET_VENDOR}-${TARGET_OS}" diff --git a/meta/recipes-devtools/gdb/gdb-cross_7.7.1.bb b/meta/recipes-devtools/gdb/gdb-cross_7.7.1.bb new file mode 100644 index 0000000000..f9da486d7d --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb-cross_7.7.1.bb @@ -0,0 +1,4 @@ +require gdb-cross.inc +require gdb-${PV}.inc + +SRC_URI += "file://sim-install-6.6.patch" diff --git a/meta/recipes-devtools/gdb/gdb.inc b/meta/recipes-devtools/gdb/gdb.inc new file mode 100644 index 0000000000..205f65e06e --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb.inc @@ -0,0 +1,54 @@ +require gdb-common.inc + +inherit gettext ptest + +SRC_URI += "file://kill_arm_map_symbols.patch \ + file://gdbserver-cflags-last.diff;striplevel=0 \ + file://renesas-sh-native-support.patch \ + file://run-ptest \ + file://runtest-flags.patch \ + file://0001-add-delay-before-run-exp-file.patch \ + file://0002-function-name-is-used-by-mistake.patch \ + file://gdb-ptest-attach.patch \ + file://include_asm_ptrace.patch \ + file://change-scripts-support-from-ksh-to-bash.patch \ + " +#LDFLAGS_append = " -s" +#export CFLAGS_append=" -L${STAGING_LIBDIR}" + +# cross-canadian must not see this +PACKAGES =+ "gdbserver" +FILES_gdbserver = "${bindir}/gdbserver" + + + +DEPENDS_${PN}-ptest += "expect dejagnu tcl" +RDEPENDS_${PN}-ptest += "glibc-charmap-ibm1047 \ + glibc-gconv-ibm1047 \ + glibc-charmap-ebcdic-us \ + glibc-gconv-ebcdic-us \ + glibc-gconv-utf-32 \ + glibc-gconv-utf-16 \ + prelink \ + expect \ + dejagnu \ + make \ + bash \ + " +do_configure_ptest () { + if [ "${PN}" = "${BPN}" ]; then + cd ${S}/gdb/testsuite/ + ./configure --host=${HOST_SYS} --build=${BUILD_SYS} + make site.exp + fi +} + +do_install_ptest () { + if [ "${PN}" = "${BPN}" ]; then + cp -r ${S}/gdb/testsuite/ ${D}${PTEST_PATH} + cp -r ${S}/gdb/features/ ${D}${PTEST_PATH} + cp ${S}/config.sub ${D}${PTEST_PATH}/testsuite/ + cp ${S}/config.guess ${D}${PTEST_PATH}/testsuite/ + cp ${S}/install-sh ${D}${PTEST_PATH}/testsuite/ + fi +} diff --git a/meta/recipes-devtools/gdb/gdb/0001-add-delay-before-run-exp-file.patch b/meta/recipes-devtools/gdb/gdb/0001-add-delay-before-run-exp-file.patch new file mode 100644 index 0000000000..1c415622e7 --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb/0001-add-delay-before-run-exp-file.patch @@ -0,0 +1,26 @@ +Description: Add delay for stable running + +Author: jack zhang +Date: Mon, 12 Nov 2012 04:10:20 +0100 + +Upstream-Status: Pending + +Signed-off-by: jack zhang +Signed-off-by: Ciprian Barbu +--- + gdb/testsuite/dg-extract-results.sh | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/gdb/testsuite/dg-extract-results.sh b/gdb/testsuite/dg-extract-results.sh +--- a/gdb/testsuite/dg-extract-results.sh ++++ b/gdb/testsuite/dg-extract-results.sh +@@ -322,6 +322,7 @@ END { + n=1 + while (n < expfileno) { + if (expfileseen[expfiles[n]]) { ++ sleep 1 + print "Running "expfiles[n]" ..." + if (filewritten["${TMP}/list"n]) { + if (expfileseen[expfiles[n]] == 1) +-- +1.7.5.4 diff --git a/meta/recipes-devtools/gdb/gdb/0002-function-name-is-used-by-mistake.patch b/meta/recipes-devtools/gdb/gdb/0002-function-name-is-used-by-mistake.patch new file mode 100644 index 0000000000..7f25a357e0 --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb/0002-function-name-is-used-by-mistake.patch @@ -0,0 +1,30 @@ +Description: function name is used by mistake + +Author: jack zhang +Date: Tue, 13 Nov 2012 09:56:54 +0100 + +Upstream-Status: Pending + +Signed-off-by: jack zhang +Signed-off-by: Ciprian Barbu +--- + gdb/testsuite/gdb.base/skip.exp | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/skip.exp b/gdb/testsuite/gdb.base/skip.exp +--- a/gdb/testsuite/gdb.base/skip.exp ++++ b/gdb/testsuite/gdb.base/skip.exp +@@ -113,9 +113,9 @@ gdb_test "info skip 3" ".*\\n3\\s+file\\s+n.*" \ + "info skip shows entry as disabled" + + if ![runto_main] { fail "skip tests suppressed" } +-gdb_test "step" "bar \\(\\) at.*" "step after disabling 3 (1)" ++gdb_test "step" "foo \\(\\) at.*" "step after disabling 3 (1)" + gdb_test "step" ".*" "step after disabling 3 (2)"; # Return from foo() +-gdb_test "step" "foo \\(\\) at.*" "step after disabling 3 (3)" ++gdb_test "step" "bar \\(\\) at.*" "step after disabling 3 (3)" + gdb_test "step" ".*" "step after disabling 3 (4)"; # Return from bar() + gdb_test "step" "main \\(\\) at.*" "step after disabling 3 (5)" + +-- +1.7.5.4 diff --git a/meta/recipes-devtools/gdb/gdb/change-scripts-support-from-ksh-to-bash.patch b/meta/recipes-devtools/gdb/gdb/change-scripts-support-from-ksh-to-bash.patch new file mode 100644 index 0000000000..878207a96f --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb/change-scripts-support-from-ksh-to-bash.patch @@ -0,0 +1,9 @@ +diff -Naur a/gdb/testsuite/gdb.hp/tools/odump b/gdb/testsuite/gdb.hp/tools/odump +--- a/gdb/testsuite/gdb.hp/tools/odump 2015-05-25 10:13:31.956107840 +0200 ++++ b/gdb/testsuite/gdb.hp/tools/odump 2015-05-25 10:14:04.690707176 +0200 +@@ -1,4 +1,4 @@ +-#!/bin/ksh ++#!/bin/bash + + # First source /app/appserver + . /app/appserver diff --git a/meta/recipes-devtools/gdb/gdb/gdb-ptest-attach.patch b/meta/recipes-devtools/gdb/gdb/gdb-ptest-attach.patch new file mode 100644 index 0000000000..b95ac2c163 --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb/gdb-ptest-attach.patch @@ -0,0 +1,30 @@ +From f442dc426b0346e1e413a7c3ae5b07725837135c Mon Sep 17 00:00:00 2001 +From: "Rick.Yang" +Date: Sun, 11 Nov 2012 10:05:50 +0100 +Subject: [PATCH] Fix the failed test case. + +Description: Fixed failing test case + In fact, the test case is passing, but the output does not completely + match the expected pattern in some special case. Modified the pattern + to resolve it. + +Signed-off-by: Rick.Yang +Signed-off-by: Ciprian Barbu +--- + gdb/testsuite/gdb.base/attach.exp | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/attach.exp b/gdb/testsuite/gdb.base/attach.exp +--- a/gdb/testsuite/gdb.base/attach.exp ++++ b/gdb/testsuite/gdb.base/attach.exp +@@ -285,7 +285,7 @@ proc do_attach_tests {} { + gdb_test "dir ${objdir}/${subdir}" "Source directories searched: .*" \ + "set source path" + +- gdb_test "cd /tmp" "Working directory /tmp." \ ++ gdb_test "cd /tmp" "Working directory /tmp.*" \ + "cd away from process working directory" + + # Explicitly flush out any knowledge of the previous attachment. +-- +1.7.5.4 diff --git a/meta/recipes-devtools/gdb/gdb/gdbserver-cflags-last.diff b/meta/recipes-devtools/gdb/gdb/gdbserver-cflags-last.diff new file mode 100644 index 0000000000..4dfc419c43 --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb/gdbserver-cflags-last.diff @@ -0,0 +1,25 @@ +Upstream-Status: Pending + +--- + gdb/gdbserver/Makefile.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- gdb/gdbserver/Makefile.in.orig ++++ gdb/gdbserver/Makefile.in +@@ -118,14 +118,14 @@ WARN_CFLAGS_NO_FORMAT = `echo " $(WARN_C + # CFLAGS is specifically reserved for setting from the command line + # when running make. I.E. "make CFLAGS=-Wmissing-prototypes". + CFLAGS = @CFLAGS@ + + # INTERNAL_CFLAGS is the aggregate of all other *CFLAGS macros. +-INTERNAL_CFLAGS_BASE = ${CFLAGS} ${GLOBAL_CFLAGS} \ ++INTERNAL_CFLAGS_BASE = ${GLOBAL_CFLAGS} \ + ${PROFILE_CFLAGS} ${INCLUDE_CFLAGS} + INTERNAL_WARN_CFLAGS = ${INTERNAL_CFLAGS_BASE} $(WARN_CFLAGS) +-INTERNAL_CFLAGS = ${INTERNAL_WARN_CFLAGS} $(WERROR_CFLAGS) -DGDBSERVER ++INTERNAL_CFLAGS = ${INTERNAL_WARN_CFLAGS} $(WERROR_CFLAGS) ${CFLAGS} -DGDBSERVER + + # LDFLAGS is specifically reserved for setting from the command line + # when running make. + LDFLAGS = @LDFLAGS@ + INTERNAL_LDFLAGS = $(LDFLAGS) @RDYNAMIC@ diff --git a/meta/recipes-devtools/gdb/gdb/include_asm_ptrace.patch b/meta/recipes-devtools/gdb/gdb/include_asm_ptrace.patch new file mode 100644 index 0000000000..85e0147665 --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb/include_asm_ptrace.patch @@ -0,0 +1,30 @@ +gdb: include asm/ptrace.h in two aarch64 source files + +Both sys/ptrace.h and asm/ptrace.h need to be included. + +Upstream-Status: Pending + +Signed-off-by: joe.slater@windriver.com + + +--- a/gdb/aarch64-linux-nat.c ++++ b/gdb/aarch64-linux-nat.c +@@ -32,6 +32,8 @@ + #include "elf/common.h" + + #include ++#include ++ + #include + + #include "gregset.h" +--- a/gdb/gdbserver/linux-aarch64-low.c ++++ b/gdb/gdbserver/linux-aarch64-low.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + #include + + #include "gdb_proc_service.h" diff --git a/meta/recipes-devtools/gdb/gdb/kill_arm_map_symbols.patch b/meta/recipes-devtools/gdb/gdb/kill_arm_map_symbols.patch new file mode 100644 index 0000000000..9fc45b9f2a --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb/kill_arm_map_symbols.patch @@ -0,0 +1,26 @@ +Upstream-Status: Inappropriate [embedded specific] + +Index: gdb-7.3/gdb/arm-tdep.c +=================================================================== +--- gdb-7.3.orig/gdb/arm-tdep.c 2011-05-17 14:27:01.000000000 -0700 ++++ gdb-7.3/gdb/arm-tdep.c 2011-08-05 22:29:58.784201850 -0700 +@@ -7806,6 +7806,19 @@ + static void + arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym) + { ++ ++ /* FIXME: We want gdb to ignore the ARM ELF mapping symbols when ++ displaying disassembly so we use this horrible hack here to ++ artifically set their address to the highest possible value. ++ This is wrong of course, and it prevents the symbols from being ++ used for their intended purpose - to distinguish between ARM ++ and THUMB code. So we ought to find a better way to do this. */ ++ if (bfd_asymbol_name (sym) ++ && bfd_asymbol_name (sym)[0] == '$' ++ && bfd_asymbol_name (sym)[1] != 0 ++ && bfd_asymbol_name (sym)[2] == 0) ++ SYMBOL_VALUE_ADDRESS(msym) = (CORE_ADDR) 0x7ffffffc; ++ + if (ARM_SYM_BRANCH_TYPE (&((elf_symbol_type *)sym)->internal_elf_sym) + == ST_BRANCH_TO_THUMB) + MSYMBOL_SET_SPECIAL (msym); diff --git a/meta/recipes-devtools/gdb/gdb/renesas-sh-native-support.patch b/meta/recipes-devtools/gdb/gdb/renesas-sh-native-support.patch new file mode 100644 index 0000000000..15ff62013e --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb/renesas-sh-native-support.patch @@ -0,0 +1,1379 @@ +Description: Add Renesas SH (sh4) support + Add support for Renesas SH (sh4) architecture. + . + gdb (7.4-1~cvs20111117.2) experimental; urgency=low + . + * Add Renesas SH (sh4) support (Closes: #576242) + - Thanks Nobuhiro Iwamatsu, Takashi Yoshii. +Author: Hector Oron +Bug-Debian: http://bugs.debian.org/576242 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Forwarded: +Last-Update: <2011-11-17> + + +Upstream-Status: Pending +Signed-off-by: Khem Raj + +Index: gdb-7.5/gdb/configure.host +=================================================================== +--- gdb-7.5.orig/gdb/configure.host 2012-05-30 12:41:34.000000000 -0700 ++++ gdb-7.5/gdb/configure.host 2012-09-19 14:40:42.974609772 -0700 +@@ -140,6 +140,7 @@ + + s390*-*-*) gdb_host=s390 ;; + ++sh*-*-linux*) gdb_host=linux ;; + sh*-*-netbsdelf* | sh*-*-knetbsd*-gnu) + gdb_host=nbsd ;; + sh*-*-openbsd*) gdb_host=nbsd ;; +Index: gdb-7.5/gdb/Makefile.in +=================================================================== +--- gdb-7.5.orig/gdb/Makefile.in 2012-07-02 08:29:33.000000000 -0700 ++++ gdb-7.5/gdb/Makefile.in 2012-09-19 14:40:42.974609772 -0700 +@@ -1493,6 +1493,7 @@ + score-tdep.c \ + ser-go32.c ser-pipe.c ser-tcp.c ser-mingw.c \ + sh-tdep.c sh64-tdep.c shnbsd-tdep.c shnbsd-nat.c \ ++ sh-linux-tdep.c sh-linux-nat.c \ + sol2-tdep.c \ + solib-irix.c solib-svr4.c solib-sunos.c \ + sparc-linux-nat.c sparc-linux-tdep.c \ +Index: gdb-7.5/gdb/sh-linux-tdep.c +=================================================================== +--- gdb-7.5.orig/gdb/sh-linux-tdep.c 2012-05-07 06:17:29.000000000 -0700 ++++ gdb-7.5/gdb/sh-linux-tdep.c 2012-09-19 14:46:50.610623784 -0700 +@@ -18,14 +18,37 @@ + along with this program. If not, see . */ + + #include "defs.h" ++#include "gdbcore.h" ++#include "frame.h" ++#include "frame-base.h" ++#include "frame-unwind.h" ++#include "dwarf2-frame.h" ++#include "value.h" ++#include "regcache.h" ++#include "inferior.h" + #include "osabi.h" + ++#include "reggroups.h" ++#include "arch-utils.h" ++#include "floatformat.h" + #include "solib-svr4.h" + #include "symtab.h" ++#include "gdb_string.h" ++#include "command.h" ++#include "gdb_assert.h" + + #include "trad-frame.h" + #include "tramp-frame.h" + ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include "regset.h" + #include "glibc-tdep.h" + #include "sh-tdep.h" + #include "linux-tdep.h" +@@ -180,9 +203,505 @@ + sh_linux_rt_sigreturn_init + }; + ++/* Recognizing signal handler frames. */ ++ ++/* GNU/Linux has two flavors of signals. Normal signal handlers, and ++ "realtime" (RT) signals. The RT signals can provide additional ++ information to the signal handler if the SA_SIGINFO flag is set ++ when establishing a signal handler using `sigaction'. It is not ++ unlikely that future versions of GNU/Linux will support SA_SIGINFO ++ for normal signals too. */ ++ ++/* When the SH Linux kernel calls a signal handler and the ++ SA_RESTORER flag isn't set, the return address points to a bit of ++ code on the stack. This function returns whether the PC appears to ++ be within this bit of code. ++ ++ The instruction sequence for normal signals is ++ mov.w 1f,r3 ++ trapa #16 ++ or r0, r0 ++ or r0, r0 ++ or r0, r0 ++ or r0, r0 ++ or r0, r0 ++ 1: .word __NR_sigreturn ++ or 0x9305 0xc310 0x200b 0x200b 0x200b 0x200b 0x200b 0x0077. ++ ++ Checking for the code sequence should be somewhat reliable, because ++ the effect is to call the system call sigreturn. This is unlikely ++ to occur anywhere other than a signal trampoline. ++ ++ It kind of sucks that we have to read memory from the process in ++ order to identify a signal trampoline, but there doesn't seem to be ++ any other way. The PC_IN_SIGTRAMP macro in tm-linux.h arranges to ++ only call us if no function name could be identified, which should ++ be the case since the code is on the stack. ++ ++ Detection of signal trampolines for handlers that set the ++ SA_RESTORER flag is in general not possible. Unfortunately this is ++ what the GNU C Library has been doing for quite some time now. ++ However, as of version 2.1.2, the GNU C Library uses signal ++ trampolines (named __restore and __restore_rt) that are identical ++ to the ones used by the kernel. Therefore, these trampolines are ++ supported too. */ ++ ++#define MOVW(n) (0x9300|((n)-2)) /* Move mem word at PC+n to R3 */ ++#define TRAP16 0xc310 /* Syscall w/no args (NR in R3) */ ++#define OR_R0_R0 0x200b /* or r0,r0 (insert to avoid hardware bug) */ ++ ++#define LINUX_SIGTRAMP_INSN0 MOVW(7) /* Move mem word at PC+7 to R3 */ ++#define LINUX_SIGTRAMP_INSN1 TRAP16 /* Syscall w/no args (NR in R3) */ ++#define LINUX_SIGTRAMP_INSN2 OR_R0_R0 /* or r0,r0 (insert to avoid hardware bug) */ ++ ++static const unsigned short linux_sigtramp_code[] = ++{ ++ LINUX_SIGTRAMP_INSN0, ++ LINUX_SIGTRAMP_INSN1, ++ LINUX_SIGTRAMP_INSN2, ++ LINUX_SIGTRAMP_INSN2, ++ LINUX_SIGTRAMP_INSN2, ++ LINUX_SIGTRAMP_INSN2, ++ LINUX_SIGTRAMP_INSN2, ++ __NR_sigreturn ++}; ++ ++#define LINUX_SIGTRAMP_LEN (sizeof linux_sigtramp_code) ++ ++/* If PC is in a sigtramp routine, return the address of the start of ++ the routine. Otherwise, return 0. */ ++ ++static CORE_ADDR ++sh_linux_sigtramp_start (struct frame_info *next_frame) ++{ ++ CORE_ADDR pc = get_frame_pc (next_frame); ++ gdb_byte buf[LINUX_SIGTRAMP_LEN]; ++ ++ /* We only recognize a signal trampoline if PC is at the start of ++ one of the three instructions. We optimize for finding the PC at ++ the start, as will be the case when the trampoline is not the ++ first frame on the stack. We assume that in the case where the ++ PC is not at the start of the instruction sequence, there will be ++ a few trailing readable bytes on the stack. */ ++ ++ if (!safe_frame_unwind_memory (next_frame, pc, buf, LINUX_SIGTRAMP_LEN)) ++ return 0; ++ ++ if (buf[0] != LINUX_SIGTRAMP_INSN0) ++ { ++ if (buf[0] != LINUX_SIGTRAMP_INSN1) ++ return 0; ++ ++ pc -= 2; ++ ++ if (!safe_frame_unwind_memory (next_frame, pc, buf, LINUX_SIGTRAMP_LEN)) ++ return 0; ++ } ++ ++ if (memcmp (buf, linux_sigtramp_code, LINUX_SIGTRAMP_LEN) != 0) ++ return 0; ++ ++ return pc; ++} ++ ++/* This function does the same for RT signals. Here the instruction ++ sequence is ++ mov.w 1f,r3 ++ trapa #16 ++ or r0, r0 ++ or r0, r0 ++ or r0, r0 ++ or r0, r0 ++ or r0, r0 ++ 1: .word __NR_rt_sigreturn ++ or 0x9305 0xc310 0x200b 0x200b 0x200b 0x200b 0x200b 0x00ad. ++ ++ The effect is to call the system call rt_sigreturn. */ ++ ++#define LINUX_RT_SIGTRAMP_INSN0 MOVW(7) /* Move mem word at PC+7 to R3 */ ++#define LINUX_RT_SIGTRAMP_INSN1 TRAP16 /* Syscall w/no args (NR in R3) */ ++#define LINUX_RT_SIGTRAMP_INSN2 OR_R0_R0 /* or r0,r0 (insert to avoid hardware bug) */ ++ ++static const unsigned short linux_rt_sigtramp_code[] = ++{ ++ LINUX_RT_SIGTRAMP_INSN0, ++ LINUX_RT_SIGTRAMP_INSN1, ++ LINUX_RT_SIGTRAMP_INSN2, ++ LINUX_RT_SIGTRAMP_INSN2, ++ LINUX_RT_SIGTRAMP_INSN2, ++ LINUX_RT_SIGTRAMP_INSN2, ++ LINUX_RT_SIGTRAMP_INSN2, ++ __NR_rt_sigreturn ++}; ++ ++#define LINUX_RT_SIGTRAMP_LEN (sizeof linux_rt_sigtramp_code) ++ ++/* If PC is in a RT sigtramp routine, return the address of the start ++ of the routine. Otherwise, return 0. */ ++ ++static CORE_ADDR ++sh_linux_rt_sigtramp_start (struct frame_info *next_frame) ++{ ++ CORE_ADDR pc = get_frame_pc (next_frame); ++ gdb_byte buf[LINUX_RT_SIGTRAMP_LEN]; ++ ++ /* We only recognize a signal trampoline if PC is at the start of ++ one of the two instructions. We optimize for finding the PC at ++ the start, as will be the case when the trampoline is not the ++ first frame on the stack. We assume that in the case where the ++ PC is not at the start of the instruction sequence, there will be ++ a few trailing readable bytes on the stack. */ ++ ++ if (!safe_frame_unwind_memory (next_frame, pc, buf, LINUX_RT_SIGTRAMP_LEN)) ++ return 0; ++ ++ if (buf[0] != LINUX_RT_SIGTRAMP_INSN0) ++ { ++ if (buf[0] != LINUX_RT_SIGTRAMP_INSN1) ++ return 0; ++ ++ pc -= 2; ++ ++ if (!safe_frame_unwind_memory (next_frame, pc, buf, ++ LINUX_RT_SIGTRAMP_LEN)) ++ return 0; ++ } ++ ++ if (memcmp (buf, linux_rt_sigtramp_code, LINUX_RT_SIGTRAMP_LEN) != 0) ++ return 0; ++ ++ return pc; ++} ++ ++/* Return whether PC is in a GNU/Linux sigtramp routine. */ ++ ++static int ++sh_linux_sigtramp_p (struct frame_info *this_frame) ++{ ++ CORE_ADDR pc = get_frame_pc (this_frame); ++ char *name; ++ ++ find_pc_partial_function (pc, &name, NULL, NULL); ++ ++ /* If we have NAME, we can optimize the search. The trampolines are ++ named __restore and __restore_rt. However, they aren't dynamically ++ exported from the shared C library, so the trampoline may appear to ++ be part of the preceding function. This should always be sigaction, ++ __sigaction, or __libc_sigaction (all aliases to the same function). */ ++ if (name == NULL || strstr (name, "sigaction") != NULL) ++ return (sh_linux_sigtramp_start (this_frame) != 0 ++ || sh_linux_rt_sigtramp_start (this_frame) != 0); ++ ++ return (strcmp ("__restore", name) == 0 ++ || strcmp ("__restore_rt", name) == 0); ++} ++ ++/* Offset to struct sigcontext in ucontext, from . */ ++#define SH_LINUX_UCONTEXT_SIGCONTEXT_OFFSET 12 ++ ++ ++/* Assuming NEXT_FRAME is a frame following a GNU/Linux sigtramp ++ routine, return the address of the associated sigcontext structure. */ ++ ++static CORE_ADDR ++sh_linux_sigcontext_addr (struct frame_info *this_frame) ++{ ++ CORE_ADDR pc; ++ CORE_ADDR sp; ++ ++ sp = get_frame_register_unsigned (this_frame, SP_REGNUM); ++ ++ pc = sh_linux_sigtramp_start (this_frame); ++ if (pc) ++ { ++ return sp; ++ } ++ ++ pc = sh_linux_rt_sigtramp_start (this_frame); ++ if (pc) ++ { ++ CORE_ADDR ucontext_addr; ++ ++ /* The sigcontext structure is part of the user context. A ++ pointer to the user context is passed as the third argument ++ to the signal handler. */ ++ ucontext_addr = get_frame_register_unsigned (this_frame, ARG0_REGNUM+2); ++ return ucontext_addr + SH_LINUX_UCONTEXT_SIGCONTEXT_OFFSET; ++ } ++ ++ error ("Couldn't recognize signal trampoline."); ++ return 0; ++} ++ ++/* Signal trampolines. */ ++extern struct sh_frame_cache *sh_alloc_frame_cache (void); ++ ++static struct sh_frame_cache * ++sh_linux_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache) ++{ ++ struct sh_frame_cache *cache; ++ struct gdbarch_tdep *tdep = gdbarch_tdep (get_current_arch ()); ++ CORE_ADDR sigcontext_addr; ++ ++ if (*this_cache) ++ return *this_cache; ++ ++ cache = sh_alloc_frame_cache (); ++ ++ cache->base = get_frame_register_unsigned (this_frame, SP_REGNUM); ++ sigcontext_addr = tdep->sigcontext_addr (this_frame); ++ if (tdep->sc_reg_offset) ++ { ++ int i; ++ ++ gdb_assert (tdep->sc_num_regs <= SH_NUM_REGS); ++ ++ for (i = 0; i < tdep->sc_num_regs; i++) ++ if (tdep->sc_reg_offset[i] != -1) ++ cache->saved_regs[i] = sigcontext_addr + tdep->sc_reg_offset[i]; ++ } ++ ++ *this_cache = cache; ++ return cache; ++} ++ ++static void ++sh_linux_sigtramp_frame_this_id (struct frame_info *this_frame, void **this_cache, ++ struct frame_id *this_id) ++{ ++ struct sh_frame_cache *cache = ++ sh_linux_sigtramp_frame_cache (this_frame, this_cache); ++ ++ (*this_id) = frame_id_build (cache->base + 64, cache->pc); ++} ++ ++extern struct value * sh_frame_prev_register (); ++static struct value * ++sh_linux_sigtramp_frame_prev_register (struct frame_info *this_frame, ++ void **this_cache, int regnum) ++{ ++ sh_linux_sigtramp_frame_cache (this_frame, this_cache); ++ ++ return sh_frame_prev_register (this_frame, this_cache, regnum); ++} ++ ++static int ++sh_linux_sigtramp_frame_sniffer (const struct frame_unwind *self, ++ struct frame_info *this_frame, ++ void **this_prologue_cache) ++{ ++ struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame)); ++ ++ /* We shouldn't even bother if we don't have a sigcontext_addr ++ handler. */ ++ if (tdep->sigcontext_addr == NULL) ++ return 0; ++ ++ if (tdep->sigtramp_p != NULL) ++ { ++ if (tdep->sigtramp_p (this_frame)) ++ return 1; ++ } ++ ++ return 0; ++} ++ ++static const struct frame_unwind sh_linux_sigtramp_frame_unwind = ++{ ++ SIGTRAMP_FRAME, ++ sh_linux_sigtramp_frame_this_id, ++ sh_linux_sigtramp_frame_prev_register, ++ NULL, ++ sh_linux_sigtramp_frame_sniffer ++}; ++ ++/* Supply register REGNUM from the buffer specified by GREGS and LEN ++ in the general-purpose register set REGSET to register cache ++ REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */ ++ ++void ++sh_supply_gregset (const struct regset *regset, struct regcache *regcache, ++ int regnum, const void *gregs, size_t len) ++{ ++ const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch); ++ const char *regs = gregs; ++ int i; ++ ++ gdb_assert (len == tdep->sizeof_gregset); ++ ++ for (i = 0; i < tdep->gregset_num_regs; i++) ++ { ++ if ((regnum == i || regnum == -1) ++ && tdep->gregset_reg_offset[i] != -1) ++ regcache_raw_supply (regcache, i, regs + tdep->gregset_reg_offset[i]); ++ } ++} ++ ++/* Collect register REGNUM from the register cache REGCACHE and store ++ it in the buffer specified by GREGS and LEN as described by the ++ general-purpose register set REGSET. If REGNUM is -1, do this for ++ all registers in REGSET. */ ++ ++void ++sh_collect_gregset (const struct regset *regset, ++ const struct regcache *regcache, ++ int regnum, void *gregs, size_t len) ++{ ++ const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch); ++ char *regs = gregs; ++ int i; ++ ++ gdb_assert (len == tdep->sizeof_gregset); ++ ++ for (i = 0; i < tdep->gregset_num_regs; i++) ++ { ++ if ((regnum == i || regnum == -1) ++ && tdep->gregset_reg_offset[i] != -1) ++ regcache_raw_collect (regcache, i, regs + tdep->gregset_reg_offset[i]); ++ } ++} ++ ++/* Supply register REGNUM from the buffer specified by FPREGS and LEN ++ in the floating-point register set REGSET to register cache ++ REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */ ++ ++static void ++sh_supply_fpregset (const struct regset *regset, struct regcache *regcache, ++ int regnum, const void *fpregs, size_t len) ++{ ++ const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch); ++ const char *regs = fpregs; ++ int i; ++ ++ gdb_assert (len == tdep->sizeof_fpregset); ++ for (i = 0; i < 16; i++) ++ { ++ if (regnum == i+25 || regnum == -1) ++ regcache_raw_supply (regcache, i+25, regs + i*4); ++ } ++ if (regnum == FPSCR_REGNUM || regnum == -1) ++ regcache_raw_supply (regcache, FPSCR_REGNUM, regs + 32*4); ++ if (regnum == FPUL_REGNUM || regnum == -1) ++ regcache_raw_supply (regcache, FPUL_REGNUM, regs + 33*4); ++} ++ ++/* Collect register REGNUM from the register cache REGCACHE and store ++ it in the buffer specified by FPREGS and LEN as described by the ++ floating-point register set REGSET. If REGNUM is -1, do this for ++ all registers in REGSET. */ ++ ++static void ++sh_collect_fpregset (const struct regset *regset, ++ const struct regcache *regcache, ++ int regnum, void *fpregs, size_t len) ++{ ++ const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch); ++ char *regs = fpregs; ++ int i; ++ ++ gdb_assert (len == tdep->sizeof_fpregset); ++ for (i = 0; i < 16; i++) ++ { ++ if (regnum == i+25 || regnum == -1) ++ regcache_raw_collect (regcache, i+25, regs + i*4); ++ } ++ if (regnum == FPSCR_REGNUM || regnum == -1) ++ regcache_raw_collect (regcache, FPSCR_REGNUM, regs + 32*4); ++ if (regnum == FPUL_REGNUM || regnum == -1) ++ regcache_raw_collect (regcache, FPUL_REGNUM, regs + 33*4); ++} ++ ++/* Return the appropriate register set for the core section identified ++ by SECT_NAME and SECT_SIZE. */ ++ ++const struct regset * ++sh_linux_regset_from_core_section (struct gdbarch *gdbarch, ++ const char *sect_name, size_t sect_size) ++{ ++ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); ++ ++ if (strcmp (sect_name, ".reg") == 0 && sect_size == tdep->sizeof_gregset) ++ { ++ if (tdep->gregset == NULL) ++ tdep->gregset = regset_alloc (gdbarch, sh_supply_gregset, ++ sh_collect_gregset); ++ return tdep->gregset; ++ } ++ ++ if ((strcmp (sect_name, ".reg2") == 0 && sect_size == tdep->sizeof_fpregset)) ++ { ++ if (tdep->fpregset == NULL) ++ tdep->fpregset = regset_alloc (gdbarch, sh_supply_fpregset, ++ sh_collect_fpregset); ++ return tdep->fpregset; ++ } ++ ++ return NULL; ++} ++ ++/* The register sets used in GNU/Linux ELF core-dumps are identical to ++ the register sets in `struct user' that are used for a.out ++ core-dumps. These are also used by ptrace(2). The corresponding ++ types are `elf_gregset_t' for the general-purpose registers (with ++ `elf_greg_t' the type of a single GP register) and `elf_fpregset_t' ++ for the floating-point registers. ++ ++ Those types used to be available under the names `gregset_t' and ++ `fpregset_t' too, and GDB used those names in the past. But those ++ names are now used for the register sets used in the `mcontext_t' ++ type, which have a different size and layout. */ ++ ++/* Mapping between the general-purpose registers in `struct user' ++ format and GDB's register cache layout. */ ++ ++/* From . */ ++static int sh_linux_gregset_reg_offset[] = ++{ ++ 0, 4, 8, 12, 16, 20, 24, 28, ++ 32, 36, 40, 44, 48, 52, 56, 60, ++ ++ REG_PC*4, REG_PR*4, REG_GBR*4, -1, ++ REG_MACH*4, REG_MACL*4, REG_SR*4, ++}; ++ ++/* Mapping between the general-purpose registers in `struct ++ sigcontext' format and GDB's register cache layout. */ ++ ++/* From . */ ++static int sh_linux_sc_reg_offset[] = ++{ ++ 4, 8, 12, 16, 20, 24, 28, 32, ++ 36, 40, 44, 48, 52, 56, 60, 64, ++ 68, 72, 80, -1, ++ 84, 88, 76 ++}; ++ + static void + sh_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) + { ++ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); ++ bfd abfd; ++ ++ tdep->gregset_reg_offset = sh_linux_gregset_reg_offset; ++ tdep->gregset_num_regs = ARRAY_SIZE (sh_linux_gregset_reg_offset); ++ tdep->sizeof_gregset = 23 * 4; ++ ++ tdep->jb_pc_offset = 32; /* From . */ ++ ++ tdep->sigtramp_p = sh_linux_sigtramp_p; ++ tdep->sigcontext_addr = sh_linux_sigcontext_addr; ++ tdep->sc_reg_offset = sh_linux_sc_reg_offset; ++ tdep->sc_num_regs = ARRAY_SIZE (sh_linux_sc_reg_offset); ++ ++ frame_unwind_append_unwinder(gdbarch, &sh_linux_sigtramp_frame_unwind); ++ ++ /* If we have a register mapping, enable the generic core file ++ support, unless it has already been enabled. */ ++ if (tdep->gregset_reg_offset ++ && !gdbarch_regset_from_core_section_p (gdbarch)) ++ set_gdbarch_regset_from_core_section (gdbarch, ++ sh_linux_regset_from_core_section); ++ + linux_init_abi (info, gdbarch); + + /* GNU/Linux uses SVR4-style shared libraries. */ +Index: gdb-7.5/gdb/sh-tdep.h +=================================================================== +--- gdb-7.5.orig/gdb/sh-tdep.h 2012-03-01 15:55:40.000000000 -0800 ++++ gdb-7.5/gdb/sh-tdep.h 2012-09-19 14:48:32.406627602 -0700 +@@ -21,6 +21,12 @@ + + /* Contributed by Steve Chamberlain sac@cygnus.com. */ + ++struct frame_info; ++struct gdbarch; ++struct reggroup; ++struct regset; ++struct regcache; ++ + /* Registers for all SH variants. Used also by sh3-rom.c. */ + enum + { +@@ -29,6 +35,7 @@ + ARG0_REGNUM = 4, + ARGLAST_REGNUM = 7, + FP_REGNUM = 14, ++ SP_REGNUM = 15, + PC_REGNUM = 16, + PR_REGNUM = 17, + GBR_REGNUM = 18, +@@ -81,6 +88,24 @@ + FV0_REGNUM = 76, + FV_LAST_REGNUM = 79 + }; ++#define SH_NUM_REGS 67 ++ ++struct sh_frame_cache ++{ ++ /* Base address. */ ++ CORE_ADDR base; ++ LONGEST sp_offset; ++ CORE_ADDR pc; ++ ++ /* Flag showing that a frame has been created in the prologue code. */ ++ int uses_fp; ++ ++ /* Saved registers. */ ++ CORE_ADDR saved_regs[SH_NUM_REGS]; ++ CORE_ADDR saved_sp; ++}; ++ ++extern struct sh_frame_cache *sh_frame_cache (struct frame_info *next_frame, void **this_cache); + + /* This structure describes a register in a core-file. */ + struct sh_corefile_regmap +@@ -89,8 +114,32 @@ + unsigned int offset; + }; + ++/* sh architecture specific information. */ + struct gdbarch_tdep + { ++ /* General-purpose registers. */ ++ struct regset *gregset; ++ int *gregset_reg_offset; ++ int gregset_num_regs; ++ size_t sizeof_gregset; ++ ++ /* Floating-point registers. */ ++ struct regset *fpregset; ++ size_t sizeof_fpregset; ++ ++ /* Offset of saved PC in jmp_buf. */ ++ int jb_pc_offset; ++ ++ /* Detect sigtramp. */ ++ int (*sigtramp_p) (struct frame_info *); ++ ++ /* Get address of sigcontext for sigtramp. */ ++ CORE_ADDR (*sigcontext_addr) (struct frame_info *); ++ ++ /* Offset of registers in `struct sigcontext'. */ ++ int *sc_reg_offset; ++ int sc_num_regs; ++ + /* Non-NULL when debugging from a core file. Provides the offset + where each general-purpose register is stored inside the associated + core file section. */ +Index: gdb-7.5/gdb/sh-linux-nat.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gdb-7.5/gdb/sh-linux-nat.c 2012-09-19 14:40:42.978609771 -0700 +@@ -0,0 +1,269 @@ ++/* Low level SH interface to ptrace, for GDB when running native. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++ ++This file is part of GDB. ++ ++This program is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2 of the License, or ++(at your option) any later version. ++ ++This program is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; if not, write to the Free Software ++Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ++ ++#include "defs.h" ++#include "inferior.h" ++#include "gdbcore.h" ++#include "regcache.h" ++#include "linux-nat.h" ++#include "target.h" ++#include "arch-utils.h" ++ ++#include "gdb_assert.h" ++#include "gdb_string.h" ++#include ++#include ++#include ++#include ++ ++/* Prototypes for supply_gregset etc. */ ++#include "gregset.h" ++#include "sh-tdep.h" ++ ++/* Defines ps_err_e, struct ps_prochandle. */ ++#include "gdb_proc_service.h" ++ ++//#include ++ ++#define SH_LINUX_NUM_REGS 40 ++/* This table must line up with REGISTER_NAME in "sh-tdep.c". */ ++static const int regmap[] = ++{ ++ /* general registers 0-15 */ ++ REG_REG0 , REG_REG0+1 , REG_REG0+2 , REG_REG0+3, ++ REG_REG0+4 , REG_REG0+5 , REG_REG0+6 , REG_REG0+7, ++ REG_REG0+8 , REG_REG0+9 , REG_REG0+10, REG_REG0+11, ++ REG_REG0+12, REG_REG0+13, REG_REG0+14, REG_REG0+15, ++ /* 16 - 22 */ ++ REG_PC, REG_PR, REG_GBR, -1, REG_MACH, REG_MACL, REG_SR, ++ /* 23, 24 */ ++ REG_FPUL, REG_FPSCR, ++ /* floating point registers 25 - 40 */ ++ REG_FPREG0 , REG_FPREG0+1 , REG_FPREG0+2 , REG_FPREG0+3 , ++ REG_FPREG0+4 , REG_FPREG0+5 , REG_FPREG0+6 , REG_FPREG0+7 , ++ REG_FPREG0+8 , REG_FPREG0+9 , REG_FPREG0+10, REG_FPREG0+11, ++ REG_FPREG0+12, REG_FPREG0+13, REG_FPREG0+14, REG_FPREG0+15, ++}; ++ ++CORE_ADDR ++register_u_addr (CORE_ADDR blockend, int regnum) ++{ ++ if (regnum < 0 || regnum >= sizeof regmap/sizeof regmap[0]) ++ return (CORE_ADDR)-1; ++ return (blockend + 4 * regmap[regnum]); ++} ++ ++ ++/* Return the address in the core dump or inferior of register REGNO. ++ BLOCKEND is the address of the end of the user structure. */ ++ ++CORE_ADDR ++register_addr (int regno, CORE_ADDR blockend) ++{ ++ CORE_ADDR addr; ++ ++ if (regno < 0 || regno >= SH_LINUX_NUM_REGS) { ++ internal_error (__FILE__, __LINE__, ++ _("Got request for bad register number %d."), regno); ++ } ++ ++ REGISTER_U_ADDR (addr, blockend, regno); ++ ++ return addr; ++} ++ ++/* Fetch one register. */ ++ ++static void ++fetch_register (struct regcache *regcache, int tid, int regno) ++{ ++ int val; ++ ++ if (cannot_fetch_register (regno)) ++ { ++ regcache_raw_supply (regcache, regno, NULL); ++ return; ++ } ++ ++ errno = 0; ++ val = ptrace (PTRACE_PEEKUSER, tid, register_addr (regno, 0), 0); ++ if (errno != 0) ++ perror_with_name (_("Couldn't get registers")); ++ ++ regcache_raw_supply (regcache, regno, &val); ++} ++ ++/* Store one register. */ ++ ++static void ++store_register (struct regcache *regcache, int tid, int regno) ++{ ++ int val; ++ ++ if (cannot_store_register (regno)) ++ return; ++ ++ errno = 0; ++ regcache_raw_collect (regcache, regno, &val); ++ ptrace (PTRACE_POKEUSER, tid, register_addr (regno, 0), val); ++ if (errno != 0) ++ perror_with_name (_("Couldn't write registers")); ++} ++ ++/* Transfering the general-purpose registers between GDB, inferiors ++ and core files. */ ++ ++/* Fill GDB's register array with the general-purpose register values ++ in *GREGSETP. */ ++ ++void ++supply_gregset (struct regcache *regcache, const elf_gregset_t *gregsetp) ++{ ++ elf_greg_t *regp = (elf_greg_t *) gregsetp; ++ int i; ++ ++ for (i = 0; i < 23; i++) ++ if (regmap[i] == -1) ++ regcache_raw_supply (regcache, i, NULL); ++ else ++ regcache_raw_supply (regcache, i, (char *) (regp + regmap[i])); ++} ++ ++/* Fill register REGNO (if it is a general-purpose register) in ++ *GREGSETPS with the value in GDB's register array. If REGNO is -1, ++ do this for all registers. */ ++ ++void ++fill_gregset (const struct regcache *regcache, elf_gregset_t *gregsetp, int regno) ++{ ++ elf_greg_t *regp = (elf_greg_t *) gregsetp; ++ int i; ++ ++ for (i = 0; i < 23; i++) ++ if (regmap[i] != -1 && (regno == -1 || regno == i)) ++ regcache_raw_collect (regcache, i, (char *) (regp + regmap[i])); ++} ++ ++/* Transfering floating-point registers between GDB, inferiors and cores. */ ++ ++/* Fill GDB's register array with the floating-point register values in ++ *FPREGSETP. */ ++ ++void ++supply_fpregset (struct regcache *regcache, const elf_fpregset_t *fpregsetp) ++{ ++ int i; ++ long *regp = (long *)fpregsetp; ++ ++ for (i = 0; i < 16; i++) ++ regcache_raw_supply (regcache, 25 + i, (char *) (regp + i)); ++ regcache_raw_supply (regcache, FPUL_REGNUM, (char *) (regp + REG_FPUL - REG_FPREG0)); ++ regcache_raw_supply (regcache, FPSCR_REGNUM, (char *) (regp + REG_FPSCR - REG_FPREG0)); ++} ++ ++/* Fill register REGNO (if it is a floating-point register) in ++ *FPREGSETP with the value in GDB's register array. If REGNO is -1, ++ do this for all registers. */ ++ ++void ++fill_fpregset (const struct regcache *regcache, elf_fpregset_t *fpregsetp, int regno) ++{ ++ int i; ++ long *regp = (long *)fpregsetp; ++ ++ for (i = 0; i < 16; i++) ++ if ((regno == -1) || (regno == i)) ++ regcache_raw_collect (regcache, 25 + i, (char *) (regp + i)); ++ if ((regno == -1) || regno == FPSCR_REGNUM) ++ regcache_raw_collect (regcache, FPSCR_REGNUM, (char *) (regp + REG_FPSCR - REG_FPREG0)); ++ if ((regno == -1) || regno == FPUL_REGNUM) ++ regcache_raw_collect (regcache, FPUL_REGNUM, (char *) (regp + REG_FPUL - REG_FPREG0)); ++} ++ ++/* Transferring arbitrary registers between GDB and inferior. */ ++ ++/* Check if register REGNO in the child process is accessible. ++ If we are accessing registers directly via the U area, only the ++ general-purpose registers are available. ++ All registers should be accessible if we have GETREGS support. */ ++ ++int ++cannot_fetch_register (int regno) ++{ ++ return (regno < 0 || regno >= sizeof regmap / sizeof regmap[0] || regmap[regno] == -1); ++} ++ ++int ++cannot_store_register (int regno) ++{ ++ return (regno < 0 || regno >= sizeof regmap / sizeof regmap[0] || regmap[regno] == -1); ++} ++ ++/* Fetch register values from the inferior. ++ If REGNO is negative, do this for all registers. ++ Otherwise, REGNO specifies which register (so we can save time). */ ++ ++static void ++sh_linux_fetch_inferior_registers (struct target_ops *ops, struct regcache *regcache, int regno) ++{ ++ int i; ++ int tid; ++ ++ /* GNU/Linux LWP ID's are process ID's. */ ++ if ((tid = TIDGET (inferior_ptid)) == 0) ++ tid = PIDGET (inferior_ptid); /* Not a threaded program. */ ++ ++ for (i = 0; i < SH_LINUX_NUM_REGS; i++) ++ if (regno == -1 || regno == i) ++ fetch_register (regcache, tid, i); ++} ++/* Store our register values back into the inferior. ++ If REGNO is negative, do this for all registers. ++ Otherwise, REGNO specifies which register (so we can save time). */ ++ ++static void ++sh_linux_store_inferior_registers (struct target_ops *ops, struct regcache *regcache, int regno) ++{ ++ int i; ++ int tid; ++ ++ /* GNU/Linux LWP ID's are process ID's. */ ++ if ((tid = TIDGET (inferior_ptid)) == 0) ++ tid = PIDGET (inferior_ptid); /* Not a threaded program. */ ++ ++ for (i = 0; i < SH_LINUX_NUM_REGS; i++) ++ if (regno == -1 || regno == i) ++ store_register (regcache, tid, i); ++} ++ ++void ++_initialize_sh_linux_nat (void) ++{ ++ struct target_ops *t; ++ ++ /* Fill in the generic GNU/Linux methods. */ ++ t = linux_target (); ++ ++ /* Add our register access methods. */ ++ t->to_fetch_registers = sh_linux_fetch_inferior_registers; ++ t->to_store_registers = sh_linux_store_inferior_registers; ++ ++ /* Register the target. */ ++ linux_nat_add_target (t); ++} +Index: gdb-7.5/gdb/sh-tdep.c +=================================================================== +--- gdb-7.5.orig/gdb/sh-tdep.c 2012-06-08 07:24:57.000000000 -0700 ++++ gdb-7.5/gdb/sh-tdep.c 2012-09-19 14:45:09.770619943 -0700 +@@ -21,6 +21,9 @@ + sac@cygnus.com. */ + + #include "defs.h" ++#include "arch-utils.h" ++#include "command.h" ++#include "dummy-frame.h" + #include "frame.h" + #include "frame-base.h" + #include "frame-unwind.h" +@@ -37,6 +40,7 @@ + #include "arch-utils.h" + #include "floatformat.h" + #include "regcache.h" ++#include "regset.h" + #include "doublest.h" + #include "osabi.h" + #include "reggroups.h" +@@ -69,23 +73,6 @@ + + static const char *sh_active_calling_convention = sh_cc_gcc; + +-#define SH_NUM_REGS 67 +- +-struct sh_frame_cache +-{ +- /* Base address. */ +- CORE_ADDR base; +- LONGEST sp_offset; +- CORE_ADDR pc; +- +- /* Flag showing that a frame has been created in the prologue code. */ +- int uses_fp; +- +- /* Saved registers. */ +- CORE_ADDR saved_regs[SH_NUM_REGS]; +- CORE_ADDR saved_sp; +-}; +- + static int + sh_is_renesas_calling_convention (struct type *func_type) + { +@@ -1045,7 +1032,7 @@ + return 0; + /* Otherwise if the type of that member is float, the whole type is + treated as float. */ +- if (TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) == TYPE_CODE_FLT) ++ if (TYPE_CODE (check_typedef (TYPE_FIELD_TYPE (type, 0))) == TYPE_CODE_FLT) + return 1; + /* Otherwise it's not treated as float. */ + return 0; +@@ -1095,7 +1082,7 @@ + in four registers available. Loop thru args from first to last. */ + for (argnum = 0; argnum < nargs; argnum++) + { +- type = value_type (args[argnum]); ++ type = check_typedef (value_type (args[argnum])); + len = TYPE_LENGTH (type); + val = sh_justify_value_in_reg (gdbarch, args[argnum], len); + +@@ -1809,7 +1796,7 @@ + reg->how = DWARF2_FRAME_REG_UNDEFINED; + } + +-static struct sh_frame_cache * ++struct sh_frame_cache * + sh_alloc_frame_cache (void) + { + struct sh_frame_cache *cache; +@@ -1836,7 +1823,7 @@ + return cache; + } + +-static struct sh_frame_cache * ++struct sh_frame_cache * + sh_frame_cache (struct frame_info *this_frame, void **this_cache) + { + struct gdbarch *gdbarch = get_frame_arch (this_frame); +@@ -1903,9 +1890,9 @@ + return cache; + } + +-static struct value * +-sh_frame_prev_register (struct frame_info *this_frame, +- void **this_cache, int regnum) ++struct value * ++sh_frame_prev_register (struct frame_info *this_frame, void **this_cache, ++ int regnum) + { + struct gdbarch *gdbarch = get_frame_arch (this_frame); + struct sh_frame_cache *cache = sh_frame_cache (this_frame, this_cache); +@@ -1919,7 +1906,7 @@ + the current frame. Frob regnum so that we pull the value from + the correct place. */ + if (regnum == gdbarch_pc_regnum (gdbarch)) +- regnum = PR_REGNUM; ++ regnum = PR_REGNUM; /* XXX: really? */ + + if (regnum < SH_NUM_REGS && cache->saved_regs[regnum] != -1) + return frame_unwind_got_memory (this_frame, regnum, +@@ -2225,8 +2212,8 @@ + static struct gdbarch * + sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) + { +- struct gdbarch *gdbarch; + struct gdbarch_tdep *tdep; ++ struct gdbarch *gdbarch; + + /* SH5 is handled entirely in sh64-tdep.c. */ + if (info.bfd_arch_info->mach == bfd_mach_sh5) +@@ -2242,6 +2229,18 @@ + tdep = XZALLOC (struct gdbarch_tdep); + gdbarch = gdbarch_alloc (&info, tdep); + ++ /* General-purpose registers. */ ++ tdep->gregset = NULL; ++ tdep->gregset_reg_offset = NULL; ++ tdep->gregset_num_regs = 23; ++ tdep->sizeof_gregset = 0; ++ ++ /* Floating-point registers. */ ++ tdep->fpregset = NULL; ++ tdep->sizeof_fpregset = 34*4; ++ ++ tdep->jb_pc_offset = -1; ++ + set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT); + set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT); + set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT); +@@ -2389,10 +2388,11 @@ + break; + } + ++ dwarf2_append_unwinders (gdbarch); ++ + /* Hook in ABI-specific overrides, if they have been registered. */ + gdbarch_init_osabi (info, gdbarch); + +- dwarf2_append_unwinders (gdbarch); + frame_unwind_append_unwinder (gdbarch, &sh_stub_unwind); + frame_unwind_append_unwinder (gdbarch, &sh_frame_unwind); + +Index: gdb-7.5/gdb/testsuite/gdb.asm/sh-linux.inc +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gdb-7.5/gdb/testsuite/gdb.asm/sh-linux.inc 2012-09-19 14:40:42.978609771 -0700 +@@ -0,0 +1,78 @@ ++# You'll find a bunch of nop opcodes in the below macros. They are ++# there to keep the code correctly aligned. Be careful to maintain ++# them when changing the code. ++ ++ comment "subroutine declare" ++ .purgem gdbasm_declare ++ .macro gdbasm_declare name ++ .align 1 ++ .global \name ++\name: ++ .endm ++ ++ comment "subroutine prologue" ++ .macro gdbasm_enter ++ mov.l r14,@-r15 ++ sts.l pr,@-r15 ++ mov r15,r14 ++ nop ++ .endm ++ ++ comment "subroutine epilogue" ++ .macro gdbasm_leave ++ mov r14,r15 ++ lds.l @r15+,pr ++ mov.l @r15+,r14 ++ rts ++ nop ++ nop ++ .endm ++ ++ comment "subroutine end" ++ .purgem gdbasm_end ++ .macro gdbasm_end name ++ .size \name, .-_foo1 ++ .align 1 ++ .endm ++ ++ comment "subroutine call" ++ .macro gdbasm_call subr ++ mov.l .Lconst\@,r1 ++ bra .Lafterconst\@ ++ nop ++ .align 2 ++.Lconst\@: ++ .long \subr ++.Lafterconst\@: ++ jsr @r1 ++ nop ++ .endm ++ ++ .macro gdbasm_several_nops ++ nop ++ nop ++ nop ++ nop ++ .endm ++ ++ comment "exit (0)" ++ .macro gdbasm_exit0 ++ sleep ++ nop ++ .endm ++ ++ comment "crt0 startup" ++ .macro gdbasm_startup ++ mov #0,r14 ++ .endm ++ ++ comment "Declare a data variable" ++ .purgem gdbasm_datavar ++ .macro gdbasm_datavar name value ++ .data ++ .align 2 ++ .type \name, @object ++ .size \name, 4 ++\name: ++ .long \value ++ .endm +Index: gdb-7.5/gdb/testsuite/gdb.asm/sh.inc +=================================================================== +--- gdb-7.5.orig/gdb/testsuite/gdb.asm/sh.inc 2012-04-16 01:02:09.000000000 -0700 ++++ gdb-7.5/gdb/testsuite/gdb.asm/sh.inc 2012-09-19 14:40:42.978609771 -0700 +@@ -40,9 +40,8 @@ + mov.l .Lconst\@,r1 + bra .Lafterconst\@ + nop +- nop +-.Lconst\@: + .align 2 ++.Lconst\@: + .long \subr + .align 1 + .Lafterconst\@: +Index: gdb-7.5/gdb/testsuite/gdb.asm/asm-source.exp +=================================================================== +--- gdb-7.5.orig/gdb/testsuite/gdb.asm/asm-source.exp 2012-06-25 13:11:43.000000000 -0700 ++++ gdb-7.5/gdb/testsuite/gdb.asm/asm-source.exp 2012-09-19 14:40:42.978609771 -0700 +@@ -108,6 +108,11 @@ + append link-flags " -m elf32ppc" + } + } ++ "sh*-linux*" { ++ set asm-arch sh-linux ++ set asm-flags "-I${srcdir}/${subdir} -I${objdir}/${subdir}" ++ set debug-flags "-gdwarf-2" ++ } + "sh*-*-*" { + set asm-arch sh + set debug-flags "-gdwarf-2" +Index: gdb-7.5/gdb/testsuite/gdb.base/sigall.c +=================================================================== +--- gdb-7.5.orig/gdb/testsuite/gdb.base/sigall.c 2012-02-28 02:24:15.000000000 -0800 ++++ gdb-7.5/gdb/testsuite/gdb.base/sigall.c 2012-09-19 14:42:02.202612808 -0700 +@@ -5,6 +5,10 @@ + /* Signal handlers, we set breakpoints in them to make sure that the + signals really get delivered. */ + ++#ifdef __sh__ ++#define signal(a,b) /* Signals not supported on this target - make them go away */ ++#endif ++ + #ifdef PROTOTYPES + void + handle_ABRT (int sig) +Index: gdb-7.5/gdb/testsuite/gdb.base/signals.c +=================================================================== +--- gdb-7.5.orig/gdb/testsuite/gdb.base/signals.c 2012-02-28 02:24:15.000000000 -0800 ++++ gdb-7.5/gdb/testsuite/gdb.base/signals.c 2012-09-19 14:43:22.034615831 -0700 +@@ -3,6 +3,10 @@ + #include + #include + ++#ifdef __sh__ ++#define signal(a,b) /* Signals not supported on this target - make them go away */ ++#define alarm(a) /* Ditto for alarm() */ ++#endif + + static int count = 0; + +Index: gdb-7.5/gdb/testsuite/gdb.base/annota1.c +=================================================================== +--- gdb-7.5.orig/gdb/testsuite/gdb.base/annota1.c 2012-02-28 14:40:48.000000000 -0800 ++++ gdb-7.5/gdb/testsuite/gdb.base/annota1.c 2012-09-19 14:42:42.074614308 -0700 +@@ -1,6 +1,9 @@ + #include + #include + ++#ifdef __sh__ ++#define signal(a,b) /* Signals not supported on this target - make them go away */ ++#endif + + #ifdef PROTOTYPES + void +Index: gdb-7.5/gdb/testsuite/gdb.base/annota3.c +=================================================================== +--- gdb-7.5.orig/gdb/testsuite/gdb.base/annota3.c 2012-02-28 14:40:48.000000000 -0800 ++++ gdb-7.5/gdb/testsuite/gdb.base/annota3.c 2012-09-19 14:43:54.410617081 -0700 +@@ -1,6 +1,10 @@ + #include + #include + ++#ifdef __sh__ ++#define signal(a,b) /* Signals not supported on this target - make them go away */ ++#endif ++ + + #ifdef PROTOTYPES + void +Index: gdb-7.5/gdb/config/sh/xm-linux.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gdb-7.5/gdb/config/sh/xm-linux.h 2012-09-19 14:40:42.994609807 -0700 +@@ -0,0 +1,32 @@ ++/* Native support for GNU/Linux, for GDB, the GNU debugger. ++ Copyright (C) 2000 Free Software Foundation, Inc. ++ ++This file is part of GDB. ++ ++This program is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2 of the License, or ++(at your option) any later version. ++ ++This program is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; if not, write to the Free Software ++Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ++ ++#ifndef XM_LINUX_H ++#define XM_LINUX_H ++ ++#define HOST_BYTE_ORDER LITTLE_ENDIAN ++ ++#define HAVE_TERMIOS ++ ++#define NEED_POSIX_SETPGID ++ ++/* Need R_OK etc, but USG isn't defined. */ ++#include ++ ++#endif /* #ifndef XM_LINUX_H */ +Index: gdb-7.5/gdb/config/sh/nm-linux.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gdb-7.5/gdb/config/sh/nm-linux.h 2012-09-19 14:40:42.994609807 -0700 +@@ -0,0 +1,54 @@ ++/* Native-dependent definitions for SuperH running Linux, for GDB. ++ Copyright 2004 Free Software Foundation, Inc. ++ ++ This file is part of GDB. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. */ ++ ++#ifndef NM_LINUX_H ++#define NM_LINUX_H ++ ++/* Get generic Linux native definitions. */ ++#include "config/nm-linux.h" ++/* Support for the user area. */ ++ ++/* Return the size of the user struct. */ ++extern int kernel_u_size (void); ++#define KERNEL_U_SIZE kernel_u_size() ++ ++/* This is the amount to substract from u.u_ar0 to get the offset in ++ the core file of the register values. */ ++#define KERNEL_U_ADDR 0 ++ ++#define U_REGS_OFFSET 0 ++ ++extern CORE_ADDR register_u_addr (CORE_ADDR blockend, int regnum); ++#define REGISTER_U_ADDR(addr, blockend, regnum) \ ++ (addr) = register_u_addr (blockend, regnum) ++ ++/* Override copies of {fetch,store}_inferior_registers in `infptrace.c'. */ ++#define FETCH_INFERIOR_REGISTERS ++ ++/* Nevertheless, define CANNOT_{FETCH,STORE}_REGISTER, because we ++ might fall back on the code `infptrace.c' (well a copy of that code ++ in `sh-linux-nat.c' for now) and we can access only the ++ general-purpose registers in that way. */ ++extern int cannot_fetch_register (int regno); ++extern int cannot_store_register (int regno); ++#define CANNOT_FETCH_REGISTER(regno) cannot_fetch_register (regno) ++#define CANNOT_STORE_REGISTER(regno) cannot_store_register (regno) ++ ++#endif /* NM_LINUX_H */ +Index: gdb-7.5/gdb/config/sh/linux.mh +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gdb-7.5/gdb/config/sh/linux.mh 2012-09-19 14:40:42.994609807 -0700 +@@ -0,0 +1,8 @@ ++# Host: Renesas Super-H running GNU/Linux ++NAT_FILE= config/sh/nm-linux.h ++NATDEPFILES= inf-ptrace.o fork-child.o corelow.o sh-linux-nat.o \ ++ proc-service.o linux-thread-db.o gcore.o \ ++ linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o ++ ++NAT_CDEPS = $(srcdir)/proc-service.list ++LOADLIBES= -ldl $(RDYNAMIC) diff --git a/meta/recipes-devtools/gdb/gdb/run-ptest b/meta/recipes-devtools/gdb/gdb/run-ptest new file mode 100755 index 0000000000..e8587e8961 --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb/run-ptest @@ -0,0 +1,2 @@ +#!/bin/sh +make -C testsuite check-single | sed -e 's/XFAIL/PASS/' -e 's/UNRESOLVED/SKIP/' -e 's/UNTESTED/SKIP/' -e 's/UNSUPPORTED/SKIP/' diff --git a/meta/recipes-devtools/gdb/gdb/runtest-flags.patch b/meta/recipes-devtools/gdb/gdb/runtest-flags.patch new file mode 100644 index 0000000000..054abc32d1 --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb/runtest-flags.patch @@ -0,0 +1,30 @@ +Description: add -a to runtest + Pass "-a" to runtest so that everything is printed to output + (e.g. unsupported test cases) + +Author: "Gordon.Sun" +Date: Wed, 28 Nov 2012 03:39:58 +0100 + +Upstream-Status: Inappropriate (other) + +Signed-off-by: Gordon.Sun +Signed-off-by: Ciprian Barbu +--- + gdb/testsuite/Makefile.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/gdb/testsuite/Makefile.in b/gdb/testsuite/Makefile.in +index fab124e..f5cddb2 100644 +--- a/gdb/testsuite/Makefile.in ++++ b/gdb/testsuite/Makefile.in +@@ -46,7 +46,7 @@ EXPECT = `if [ -f $${rootme}/../../expect/expect ] ; then \ + + RUNTEST = $(RUNTEST_FOR_TARGET) + +-RUNTESTFLAGS = ++RUNTESTFLAGS = -a + + FORCE_PARALLEL = + +-- +1.7.5.4 diff --git a/meta/recipes-devtools/gdb/gdb/sim-install-6.6.patch b/meta/recipes-devtools/gdb/gdb/sim-install-6.6.patch new file mode 100644 index 0000000000..f67c25d50e --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb/sim-install-6.6.patch @@ -0,0 +1,14 @@ +Upstream-Status: Inappropriate [embedded specific] + +--- gdb-6.1/sim/common/Makefile.in~ 2004-01-15 21:25:06.000000000 +0000 ++++ gdb-6.1/sim/common/Makefile.in 2004-07-22 17:07:46.237809032 +0100 +@@ -34,7 +34,7 @@ + + datadir = @datadir@ + mandir = @mandir@ +-man1dir = $(mandir)/man1 ++man1dir = $(DESTDIR)$(mandir)/man1 + infodir = @infodir@ + includedir = @includedir@ + + diff --git a/meta/recipes-devtools/gdb/gdb/sim-install.patch b/meta/recipes-devtools/gdb/gdb/sim-install.patch new file mode 100644 index 0000000000..a663ba7b81 --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb/sim-install.patch @@ -0,0 +1,36 @@ +Upstream-Status: Inappropriate [embedded specific] + +--- gdb-6.1/sim/common/Makefile.in~ 2004-01-15 21:25:06.000000000 +0000 ++++ gdb-6.1/sim/common/Makefile.in 2004-07-22 17:07:46.237809032 +0100 +@@ -34,7 +34,7 @@ + + datadir = @datadir@ + mandir = @mandir@ +-man1dir = $(mandir)/man1 ++man1dir = $(DESTDIR)$(mandir)/man1 + infodir = @infodir@ + includedir = @includedir@ + + +--- gdb-6.1/sim/common/Make-common.in~sim-install.patch 2003-09-08 18:24:59.000000000 +0100 ++++ gdb-6.1/sim/common/Make-common.in 2004-07-22 17:56:18.947423032 +0100 +@@ -581,14 +581,14 @@ + + install-common: installdirs + n=`echo run | sed '$(program_transform_name)'`; \ +- $(INSTALL_PROGRAM) run$(EXEEXT) $(bindir)/$$n$(EXEEXT) ++ $(INSTALL_PROGRAM) run$(EXEEXT) $(DESTDIR)$(bindir)/$$n$(EXEEXT) + n=`echo libsim.a | sed s/libsim.a/lib$(target_alias)-sim.a/`; \ +- $(INSTALL_DATA) libsim.a $(libdir)/$$n ; \ +- ( cd $(libdir) ; $(RANLIB) $$n ) ++ $(INSTALL_DATA) libsim.a $(DESTDIR)$(libdir)/$$n ; \ ++ ( cd $(DESTDIR)$(libdir) ; $(RANLIB) $$n ) + + installdirs: +- $(SHELL) $(srcdir)/../../mkinstalldirs $(bindir) +- $(SHELL) $(srcdir)/../../mkinstalldirs $(libdir) ++ $(SHELL) $(srcdir)/../../mkinstalldirs $(DESTDIR)$(bindir) ++ $(SHELL) $(srcdir)/../../mkinstalldirs $(DESTDIR)$(libdir) + + check: + cd ../testsuite && $(MAKE) check RUNTESTFLAGS="$(RUNTESTFLAGS)" diff --git a/meta/recipes-devtools/gdb/gdb/uclibc.patch b/meta/recipes-devtools/gdb/gdb/uclibc.patch new file mode 100644 index 0000000000..f5fd518fcf --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb/uclibc.patch @@ -0,0 +1,196 @@ +Upstream-Status: Pending + +--- binutils-2.15.91.0.1/bfd/config.bfd~binutils-2.15.90.0.3-uclibc-100-conf ++++ binutils-2.15.91.0.1/bfd/config.bfd +@@ -128,7 +128,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -138,7 +138,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-linux-uclibc* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -215,7 +215,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -223,8 +223,8 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ +- arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +@@ -367,7 +367,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -378,7 +378,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-netbsd* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -501,7 +501,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -515,7 +515,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -690,7 +690,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -966,7 +966,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -1003,8 +1004,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1165,7 +1166,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1212,7 +1213,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +--- binutils-2.15.91.0.1/bfd/configure~binutils-2.15.90.0.3-uclibc-100-conf ++++ binutils-2.15.91.0.1/bfd/configure +@@ -1687,6 +1687,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5266,7 +5271,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5326,7 +5331,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5364,7 +5369,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +--- binutils-2.15.91.0.1/bfd/configure.in~binutils-2.15.90.0.3-uclibc-100-conf ++++ binutils-2.15.91.0.1/bfd/configure.in +@@ -164,7 +164,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -245,7 +245,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -286,7 +286,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; diff --git a/meta/recipes-devtools/gdb/gdb_7.7.1.bb b/meta/recipes-devtools/gdb/gdb_7.7.1.bb new file mode 100644 index 0000000000..1abc9d8e76 --- /dev/null +++ b/meta/recipes-devtools/gdb/gdb_7.7.1.bb @@ -0,0 +1,24 @@ +require gdb.inc +require gdb-${PV}.inc + +inherit python-dir + +PACKAGECONFIG ??= "" +PACKAGECONFIG[python] = "--with-python=${WORKDIR}/python,--without-python,python" +PACKAGECONFIG[babeltrace] = "--with-babeltrace,--without-babeltrace,babeltrace" + +do_configure_prepend() { + if [ -n "${@bb.utils.contains('PACKAGECONFIG', 'python', 'python', '', d)}" ]; then + cat > ${WORKDIR}/python << EOF +#!/bin/sh +case "\$2" in + --includes) echo "-I${STAGING_INCDIR}/${PYTHON_DIR}/" ;; + --ldflags) echo "-Wl,-rpath-link,${STAGING_LIBDIR}/.. -Wl,-rpath,${libdir}/.. -lpthread -ldl -lutil -lm -lpython${PYTHON_BASEVERSION}" ;; + --exec-prefix) echo "${exec_prefix}" ;; + *) exit 1 ;; +esac +exit 0 +EOF + chmod +x ${WORKDIR}/python + fi +} -- cgit v1.2.3-54-g00ecf