From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id D22F13858001; Mon, 11 Jan 2021 15:04:35 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D22F13858001 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r10-9249] libstdc++: Fix std::any pretty printer [PR 68735] X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/releases/gcc-10 X-Git-Oldrev: f0e81957b2b5e0f2b832adf64d2c70fc601c3466 X-Git-Newrev: 4fd49da23bf579b84940bd96bf942bd99cfa187a Message-Id: <20210111150435.D22F13858001@sourceware.org> Date: Mon, 11 Jan 2021 15:04:35 +0000 (GMT) X-BeenThere: libstdc++-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 11 Jan 2021 15:04:35 -0000 https://gcc.gnu.org/g:4fd49da23bf579b84940bd96bf942bd99cfa187a commit r10-9249-g4fd49da23bf579b84940bd96bf942bd99cfa187a Author: Jonathan Wakely 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. (cherry picked from commit dc2b372ed1b1e9af6db45051cff95478c7616807) 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 da2115204b7..2fcc83687ea 100644 --- a/libstdc++-v3/python/libstdcxx/v6/printers.py +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py @@ -1107,6 +1107,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" @@ -1119,11 +1142,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)