Avoid bad breakpoints with --gc-sections

We found a case where --gc-sections can cause gdb to set an invalid
breakpoint.  In the included test case, gdb will set a breakpoint with
two locations, one of which is 0x0.

The code in lnp_state_machine::check_line_address is intended to
filter out this sort of problem, but in this case, the entire CU is
empty, causing unrelocated_lowpc==0x0 -- which circumvents the check.

It seems to me that if a CU is empty like this, then it is ok to
simply ignore the line table, as there won't be any locations anyway.
This commit is contained in:
Tom Tromey
2022-01-13 09:48:18 -07:00
parent dd8a5a84a7
commit 6d263fe46e
5 changed files with 109 additions and 2 deletions

View File

@@ -10630,8 +10630,13 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
/* Decode line number information if present. We do this before /* Decode line number information if present. We do this before
processing child DIEs, so that the line header table is available processing child DIEs, so that the line header table is available
for DW_AT_decl_file. */ for DW_AT_decl_file. The PC check is here because, if LOWPC and
handle_DW_AT_stmt_list (die, cu, fnd, lowpc); HIGHPC are both 0x0, then there won't be any interesting code in
the CU, but a check later on (in
lnp_state_machine::check_line_address) will fail to properly
exclude an entry that was removed via --gc-sections. */
if (lowpc != highpc)
handle_DW_AT_stmt_list (die, cu, fnd, lowpc);
/* Process all dies in compilation unit. */ /* Process all dies in compilation unit. */
if (die->child != NULL) if (die->child != NULL)

View File

@@ -0,0 +1,41 @@
# Copyright 2022 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/>.
load_lib "ada.exp"
if { [skip_ada_tests] } { return -1 }
standard_ada_testfile caller
set options {
debug
optimize=-O2
additional_flags=-ffunction-sections
additional_flags=-largs
additional_flags=-Wl,--gc-sections
additional_flags=-margs
additional_flags=-gnatn
}
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable $options] != ""} {
return -1
}
clean_restart ${testfile}
set bp_location [gdb_get_line_number "BREAK" ${testdir}/callee.adb]
# The bug here was that gdb would set a breakpoint with two locations,
# one of them at 0x0.
gdb_test "break callee.adb:$bp_location" \
"Breakpoint $decimal at $hex: file .*callee.adb, line $bp_location."

View File

@@ -0,0 +1,23 @@
-- Copyright 2022 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/>.
with System;
procedure Callee is
Data : Integer;
for Data'Address use System'To_Address (16#4000_0000#);
begin
Data := 0; -- BREAK
end Callee;

View File

@@ -0,0 +1,17 @@
-- Copyright 2022 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/>.
procedure Callee;
pragma Inline (Callee);

View File

@@ -0,0 +1,21 @@
-- Copyright 2022 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/>.
with Callee;
procedure Caller is
begin
Callee;
end Caller;