aboutsummaryrefslogtreecommitdiff
path: root/gdb/stack.c
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2014-12-09 11:45:41 +0100
committerMark Wielaard <mjw@redhat.com>2015-01-23 17:29:19 +0100
commit743649fd80776de922475362bf3ac8b44511bb24 (patch)
treebb0e90750f05a5d2840cbfca16aab939b703b283 /gdb/stack.c
parent198297aafb4f7a9717be8370581b048ae9107c14 (diff)
downloadgdb-743649fd80776de922475362bf3ac8b44511bb24.zip
gdb-743649fd80776de922475362bf3ac8b44511bb24.tar.gz
gdb-743649fd80776de922475362bf3ac8b44511bb24.tar.bz2
Use GCC5/DWARF5 DW_AT_noreturn to mark functions that don't return normally.
Add a flag field is_noreturn to struct func_type. Make calling_convention a small bit field to not increase the size of the struct. Set is_noreturn if the new GCC5/DWARF5 DW_AT_noreturn is set on a DW_TAG_subprogram. Use this information to warn the user before doing a finish or return from a function that does not return normally to its caller. (gdb) finish warning: Function endless does not return normally. Try to finish anyway? (y or n) (gdb) return warning: Function does not return normally to caller. Make endless return now? (y or n) gdb/ChangeLog * dwarf2read.c (read_subroutine_type): Set TYPE_NO_RETURN from DW_AT_noreturn. * gdbtypes.h (struct func_type): Add is_noreturn field flag. Make calling_convention an 8 bit bit field. (TYPE_NO_RETURN): New macro. * infcmd.c (finish_command): Query if function does not return normally. * stack.c (return_command): Likewise. gdb/testsuite/ChangeLog * gdb.base/noreturn-return.c: New file. * gdb.base/noreturn-return.exp: New file. * gdb.base/noreturn-finish.c: New file. * gdb.base/noreturn-finish.exp: New file. include/ChangeLog * dwarf2.def (DW_AT_noreturn): New DWARF5 attribute. The dwarf2.h addition and the code to emit the new attribute is already in the gcc tree.
Diffstat (limited to 'gdb/stack.c')
-rw-r--r--gdb/stack.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/gdb/stack.c b/gdb/stack.c
index 0201d0a..5f2a3dc 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -2462,8 +2462,12 @@ return_command (char *retval_exp, int from_tty)
confirmed = query (_("%sMake selected stack frame return now? "),
query_prefix);
else
- confirmed = query (_("%sMake %s return now? "), query_prefix,
- SYMBOL_PRINT_NAME (thisfun));
+ {
+ if (TYPE_NO_RETURN (thisfun->type))
+ warning ("Function does not return normally to caller.");
+ confirmed = query (_("%sMake %s return now? "), query_prefix,
+ SYMBOL_PRINT_NAME (thisfun));
+ }
if (!confirmed)
error (_("Not confirmed"));
}