diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 152711be94..faf7b10b2f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-06-15 Simon Marchi + + * dwarf2/read.c (dwarf2_initialize_objfile): Check for presence + of partial symtabs. + 2020-06-17 Simon Marchi * regformats/reg-arm.dat: Remove. diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 34915be8da..4dc9ad6c99 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -6027,6 +6027,14 @@ dwarf2_initialize_objfile (struct objfile *objfile, dw_index_kind *index_kind) return true; } + /* There might already be partial symtabs built for this BFD. This happens + when loading the same binary twice with the index-cache enabled. If so, + don't try to read an index. The objfile / per_objfile initialization will + be completed in dwarf2_build_psymtabs, in the standard partial symtabs + code path. */ + if (per_bfd->partial_symtabs != nullptr) + return false; + if (dwarf2_read_debug_names (per_objfile)) { *index_kind = dw_index_kind::DEBUG_NAMES; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 19cb2f1d7c..5d7671915a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-06-15 Simon Marchi + + * gdb.base/index-cache-load-twice.c: New. + * gdb.base/index-cache-load-twice.exp: New. + 2020-06-17 Keith Seitz * gdb.deuginfod/fetch_src_and_symbols.exp: Pass INTERNAL_GDBFLAGS diff --git a/gdb/testsuite/gdb.base/index-cache-load-twice.c b/gdb/testsuite/gdb.base/index-cache-load-twice.c new file mode 100644 index 0000000000..9d7b2f1a4c --- /dev/null +++ b/gdb/testsuite/gdb.base/index-cache-load-twice.c @@ -0,0 +1,22 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2020 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 . */ + +int +main (void) +{ + return 0; +} diff --git a/gdb/testsuite/gdb.base/index-cache-load-twice.exp b/gdb/testsuite/gdb.base/index-cache-load-twice.exp new file mode 100644 index 0000000000..5646062699 --- /dev/null +++ b/gdb/testsuite/gdb.base/index-cache-load-twice.exp @@ -0,0 +1,42 @@ +# Copyright 2020 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 . + +# This test checks that loading a file twice with the index cache enabled does +# not crash. + +standard_testfile + +lassign [remote_exec host mktemp -d] ret cache_dir + +# The output of mktemp contains an end of line, remove it. +set cache_dir [string trimright $cache_dir \r\n] + +if { $ret != 0 } { + fail "couldn't create temporary cache dir" + return +} + +save_vars { GDBFLAGS } { + set GDBFLAGS "$GDBFLAGS -iex \"set index-cache directory $cache_dir\"" + set GDBFLAGS "$GDBFLAGS -iex \"set index-cache on\"" + + if { [prepare_for_testing "failed to prepare" $testfile $srcfile \ + {debug additional_flags=-Wl,--build-id}] } { + return + } + + # This file command would generate an internal error. + gdb_file_cmd [standard_output_file $testfile] +}