Use GCC5/DWARF5 DW_AT_noreturn to mark functions that don't return normally.
authorMark Wielaard <mjw@redhat.com>
Tue, 9 Dec 2014 10:45:41 +0000 (11:45 +0100)
committerMark Wielaard <mjw@redhat.com>
Fri, 23 Jan 2015 16:29:19 +0000 (17:29 +0100)
commit743649fd80776de922475362bf3ac8b44511bb24
treebb0e90750f05a5d2840cbfca16aab939b703b283
parent198297aafb4f7a9717be8370581b048ae9107c14
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.
12 files changed:
gdb/ChangeLog
gdb/dwarf2read.c
gdb/gdbtypes.h
gdb/infcmd.c
gdb/stack.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/noreturn-finish.c [new file with mode: 0644]
gdb/testsuite/gdb.base/noreturn-finish.exp [new file with mode: 0644]
gdb/testsuite/gdb.base/noreturn-return.c [new file with mode: 0644]
gdb/testsuite/gdb.base/noreturn-return.exp [new file with mode: 0644]
include/ChangeLog
include/dwarf2.def