From e9194a1a0e49f0646d5ac415836cc5d133f14bbe Mon Sep 17 00:00:00 2001 From: Tankut Baris Aktemur Date: Fri, 29 Nov 2019 12:17:36 +0100 Subject: [PATCH] gdb: fix segfault in overload resolution debug output A segfault occurs if overload resolution debug mode is turned on via the 'set debug overload' command. E.g.: ~~~ $ gdb ./a.out ... (gdb) start ... (gdb) set debug overload 1 (gdb) print foo(5) -- Arg is int [8], parm is double [9] Overloaded function instance (null) # of parms 1 Segmentation fault $ ~~~ The problem is, GDB tries to print the badness vector after it has been std::move'd. Fix the problem by printing the vector before it is moved. gdb/ChangeLog: 2019-11-29 Tankut Baris Aktemur * valops.c (find_oload_champ): Print part of debug messages before the badness vector is std::move'd. Change-Id: Ia623f9637e82ec332bfeac23eb6b0f2ffdcdde27 --- gdb/ChangeLog | 5 +++++ gdb/valops.c | 48 +++++++++++++++++++++++++----------------------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bc61c35064e..a3c06705d97 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2019-11-29 Tankut Baris Aktemur + + * valops.c (find_oload_champ): Print part of debug messages + before the badness vector is std::move'd. + 2019-11-28 Tom Tromey * value.c (creal_internal_fn): Fix comment. diff --git a/gdb/valops.c b/gdb/valops.c index cbb1f30e71b..8af53deaa6f 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -3023,6 +3023,28 @@ find_oload_champ (gdb::array_view args, bv = rank_function (parm_types, args.slice (static_offset)); + if (overload_debug) + { + if (methods != NULL) + fprintf_filtered (gdb_stderr, + "Overloaded method instance %s, # of parms %d\n", + methods[ix].physname, (int) parm_types.size ()); + else if (xmethods != NULL) + fprintf_filtered (gdb_stderr, + "Xmethod worker, # of parms %d\n", + (int) parm_types.size ()); + else + fprintf_filtered (gdb_stderr, + "Overloaded function instance " + "%s # of parms %d\n", + functions[ix]->demangled_name (), + (int) parm_types.size ()); + for (jj = 0; jj < args.size () - static_offset; jj++) + fprintf_filtered (gdb_stderr, + "...Badness @ %d : %d\n", + jj, bv[jj].rank); + } + if (oload_champ_bv->empty ()) { *oload_champ_bv = std::move (bv); @@ -3048,29 +3070,9 @@ find_oload_champ (gdb::array_view args, break; } if (overload_debug) - { - if (methods != NULL) - fprintf_filtered (gdb_stderr, - "Overloaded method instance %s, # of parms %d\n", - methods[ix].physname, (int) parm_types.size ()); - else if (xmethods != NULL) - fprintf_filtered (gdb_stderr, - "Xmethod worker, # of parms %d\n", - (int) parm_types.size ()); - else - fprintf_filtered (gdb_stderr, - "Overloaded function instance " - "%s # of parms %d\n", - functions[ix]->demangled_name (), - (int) parm_types.size ()); - for (jj = 0; jj < args.size () - static_offset; jj++) - fprintf_filtered (gdb_stderr, - "...Badness @ %d : %d\n", - jj, bv[jj].rank); - fprintf_filtered (gdb_stderr, "Overload resolution " - "champion is %d, ambiguous? %d\n", - oload_champ, oload_ambiguous); - } + fprintf_filtered (gdb_stderr, "Overload resolution " + "champion is %d, ambiguous? %d\n", + oload_champ, oload_ambiguous); } return oload_champ; -- 2.30.2