Make ptype/whatis print function name of functions with no debug info too
authorPedro Alves <palves@redhat.com>
Mon, 4 Sep 2017 19:21:14 +0000 (20:21 +0100)
committerPedro Alves <palves@redhat.com>
Mon, 4 Sep 2017 19:21:14 +0000 (20:21 +0100)
The patch to make GDB stop assuming functions return int left GDB with
an inconsistency.  While with normal expression evaluation the
"unknown return type" error shows the name of the function that misses
debug info:

  (gdb) p getenv ("PATH")
  'getenv' has unknown return type; cast the call to its declared return type
   ^^^^^^

which is handy in more complicated expressions, "ptype" does not:

  (gdb) ptype getenv ("PATH")
  function has unknown return type; cast the call to its declared return type
  ^^^^^^^^

This commit builds on the new OP_VAR_MSYM_VALUE to fix it, by making
OP_FUNCALL extract the function name from the symbol stored in
OP_VAR_VALUE/OP_VAR_MSYM_VALUE.  We now get the same error in "print"
vs "ptype":

  (gdb) ptype getenv()
  'getenv' has unknown return type; cast the call to its declared return type
  (gdb) p getenv()
  'getenv' has unknown return type; cast the call to its declared return type

gdb/ChangeLog:
2017-09-04  Pedro Alves  <palves@redhat.com>

* eval.c (evaluate_subexp_standard): <OP_FUNCALL>: Extract
function name from symbol/minsym and pass it to
error_call_unknown_return_type.

gdb/testsuite/ChangeLog:
2017-09-04  Pedro Alves  <palves@redhat.com>

* gdb.base/nodebug.exp: Test that ptype's error about functions
with unknown return type includes the function name too.

gdb/ChangeLog
gdb/eval.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/nodebug.exp

index d34b29a5c04caaf41e3b2c123f8ca8615a055d75..105c1dba5fc68de78e6729b520d068372fd44524 100644 (file)
@@ -1,3 +1,9 @@
+2017-09-04  Pedro Alves  <palves@redhat.com>
+
+       * eval.c (evaluate_subexp_standard): <OP_FUNCALL>: Extract
+       function name from symbol/minsym and pass it to
+       error_call_unknown_return_type.
+
 2017-09-04  Pedro Alves  <palves@redhat.com>
 
        * ada-lang.c (resolve_subexp): Handle OP_VAR_MSYM_VALUE.
index 457e280f6bf994bd9a507f9c67d499afc00ee338..0e77f0ad14e41176fbfd906e661ab3dec2ef5312 100644 (file)
@@ -716,6 +716,7 @@ evaluate_subexp_standard (struct type *expect_type,
   int save_pos1;
   struct symbol *function = NULL;
   char *function_name = NULL;
+  const char *var_func_name = NULL;
 
   pc = (*pos)++;
   op = exp->elts[pc].opcode;
@@ -1545,6 +1546,17 @@ evaluate_subexp_standard (struct type *expect_type,
            }
          else
            {
+             if (op == OP_VAR_MSYM_VALUE)
+               {
+                 symbol *sym = exp->elts[*pos + 2].symbol;
+                 var_func_name = SYMBOL_PRINT_NAME (sym);
+               }
+             else if (op == OP_VAR_VALUE)
+               {
+                 minimal_symbol *msym = exp->elts[*pos + 2].msymbol;
+                 var_func_name = MSYMBOL_PRINT_NAME (msym);
+               }
+
              argvec[0] = evaluate_subexp_with_coercion (exp, pos, noside);
              type = value_type (argvec[0]);
              if (type && TYPE_CODE (type) == TYPE_CODE_PTR)
@@ -1761,7 +1773,7 @@ evaluate_subexp_standard (struct type *expect_type,
                return_type = expect_type;
 
              if (return_type == NULL)
-               error_call_unknown_return_type (NULL);
+               error_call_unknown_return_type (var_func_name);
 
              return allocate_value (return_type);
            }
index c00c30038c510baddefc63758568746217570fa0..5457aa12f59094f902461844731f4b812ab4efdb 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-04  Pedro Alves  <palves@redhat.com>
+
+       * gdb.base/nodebug.exp: Test that ptype's error about functions
+       with unknown return type includes the function name too.
+
 2017-09-04  Pedro Alves  <palves@redhat.com>
 
        * gdb.base/break-main-file-remove-fail.exp (test_remove_bp): Cast
index 7bdf9ad7662b16ea8f797e5967175eec1dbf5b25..da704f10370120d25b753fc5801da88dc80d74e2 100644 (file)
@@ -204,14 +204,10 @@ if [runto inner] then {
     
     # This test is not as obscure as it might look.  `p getenv ("TERM")'
     # is a real-world example, at least on many systems.
-
-    gdb_test {p/c array_index("abcdef",2)} \
-       "'array_index' has unknown return type; cast the call to its declared return type"
-    gdb_test {ptype array_index("abcdef",2)} \
-       "function has unknown return type; cast the call to its declared return type"
-    gdb_test {whatis array_index("abcdef",2)} \
-       "function has unknown return type; cast the call to its declared return type"
-
+    foreach cmd {"p/c" "ptype" "whatis"} {
+       gdb_test "$cmd array_index(\"abcdef\",2)" \
+           "'array_index' has unknown return type; cast the call to its declared return type"
+    }
     if [target_info exists gdb,cannot_call_functions] {
        unsupported "p/c (int) array_index(\"abcdef\",2)"
     } else {