diff options
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/annotate.c | 19 | ||||
-rw-r--r-- | gdb/annotate.h | 16 | ||||
-rw-r--r-- | gdb/source.c | 2 | ||||
-rw-r--r-- | gdb/stack.c | 23 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/annota1.exp | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/annota2.exp | 9 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/annota3.exp | 2 |
9 files changed, 73 insertions, 20 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0b38daf..31550d2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2020-05-22 Andrew Burgess <andrew.burgess@embecosm.com> + + * annotate.c (annotate_source_line): Update return type, add call + to update current symtab and line. + * annotate.h (annotate_source_line): Update return type, and + extend header comment. + * source.c (info_line_command): Check annotation_level before + calling annotate_source_line. + * stack.c (print_frame_info): If calling annotate_source_line + returns true, then don't print any other source line information. + 2020-05-21 Simon Marchi <simon.marchi@efficios.com> * lm32-tdep.c (lm32_register_reggroup_p): Fix condition. diff --git a/gdb/annotate.c b/gdb/annotate.c index 6daa0c5..0a4e2f2 100644 --- a/gdb/annotate.c +++ b/gdb/annotate.c @@ -435,7 +435,7 @@ annotate_source (const char *filename, int line, int character, int mid, /* See annotate.h. */ -void +bool annotate_source_line (struct symtab *s, int line, int mid_statement, CORE_ADDR pc) { @@ -443,16 +443,25 @@ annotate_source_line (struct symtab *s, int line, int mid_statement, { const std::vector<off_t> *offsets; if (!g_source_cache.get_line_charpos (s, &offsets)) - return; - - /* Don't index off the end of the line_charpos array. */ + return false; if (line > offsets->size ()) - return; + return false; annotate_source (s->fullname, line, (int) (*offsets)[line - 1], mid_statement, SYMTAB_OBJFILE (s)->arch (), pc); + + /* Update the current symtab and line. */ + symtab_and_line sal; + sal.pspace = SYMTAB_PSPACE (s); + sal.symtab = s; + sal.line = line; + set_current_source_symtab_and_line (sal); + + return true; } + + return false; } diff --git a/gdb/annotate.h b/gdb/annotate.h index b45d882..70c2f28 100644 --- a/gdb/annotate.h +++ b/gdb/annotate.h @@ -92,8 +92,20 @@ struct annotate_arg_emitter character position. MID_STATEMENT is nonzero if the PC is not at the beginning of that - line. */ -extern void annotate_source_line (struct symtab *s, int line, + line. + + The current symtab and line is updated to reflect S and LINE. + + Return true if the annotation was printed and the current symtab and + line were updated, otherwise return false, which can happen if the + source file for S can't be found, or LINE is out of range. + + This does leave GDB in the weird situation where, even when annotations + are on, we only sometimes print the annotation, and only sometimes + update the current symtab and line. However, this particular annotation + has behaved this way for some time, and front ends that still use + annotations now depend on this behaviour. */ +extern bool annotate_source_line (struct symtab *s, int line, int mid_statement, CORE_ADDR pc); extern void annotate_frame_begin (int, struct gdbarch *, CORE_ADDR); diff --git a/gdb/source.c b/gdb/source.c index b94c6af..0c2b5a4 100644 --- a/gdb/source.c +++ b/gdb/source.c @@ -1532,7 +1532,7 @@ info_line_command (const char *arg, int from_tty) /* If this is the only line, show the source code. If it could not find the file, don't do anything special. */ - if (sals.size () == 1) + if (annotation_level > 0 && sals.size () == 1) annotate_source_line (sal.symtab, sal.line, 0, start_pc); } else diff --git a/gdb/stack.c b/gdb/stack.c index d7e2120..265e764 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -1126,10 +1126,25 @@ print_frame_info (const frame_print_options &fp_opts, { int mid_statement = ((print_what == SRC_LINE) && frame_show_address (frame, sal)); - annotate_source_line (sal.symtab, sal.line, mid_statement, - get_frame_pc (frame)); - - if (deprecated_print_frame_info_listing_hook) + if (annotation_level > 0 + && annotate_source_line (sal.symtab, sal.line, mid_statement, + get_frame_pc (frame))) + { + /* The call to ANNOTATE_SOURCE_LINE already printed the + annotation for this source line, so we avoid the two cases + below and do not print the actual source line. The + documentation for annotations makes it clear that the source + line annotation is printed __instead__ of printing the source + line, not as well as. + + However, if we fail to print the source line, which usually + means either the source file is missing, or the requested + line is out of range of the file, then we don't print the + source annotation, and will pass through the "normal" print + source line code below, the expectation is that this code + will print an appropriate error. */ + } + else if (deprecated_print_frame_info_listing_hook) deprecated_print_frame_info_listing_hook (sal.symtab, sal.line, sal.line + 1, 0); else diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 050a793..2edec92 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2020-05-22 Andrew Burgess <andrew.burgess@embecosm.com> + + * gdb.base/annota1.exp: Update expected results. + * gdb.cp/annota2.exp: Update expected results, remove duplicate + test name. + * gdb.cp/annota3.exp: Update expected results. + 2020-05-20 Simon Marchi <simon.marchi@efficios.com> PR gdb/26016 diff --git a/gdb/testsuite/gdb.base/annota1.exp b/gdb/testsuite/gdb.base/annota1.exp index 829d144..2fdfd65 100644 --- a/gdb/testsuite/gdb.base/annota1.exp +++ b/gdb/testsuite/gdb.base/annota1.exp @@ -268,10 +268,10 @@ if [target_info exists gdb,nosignals] { unsupported "backtrace @ signal handler" } else { gdb_test_multiple "signal SIGUSR1" "send SIGUSR1" { - -re "\r\n\032\032post-prompt\r\nContinuing with signal SIGUSR1.\r\n\r\n\032\032starting\(\(\r\n\r\n\032\032frames-invalid\)|\(\r\n\r\n\032\032breakpoints-invalid\)\)+\r\n\r\n\032\032breakpoint 2\r\n\r\nBreakpoint 2, \r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nhandle_USR1\r\n\032\032frame-args\r\n \\(\r\n\032\032arg-begin\r\nsig\r\n\032\032arg-name-end\r\n=\r\n\032\032arg-value -\r\n$decimal\r\n\032\032arg-end\r\n\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n${escapedsrcfile}\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n.*\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source.*annota1.c:.*:.*:beg:$hex\r\n$decimal\[^\r\n\]+\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped\r\n$gdb_prompt$" { + -re "\r\n\032\032post-prompt\r\nContinuing with signal SIGUSR1.\r\n\r\n\032\032starting\(\(\r\n\r\n\032\032frames-invalid\)|\(\r\n\r\n\032\032breakpoints-invalid\)\)+\r\n\r\n\032\032breakpoint 2\r\n\r\nBreakpoint 2, \r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nhandle_USR1\r\n\032\032frame-args\r\n \\(\r\n\032\032arg-begin\r\nsig\r\n\032\032arg-name-end\r\n=\r\n\032\032arg-value -\r\n$decimal\r\n\032\032arg-end\r\n\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n${escapedsrcfile}\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n.*\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source.*annota1.c:.*:.*:beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped\r\n$gdb_prompt$" { pass $gdb_test_name } - -re "\r\n\032\032post-prompt\r\nContinuing with signal SIGUSR1.\r\n\r\n\032\032starting\(\(\r\n\r\n\032\032frames-invalid\)|\(\r\n\r\n\032\032breakpoints-invalid\)\)+\r\n\r\n\032\032breakpoint 2\r\n\r\nBreakpoint 2, \r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nhandle_USR1\r\n\032\032frame-args\r\n \\(\r\n\032\032arg-begin\r\nsig\r\n\032\032arg-name-end\r\n=\r\n\032\032arg-value -\r\n$decimal\r\n\032\032arg-end\r\n\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n.*${srcfile}\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n.*\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source.*annota1.c:.*:.*:beg:$hex\r\n$decimal\[^\r\n\]+\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped\r\n$gdb_prompt$" { + -re "\r\n\032\032post-prompt\r\nContinuing with signal SIGUSR1.\r\n\r\n\032\032starting\(\(\r\n\r\n\032\032frames-invalid\)|\(\r\n\r\n\032\032breakpoints-invalid\)\)+\r\n\r\n\032\032breakpoint 2\r\n\r\nBreakpoint 2, \r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nhandle_USR1\r\n\032\032frame-args\r\n \\(\r\n\032\032arg-begin\r\nsig\r\n\032\032arg-name-end\r\n=\r\n\032\032arg-value -\r\n$decimal\r\n\032\032arg-end\r\n\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n.*${srcfile}\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n.*\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source.*annota1.c:.*:.*:beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped\r\n$gdb_prompt$" { setup_xfail "*-*-*" 1270 fail $gdb_test_name } diff --git a/gdb/testsuite/gdb.cp/annota2.exp b/gdb/testsuite/gdb.cp/annota2.exp index 1b4f04b..2c36c58 100644 --- a/gdb/testsuite/gdb.cp/annota2.exp +++ b/gdb/testsuite/gdb.cp/annota2.exp @@ -73,9 +73,9 @@ gdb_expect { timeout { fail "annotation set at level 2 (timeout)" } } -gdb_test_multiple "run" "run until main breakpoint" { +gdb_test_multiple "run" "run until main breakpoint, first time" { -re "$main_line.*$gdb_prompt$" { - pass "run until main breakpoint" + pass $gdb_test_name } } @@ -189,9 +189,9 @@ set main_line 22 # run program up to breakpoint. # -gdb_test_multiple "run" "run until main breakpoint" { +gdb_test_multiple "run" "run until main breakpoint, second time" { -re "$main_line.*$gdb_prompt$" { - pass "run until main breakpoint" + pass $gdb_test_name } } @@ -243,7 +243,6 @@ set pat [multi_line "" \ "" \ "" \ "\032\032source .*$srcfile.*beg:$hex" \ - "$decimal\[^\r\n\]+" \ "" \ "\032\032frame-end" \ "" \ diff --git a/gdb/testsuite/gdb.cp/annota3.exp b/gdb/testsuite/gdb.cp/annota3.exp index 6580f46..62d5220 100644 --- a/gdb/testsuite/gdb.cp/annota3.exp +++ b/gdb/testsuite/gdb.cp/annota3.exp @@ -164,7 +164,7 @@ gdb_expect_list "set watch on a.x" "$gdb_prompt$" { # annotate-watchpoint # gdb_test_multiple "next" "watch triggered on a.x" { - -re "\r\n\032\032post-prompt\r\n\r\n\032\032starting\r\n\r\n\032\032watchpoint 3\r\n.*atchpoint 3: a.x\r\n\r\nOld value = 0\r\nNew value = 1\r\n\r\n(\032\032frame-begin 0 0x\[0-9a-z\]+\r\n|)main \\(\\) at .*$srcfile:$decimal\r\n\r\n\032\032source .*$srcfile.*beg:$hex\r\n$decimal\[^\r\n\]+\r\n\r\n\032\032stopped\r\n.*$gdb_prompt$" { + -re "\r\n\032\032post-prompt\r\n\r\n\032\032starting\r\n\r\n\032\032watchpoint 3\r\n.*atchpoint 3: a.x\r\n\r\nOld value = 0\r\nNew value = 1\r\n\r\n(\032\032frame-begin 0 0x\[0-9a-z\]+\r\n|)main \\(\\) at .*$srcfile:$decimal\r\n\r\n\032\032source .*$srcfile.*beg:$hex\r\n\r\n\032\032stopped\r\n.*$gdb_prompt$" { pass "watch triggered on a.x" } } |