public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Jonathan Wakely <redi@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r11-5683] libstdc++: Fix std::any pretty printer [PR 68735] Date: Wed, 2 Dec 2020 21:39:27 +0000 (GMT) [thread overview] Message-ID: <20201202213927.19795397244B@sourceware.org> (raw) https://gcc.gnu.org/g:dc2b372ed1b1e9af6db45051cff95478c7616807 commit r11-5683-gdc2b372ed1b1e9af6db45051cff95478c7616807 Author: Jonathan Wakely <jwakely@redhat.com> Date: Wed Dec 2 21:39:08 2020 +0000 libstdc++: Fix std::any pretty printer [PR 68735] This fixes errors seen on powerpc64 (big endian only) due to the printers for std::any and std::experimental::any being unable to find the manager function. libstdc++-v3/ChangeLog: PR libstdc++/65480 PR libstdc++/68735 * python/libstdcxx/v6/printers.py (function_pointer_to_name): New helper function to get the name of a function from its address. (StdExpAnyPrinter.__init__): Use it. Diff: --- libstdc++-v3/python/libstdcxx/v6/printers.py | 29 +++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py index 4176f739004..9c6393712a0 100644 --- a/libstdc++-v3/python/libstdcxx/v6/printers.py +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py @@ -1126,6 +1126,29 @@ class SingleObjContainerPrinter(object): return self.visualizer.display_hint () return self.hint +def function_pointer_to_name(f): + "Find the name of the function referred to by the gdb.Value f, " + " which should contain a function pointer from the program." + + # Turn the function pointer into an actual address. + # This is needed to unpack ppc64 function descriptors. + f = f.dereference().address + + if sys.version_info[0] == 2: + # Older versions of GDB need to use long for Python 2, + # because int(f) on 64-bit big-endian values raises a + # gdb.error saying "Cannot convert value to int." + f = long(f) + else: + f = int(f) + + try: + # If the function can't be found older versions of GDB raise a + # RuntimeError saying "Cannot locate object file for block." + return gdb.block_for_pc(f).function.name + except: + return None + class StdExpAnyPrinter(SingleObjContainerPrinter): "Print a std::any or std::experimental::any" @@ -1138,11 +1161,11 @@ class StdExpAnyPrinter(SingleObjContainerPrinter): visualizer = None mgr = self.val['_M_manager'] if mgr != 0: - func = gdb.block_for_pc(int(mgr.cast(gdb.lookup_type('intptr_t')))) + func = function_pointer_to_name(mgr) if not func: - raise ValueError("Invalid function pointer in %s" % self.typename) + raise ValueError("Invalid function pointer in %s" % (self.typename)) rx = r"""({0}::_Manager_\w+<.*>)::_S_manage\((enum )?{0}::_Op, (const {0}|{0} const) ?\*, (union )?{0}::_Arg ?\*\)""".format(typename) - m = re.match(rx, func.function.name) + m = re.match(rx, func) if not m: raise ValueError("Unknown manager function in %s" % self.typename)
reply other threads:[~2020-12-02 21:39 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20201202213927.19795397244B@sourceware.org \ --to=redi@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ --cc=libstdc++-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).