mirror of
https://github.com/gcc-mirror/gcc.git
synced 2025-07-25 16:46:41 +00:00

I added some gdb.execute('skip -rfu ...') commands to the Python hook loaded with libstdc++.so but this makes GDB print output like: Function(s) ^std::(move|forward|as_const|(__)?addressof) will be skipped when stepping. This probably aren't interesting to users, so this change suppresses that output by capturing the output into the gdb.execute return value (which is then ignored). An exception is thrown if the gdb.execute command fails, so this doesn't suppress any errors which might be meaningful to users or libstdc++ developers. libstdc++-v3/ChangeLog: PR libstdc++/118260 * python/hook.in: Suppress output from gdb.execute calls to register skips. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
71 lines
2.8 KiB
Python
71 lines
2.8 KiB
Python
# -*- python -*-
|
|
# Copyright (C) 2009-2025 Free Software Foundation, Inc.
|
|
|
|
# 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 3 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, see <http://www.gnu.org/licenses/>.
|
|
|
|
import sys
|
|
import gdb
|
|
import os
|
|
import os.path
|
|
|
|
pythondir = '@pythondir@'
|
|
libdir = '@toolexeclibdir@'
|
|
|
|
# This file might be loaded when there is no current objfile. This
|
|
# can happen if the user loads it manually. In this case we don't
|
|
# update sys.path; instead we just hope the user managed to do that
|
|
# beforehand.
|
|
if gdb.current_objfile () is not None:
|
|
# Update module path. We want to find the relative path from libdir
|
|
# to pythondir, and then we want to apply that relative path to the
|
|
# directory holding the objfile with which this file is associated.
|
|
# This preserves relocatability of the gcc tree.
|
|
|
|
# Do a simple normalization that removes duplicate separators.
|
|
pythondir = os.path.normpath (pythondir)
|
|
libdir = os.path.normpath (libdir)
|
|
|
|
prefix = os.path.commonprefix ([libdir, pythondir])
|
|
# In some bizarre configuration we might have found a match in the
|
|
# middle of a directory name.
|
|
if prefix[-1] != '/':
|
|
prefix = os.path.dirname (prefix) + '/'
|
|
|
|
# Strip off the prefix.
|
|
pythondir = pythondir[len (prefix):]
|
|
libdir = libdir[len (prefix):]
|
|
|
|
# Compute the ".."s needed to get from libdir to the prefix.
|
|
dotdots = ('..' + os.sep) * len (libdir.split (os.sep))
|
|
|
|
objfile = gdb.current_objfile ().filename
|
|
dir_ = os.path.join (os.path.dirname (objfile), dotdots, pythondir)
|
|
|
|
if not dir_ in sys.path:
|
|
sys.path.insert(0, dir_)
|
|
|
|
gdb.execute('skip -rfu ^std::(move|forward|as_const|(__)?addressof)',
|
|
to_string=True)
|
|
gdb.execute('skip -rfu ^std::(shared|unique)_ptr<.*>::(get|operator)',
|
|
to_string=True)
|
|
gdb.execute('skip -rfu ^std::(basic_string|vector|array|deque|(forward_)?list|(unordered_|flat_)?(multi)?(map|set)|span)<.*>::(c?r?(begin|end)|front|back|data|size|empty)',
|
|
to_string=True)
|
|
gdb.execute('skip -rfu ^std::(basic_string|vector|array|deque|span)<.*>::operator.]',
|
|
to_string=True)
|
|
|
|
# Call a function as a plain import would not execute body of the included file
|
|
# on repeated reloads of this object file.
|
|
from libstdcxx.v6 import register_libstdcxx_printers
|
|
register_libstdcxx_printers(gdb.current_objfile())
|