summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog11
-rw-r--r--gdb/annotate.c19
-rw-r--r--gdb/annotate.h16
-rw-r--r--gdb/source.c2
-rw-r--r--gdb/stack.c23
-rw-r--r--gdb/testsuite/ChangeLog7
-rw-r--r--gdb/testsuite/gdb.base/annota1.exp4
-rw-r--r--gdb/testsuite/gdb.cp/annota2.exp9
-rw-r--r--gdb/testsuite/gdb.cp/annota3.exp2
9 files changed, 73 insertions, 20 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0b38daf3e3d..31550d23b14 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 6daa0c57017..0a4e2f27cac 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 b45d882dc0e..70c2f280507 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 b94c6af487d..0c2b5a4f83d 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 d7e21205411..265e764dc24 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 050a793ed05..2edec92f0d4 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 829d144cc20..2fdfd65ce86 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 1b4f04bb445..2c36c5854ed 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 6580f469e79..62d522083b6 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"
}
}