+2019-07-09 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * linespec.c (decode_digits_list_mode): Set explicit_line to a
+ bool value.
+ (decode_digits_ordinary): Set explicit_line field in sal.
+ * symtab.c (skip_prologue_sal): Don't skip prologue for a
+ symtab_and_line that was set on an explicit line number in
+ assembler code. Do always update the recorded symtab and line if
+ we do skip the prologue.
+
2019-07-09 Andrew Burgess <andrew.burgess@embecosm.com>
* breakpoint.c (set_breakpoint_location_function): Remove
val.symtab = elt;
val.pspace = SYMTAB_PSPACE (elt);
val.pc = 0;
- val.explicit_line = 1;
+ val.explicit_line = true;
add_sal_to_sals (self, &values, &val, NULL, 0);
}
sal.pspace = SYMTAB_PSPACE (elt);
sal.symtab = elt;
sal.line = line;
+ sal.explicit_line = true;
sal.pc = pc;
sals.push_back (std::move (sal));
}
/* Adjust SAL to the first instruction past the function prologue.
If the PC was explicitly specified, the SAL is not changed.
- If the line number was explicitly specified, at most the SAL's PC
- is updated. If SAL is already past the prologue, then do nothing. */
+ If the line number was explicitly specified then the SAL can still be
+ updated, unless the language for SAL is assembler, in which case the SAL
+ will be left unchanged.
+ If SAL is already past the prologue, then do nothing. */
void
skip_prologue_sal (struct symtab_and_line *sal)
if (sal->explicit_pc)
return;
+ /* In assembly code, if the user asks for a specific line then we should
+ not adjust the SAL. The user already has instruction level
+ visibility in this case, so selecting a line other than one requested
+ is likely to be the wrong choice. */
+ if (sal->symtab != nullptr
+ && sal->explicit_line
+ && SYMTAB_LANGUAGE (sal->symtab) == language_asm)
+ return;
+
scoped_restore_current_pspace_and_thread restore_pspace_thread;
switch_to_program_space_and_thread (sal->pspace);
sal->pc = pc;
sal->section = section;
-
- /* Unless the explicit_line flag was set, update the SAL line
- and symtab to correspond to the modified PC location. */
- if (sal->explicit_line)
- return;
-
sal->symtab = start_sal.symtab;
sal->line = start_sal.line;
sal->end = start_sal.end;
+2019-07-09 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.arch/amd64-break-on-asm-line.S: New file.
+ * gdb.arch/amd64-break-on-asm-line.exp: New file.
+
2019-07-08 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* gdb.base/printcmds.exp: Test printing C string and
--- /dev/null
+/* Copyright 2019 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ This file is part of the gdb testsuite.
+
+ Test that a breakpoint placed by line number in an assembler file
+ will stop at the specified line. Previously versions of GDB have
+ incorrectly invoked the prologue analysis logic and skipped
+ forward. */
+
+ .text
+ .global main
+main:
+ nop
+test:
+ /* The next two instructions are required to look like an
+ x86-64 prologue so that GDB's prologue scanner will spot
+ them and skip forward. */
+ push %rbp /* Break here. */
+ mov %rsp, %rbp
+ nop /* Incorrect. */
+ nop
+ nop
--- /dev/null
+# Copyright 2019 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+if { ![istarget x86_64-*-* ] || ![is_lp64_target] } {
+ return
+}
+
+standard_testfile .S
+
+if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \
+ { debug }] } {
+ untested "could not compile"
+ return -1
+}
+
+if ![runto_main] {
+ untested "could not run to main"
+ return -1
+}
+
+gdb_breakpoint [gdb_get_line_number "Break here"]
+gdb_continue_to_breakpoint "Break on specified line" \
+ ".*/\\* Break here\\. \\*/.*"