[gdb] Switch Python 2->3 (RH BZ 1014549).

Jan Kratochvil jankratochvil at fedoraproject.org
Mon Feb 16 14:56:55 UTC 2015


commit 61676c03540535642fff94df89d51428ff64d7de
Author: Jan Kratochvil <jan.kratochvil at redhat.com>
Date:   Mon Feb 16 15:56:42 2015 +0100

    Switch Python 2->3 (RH BZ 1014549).

 gdb-archer.patch                  |   89 ++++++++++++-------
 gdb-python3-py_hash_t-32bit.patch |  175 +++++++++++++++++++++++++++++++++++++
 gdb-python3-testsuite.patch       |   56 ++++++++++++
 gdb.spec                          |   18 +++-
 4 files changed, 304 insertions(+), 34 deletions(-)
---
diff --git a/gdb-archer.patch b/gdb-archer.patch
index c6b2cca..7e76d7b 100644
--- a/gdb-archer.patch
+++ b/gdb-archer.patch
@@ -2,7 +2,7 @@ http://sourceware.org/gdb/wiki/ProjectArcher
 http://sourceware.org/gdb/wiki/ArcherBranchManagement
 
 GIT snapshot:
-commit ef5e5e4d5bfedecf54ef7f1380eaf89662b617d0
+commit d1a09bf2f8e7e3f752a1bbeba135bc080bf0c865
 
 tromey/python
 
@@ -304,7 +304,7 @@ index 0000000..6fa48ff
 +IgnoreErrorsCommand ()
 diff --git a/gdb/python/lib/gdb/command/pahole.py b/gdb/python/lib/gdb/command/pahole.py
 new file mode 100644
-index 0000000..636f99d
+index 0000000..dee04f5
 --- /dev/null
 +++ b/gdb/python/lib/gdb/command/pahole.py
 @@ -0,0 +1,81 @@
@@ -339,7 +339,7 @@ index 0000000..636f99d
 +    def maybe_print_hole(self, bitpos, field_bitpos):
 +        if bitpos != field_bitpos:
 +            hole = field_bitpos - bitpos
-+            print '  /* XXX %d bit hole, try to pack */' % hole
++            print ('  /* XXX %d bit hole, try to pack */' % hole)
 +
 +    def pahole (self, type, level, name):
 +        if name is None:
@@ -347,7 +347,7 @@ index 0000000..636f99d
 +        tag = type.tag
 +        if tag is None:
 +            tag = ''
-+        print '%sstruct %s {' % (' ' * (2 * level), tag)
++        print ('%sstruct %s {' % (' ' * (2 * level), tag))
 +        bitpos = 0
 +        for field in type.fields ():
 +            # Skip static fields.
@@ -365,33 +365,33 @@ index 0000000..636f99d
 +                fieldsize = 8 * ftype.sizeof
 +
 +            # TARGET_CHAR_BIT
-+            print ' /* %3d %3d */' % (int (bitpos / 8), int (fieldsize / 8)),
++            print (' /* %3d %3d */' % (int (bitpos / 8), int (fieldsize / 8)))
 +            bitpos = bitpos + fieldsize
 +
 +            if ftype.code == gdb.TYPE_CODE_STRUCT:
 +                self.pahole (ftype, level + 1, field.name)
 +            else:
-+                print ' ' * (2 + 2 * level),
-+                print '%s %s' % (str (ftype), field.name)
++                print (' ' * (2 + 2 * level))
++                print ('%s %s' % (str (ftype), field.name))
 +
 +        if level == 0:
 +            self.maybe_print_hole(bitpos, 8 * type.sizeof)
 +
-+        print ' ' * (14 + 2 * level),
-+        print '} %s' % name
++        print (' ' * (14 + 2 * level))
++        print ('} %s' % name)
 +
 +    def invoke (self, arg, from_tty):
 +        type = gdb.lookup_type (arg)
 +        type = type.strip_typedefs ()
 +        if type.code != gdb.TYPE_CODE_STRUCT:
-+            raise TypeError, '%s is not a struct type' % arg
-+        print ' ' * 14,
++            raise (TypeError, '%s is not a struct type' % arg)
++        print (' ' * 14)
 +        self.pahole (type, 0, '')
 +
 +Pahole()
 diff --git a/gdb/python/lib/gdb/function/in_scope.py b/gdb/python/lib/gdb/function/in_scope.py
 new file mode 100644
-index 0000000..debb3bb
+index 0000000..8742680
 --- /dev/null
 +++ b/gdb/python/lib/gdb/function/in_scope.py
 @@ -0,0 +1,47 @@
@@ -419,31 +419,31 @@ index 0000000..debb3bb
 +Takes one argument for each variable name to be checked."""
 +
 +    def __init__ (self):
-+	super (InScope, self).__init__ ("in_scope")
++        super (InScope, self).__init__ ("in_scope")
 +
 +    def invoke (self, *vars):
 +        if len (vars) == 0:
-+	    raise TypeError, "in_scope takes at least one argument"
++            raise (TypeError, "in_scope takes at least one argument")
 +
 +        # gdb.Value isn't hashable so it can't be put in a map.
-+	# Convert to string first.
-+	wanted = set (map (lambda x: x.string (), vars))
-+	found = set ()
-+	block = gdb.selected_frame ().block ()
-+	while block:
-+	    for sym in block:
-+		if (sym.is_argument or sym.is_constant
-+		      or sym.is_function or sym.is_variable):
-+		    if sym.name in wanted:
-+			found.add (sym.name)
++        # Convert to string first.
++        wanted = set (map (lambda x: x.string (), vars))
++        found = set ()
++        block = gdb.selected_frame ().block ()
++        while block:
++            for sym in block:
++                if (sym.is_argument or sym.is_constant
++                      or sym.is_function or sym.is_variable):
++                    if sym.name in wanted:
++                        found.add (sym.name)
 +
-+	    block = block.superblock
++            block = block.superblock
 +
-+	return wanted == found
++        return wanted == found
 +
 +InScope ()
 diff --git a/gdb/python/python.c b/gdb/python/python.c
-index b1d8283..8eb8afe 100644
+index b1d8283..54a2d9b 100644
 --- a/gdb/python/python.c
 +++ b/gdb/python/python.c
 @@ -93,6 +93,8 @@ const struct extension_language_defn extension_language_python =
@@ -455,7 +455,7 @@ index b1d8283..8eb8afe 100644
  #include "target.h"
  #include "gdbthread.h"
  #include "interps.h"
-@@ -1220,6 +1222,56 @@ gdbpy_print_stack (void)
+@@ -1220,6 +1222,83 @@ gdbpy_print_stack (void)
  
  /* Return the current Progspace.
     There always is one.  */
@@ -495,7 +495,34 @@ index b1d8283..8eb8afe 100644
 +  ensure_python_env (get_current_arch (), current_language);
 +
 +  running_python_script = 1;
++
++#if PYTHON_ABI_VERSION < 3
 +  PySys_SetArgv (argc - 1, argv + 1);
++#else
++  {
++    wchar_t **wargv = alloca (sizeof (*wargv) * (argc + 1));
++    int i;
++
++    for (i = 1; i < argc; i++)
++      {
++	size_t len = mbstowcs (NULL, argv[i], 0);
++	size_t len2;
++
++	if (len == (size_t) -1)
++	  {
++	    fprintf (stderr, "Invalid multibyte argument #%d \"%s\"\n",
++		     i, argv[i]);
++	    exit (1);
++	  }
++	wargv[i] = alloca (sizeof (**wargv) * (len + 1));
++	len2 = mbstowcs (wargv[i], argv[i], len + 1);
++	assert (len2 == len);
++      }
++    wargv[argc] = NULL;
++    PySys_SetArgv (argc - 1, wargv + 1);
++  }
++#endif
++
 +  input = fopen (argv[0], "r");
 +  if (! input)
 +    {
@@ -512,7 +539,7 @@ index b1d8283..8eb8afe 100644
  
  static PyObject *
  gdbpy_get_current_progspace (PyObject *unused1, PyObject *unused2)
-@@ -1913,6 +1965,8 @@ static PyMethodDef GdbMethods[] =
+@@ -1913,6 +1992,8 @@ static PyMethodDef GdbMethods[] =
  Evaluate command, a string, as a gdb CLI command.  Optionally returns\n\
  a Python String containing the output of the command if to_string is\n\
  set to True." },
@@ -561,7 +588,7 @@ index e47f340..a7e0a52 100644
  gdb_test "python print ('result = %s' % (gdb.selected_frame ().read_register ('sp') == gdb.parse_and_eval ('\$sp')))" \
    " = True" \
 diff --git a/gdb/testsuite/gdb.python/py-value.exp b/gdb/testsuite/gdb.python/py-value.exp
-index f081ff0..31b5910 100644
+index f081ff0..58cce09 100644
 --- a/gdb/testsuite/gdb.python/py-value.exp
 +++ b/gdb/testsuite/gdb.python/py-value.exp
 @@ -388,6 +388,15 @@ proc test_value_after_death {} {
@@ -574,7 +601,7 @@ index f081ff0..31b5910 100644
 +proc test_cast_regression {} {
 +  gdb_test "python v = gdb.Value(5)" "" "create value for cast test"
 +  gdb_test "python v = v.cast(v.type)" "" "cast value for cast test"
-+  gdb_test "python print v" "5" "print value for cast test"
++  gdb_test "python print(v)" "5" "print value for cast test"
 +}
 +
  # Regression test for invalid subscript operations.  The bug was that
diff --git a/gdb-python3-py_hash_t-32bit.patch b/gdb-python3-py_hash_t-32bit.patch
new file mode 100644
index 0000000..ad3a6f6
--- /dev/null
+++ b/gdb-python3-py_hash_t-32bit.patch
@@ -0,0 +1,175 @@
+http://sourceware.org/ml/gdb-patches/2015-02/msg00091.html
+Subject: [patch] Fix Python 3 build error on 32-bit hosts
+
+
+--ZPt4rx8FFjLCG7dd
+Content-Type: text/plain; charset=iso-2022-jp
+Content-Disposition: inline
+
+Hi,
+
+on Fedora Rawhide (==22) i686 using --with-python=/usr/bin/python3 one gets:
+
+gcc -g   -I. -I. -I./common -I./config -DLOCALEDIR="\"/usr/local/share/locale\"" -DHAVE_CONFIG_H -I./../include/opcode -I./../opcodes/.. -I./../readline/.. -I../bfd -I./../bfd -I./../include -I../libdecnumber -I./../libdecnumber  -I./gnulib/import -Ibuild-gnulib/import   -DTUI=1   -pthread -I/usr/include/guile/2.0  -I/usr/include/python3.4m -I/usr/include/python3.4m -Wall -Wdeclaration-after-statement -Wpointer-arith -Wpointer-sign -Wno-unused -Wunused-value -Wunused-function -Wno-switch -Wno-char-subscripts -Wmissing-prototypes -Wdeclaration-after-statement -Wempty-body -Wmissing-parameter-type -Wold-style-declaration -Wold-style-definition -Wformat-nonliteral -Werror -c -o py-value.o -MT py-value.o -MMD -MP -MF .deps/py-value.Tpo -fno-strict-aliasing -DNDEBUG -fwrapv ./python/py-value.c
+./python/py-value.c:1696:3: error: initialization from incompatible pointer type [-Werror]
+   valpy_hash,            /*tp_hash*/
+   ^
+./python/py-value.c:1696:3: error: (near initialization for ‘value_object_type.tp_hash’) [-Werror]
+cc1: all warnings being treated as errors
+Makefile:2628: recipe for target 'py-value.o' failed
+
+This is because in Python 2 tp_hash was:
+	typedef long (*hashfunc)(PyObject *);
+while in Python 3 tp_hash is:
+	typedef Py_hash_t (*hashfunc)(PyObject *);
+
+Py_hash_t is int for 32-bit hosts and long for 64-bit hosts.  While on 32-bit
+hosts sizeof(long)==sizeof(int) still the hashfunc type is formally
+incompatible.  As this patch should have no compiled code change it is not
+really necessary for gdb-7.9, it would fix there just this non-fatal
+compilation warning:
+	./python/py-value.c:1696:3: warning: initialization from incompatible pointer type
+	   valpy_hash,            /*tp_hash*/
+	   ^
+	./python/py-value.c:1696:3: warning: (near initialization for ‘value_object_type.tp_hash’)
+
+A question is whether the autoconf test isn't an overkill.  One could use
+instead just:
+	#if PYTHON_ABI_VERSION >= 3
+Also one could use that #if either just at the valpy_hash() definition or one
+could provide Py_hash_t in gdb/defs.h or one could provide some GDB_Py_hash_t
+in gdb/defs.h.
+
+Tested compilation with:
+	python-devel-2.7.9-4.fc22.x86_64
+	python-devel-2.7.9-4.fc22.i686
+	python3-devel-3.4.2-4.fc22.x86_64
+	python3-devel-3.4.2-4.fc22.i686
+
+
+Jan
+
+--ZPt4rx8FFjLCG7dd
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline; filename=1
+
+gdb/
+2015-02-04  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	* configure.ac <"${have_libpython}" != no>: Define Py_hash_t.
+	* python/py-value.c (valpy_fetch_lazy): Use it.  Remove cast to the
+	return type.
+	* config.in: Regenerate.
+	* configure: Regenerate.
+
+diff --git a/gdb/config.in b/gdb/config.in
+index 806cbac..44acfac 100644
+--- a/gdb/config.in
++++ b/gdb/config.in
+@@ -617,6 +617,9 @@
+ /* Define if the python directory should be relocated when GDB is moved. */
+ #undef PYTHON_PATH_RELOCATABLE
+ 
++/* Provide Python 3 Py_hash_t for Python 2. */
++#undef Py_hash_t
++
+ /* Relocated directory for source files. */
+ #undef RELOC_SRCDIR
+ 
+diff --git a/gdb/configure b/gdb/configure
+index 9632f9a..65f5b2c 100755
+--- a/gdb/configure
++++ b/gdb/configure
+@@ -8749,6 +8749,45 @@ rm -f conftest.err conftest.$ac_ext
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${python_has_threads}" >&5
+ $as_echo "${python_has_threads}" >&6; }
+   CPPFLAGS="${saved_CPPFLAGS}"
++
++  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Py_hash_t" >&5
++$as_echo_n "checking for Py_hash_t... " >&6; }
++if test "${gdb_cv_Py_hash_t+set}" = set; then :
++  $as_echo_n "(cached) " >&6
++else
++  old_CFLAGS="$CFLAGS"
++    CFLAGS="$CFLAGS $PYTHON_CFLAGS"
++    old_CPPFLAGS="$CPPFLAGS"
++    CPPFLAGS="$CPPFLAGS $PYTHON_CPPFLAGS"
++    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++#include <Python.h>
++int
++main ()
++{
++Py_hash_t var;
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++  gdb_cv_Py_hash_t=yes
++else
++  gdb_cv_Py_hash_t=no
++
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++    CPPFLAGS="$old_CPPFLAGS"
++    CFLAGS="$old_CFLAGS"
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gdb_cv_Py_hash_t" >&5
++$as_echo "$gdb_cv_Py_hash_t" >&6; }
++  if test "x$gdb_cv_Py_hash_t" = "xno"; then
++
++$as_echo "#define Py_hash_t long" >>confdefs.h
++
++  fi
+ else
+   # Even if Python support is not compiled in, we need to have this file
+   # included so that the "python" command, et.al., still exists.
+diff --git a/gdb/configure.ac b/gdb/configure.ac
+index dfc6947..f335b7b 100644
+--- a/gdb/configure.ac
++++ b/gdb/configure.ac
+@@ -1016,6 +1016,25 @@ if test "${have_libpython}" != no; then
+   ]]), [python_has_threads=no], [python_has_threads=yes])
+   AC_MSG_RESULT(${python_has_threads})
+   CPPFLAGS="${saved_CPPFLAGS}"
++
++  AC_CACHE_CHECK([for Py_hash_t], gdb_cv_Py_hash_t,
++    old_CFLAGS="$CFLAGS"
++    CFLAGS="$CFLAGS $PYTHON_CFLAGS"
++    old_CPPFLAGS="$CPPFLAGS"
++    CPPFLAGS="$CPPFLAGS $PYTHON_CPPFLAGS"
++    AC_TRY_COMPILE(
++      [#include <Python.h>],
++      [Py_hash_t var;],
++      gdb_cv_Py_hash_t=yes,
++      gdb_cv_Py_hash_t=no
++    )
++    CPPFLAGS="$old_CPPFLAGS"
++    CFLAGS="$old_CFLAGS"
++  )
++  if test "x$gdb_cv_Py_hash_t" = "xno"; then
++    AC_DEFINE(Py_hash_t, long,
++	      [Provide Python 3 Py_hash_t for Python 2.])
++  fi
+ else
+   # Even if Python support is not compiled in, we need to have this file
+   # included so that the "python" command, et.al., still exists.
+diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c
+index 4c4d36e..5a13777 100644
+--- a/gdb/python/py-value.c
++++ b/gdb/python/py-value.c
+@@ -895,10 +895,10 @@ valpy_fetch_lazy (PyObject *self, PyObject *args)
+ 
+ /* Calculate and return the address of the PyObject as the value of
+    the builtin __hash__ call.  */
+-static long
++static Py_hash_t
+ valpy_hash (PyObject *self)
+ {
+-  return (long) (intptr_t) self;
++  return (intptr_t) self;
+ }
+ 
+ enum valpy_opcode
diff --git a/gdb-python3-testsuite.patch b/gdb-python3-testsuite.patch
new file mode 100644
index 0000000..9981777
--- /dev/null
+++ b/gdb-python3-testsuite.patch
@@ -0,0 +1,56 @@
+http://sourceware.org/ml/gdb-patches/2015-02/msg00361.html
+Subject: PR python/17927 (Python 3 testsuite compatability)
+
+This patch updates the Python testsuite to maintain Python 3
+compatibility.  I'll check it in under the obvious tomorrow (if
+nobody objects otherwise.)
+
+Cheers
+
+Phil
+
+
+2015-02-16  Phil Muldoon  <pmuldoon at redhat.com>
+
+    PR python/17927
+    * gdb.python/py-objfile.exp: Use print ()
+    * gdb.python/py-type.exp: Ditto.
+    * gdb.python/py-framefilter.py: Update to use map in
+    Python 3.
+
+--
+
+diff --git a/gdb/testsuite/gdb.python/py-framefilter.py b/gdb/testsuite/gdb.python/py-framefilter.py
+index 0de026c..8c65edc 100644
+--- a/gdb/testsuite/gdb.python/py-framefilter.py
++++ b/gdb/testsuite/gdb.python/py-framefilter.py
+@@ -145,7 +145,10 @@ class ErrorFilter():
+         gdb.frame_filters [self.name] = self
+ 
+     def filter(self, frame_iter):
+-        return itertools.imap(ErrorInName, frame_iter)
++        if hasattr(itertools, "imap"):
++            return itertools.imap(ErrorInName, frame_iter)
++        else:
++            return map(ErrorInName, frame_iter)
+ 
+ FrameFilter()
+ FrameElider()
+diff --git a/gdb/testsuite/gdb.python/py-type.exp b/gdb/testsuite/gdb.python/py-type.exp
+index c4c8d9f..6c4e5f8 100644
+--- a/gdb/testsuite/gdb.python/py-type.exp
++++ b/gdb/testsuite/gdb.python/py-type.exp
+@@ -247,10 +247,10 @@ restart_gdb "${binfile}"
+ # Skip all tests if Python scripting is not enabled.
+ if { [skip_python_tests] } { continue }
+ 
+-gdb_test "python print gdb.lookup_type('char').array(1, 0)" \
++gdb_test "python print (gdb.lookup_type('char').array(1, 0))" \
+     "char \\\[0\\\]"
+ 
+-gdb_test "python print gdb.lookup_type('char').array(1, -1)" \
++gdb_test "python print (gdb.lookup_type('char').array(1, -1))" \
+     "Array length must not be negative.*"
+ 
+ with_test_prefix "lang_c" {
+
diff --git a/gdb.spec b/gdb.spec
index d9d097a..4103d55 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -26,7 +26,7 @@ Version: 7.8.90.20150214
 
 # The release always contains a leading reserved number, start it at 1.
 # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 6%{?dist}
+Release: 7%{?dist}
 
 License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain and GFDL
 Group: Development/Debuggers
@@ -532,6 +532,12 @@ Patch979: gdb-6.8-bz457187-largefile-test-regression-fix.patch
 # Temporarily disable dg-extract-results.py to fix gdb.sum sorting.
 Patch982: gdb-no-dg-extract-results-py.patch
 
+# Fix Python 3 build error on 32-bit hosts.
+Patch984: gdb-python3-py_hash_t-32bit.patch
+
+# Fix Python 3 testsuite regressions.
+Patch985: gdb-python3-testsuite.patch
+
 %if 0%{!?rhel:1} || 0%{?rhel} > 6
 # RL_STATE_FEDORA_GDB would not be found for:
 # Patch642: gdb-readline62-ask-more-rh.patch
@@ -548,7 +554,8 @@ BuildRequires: xz-devel%{?_isa}
 BuildRequires: rpm-devel%{?_isa}
 BuildRequires: zlib-devel%{?_isa} libselinux-devel%{?_isa}
 %if 0%{!?_without_python:1}
-BuildRequires: python-devel%{?_isa}
+%global __python %{__python3}
+BuildRequires: python3-devel%{?_isa}
 %if 0%{?rhel:1} && 0%{?rhel} <= 6
 # Temporarily before python files get moved to libstdc++.rpm
 # libstdc++%{bits_other} is not present in Koji, the .spec script generating
@@ -819,6 +826,8 @@ find -name "*.info*"|xargs rm -f
 %patch978 -p1
 %patch979 -p1
 %patch982 -p1
+%patch984 -p1
+%patch985 -p1
 
 %patch848 -p1
 %if 0%{!?el6:1}
@@ -921,7 +930,7 @@ $(: ppc64 host build crashes on ppc variant of libexpat.so )	\
 	--without-libexpat-prefix				\
 	--enable-tui						\
 %if 0%{!?_without_python:1}
-	--with-python						\
+	--with-python=%{__python}				\
 %else
 	--without-python					\
 %endif
@@ -1315,6 +1324,9 @@ then
 fi
 
 %changelog
+* Mon Feb 16 2015 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.8.90.20150214-7.fc22
+- Switch Python 2->3 (RH BZ 1014549).
+
 * Sat Feb 14 2015 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.8.90.20150214-6.fc22
 - Rebase to 7.9-branch snapshot 7.8.90.20150214.
 


More information about the scm-commits mailing list