[gdb/symtab] Fix data race in objstats->n_syms

Data race between:
...
  Read of size 4 at 0x7b4000006dc8 by main thread:
    #0 new_symbol gdb/dwarf2/read.c:20704 (gdb+0x866f3e)
    #1 process_die gdb/dwarf2/read.c:8674 (gdb+0x839fa8)
    #2 read_file_scope gdb/dwarf2/read.c:9610 (gdb+0x83ca7f)
    #3 process_die gdb/dwarf2/read.c:8614 (gdb+0x839e41)
    #4 process_full_comp_unit gdb/dwarf2/read.c:8383 (gdb+0x839480)
    #5 process_queue_item gdb/dwarf2/read.c:7592 (gdb+0x83599f)
...
and:
...
  Previous write of size 4 at 0x7b4000006dc8 by thread T2:
    #0 new_symbol gdb/dwarf2/read.c:20704 (gdb+0x866f5d)
    #1 process_die gdb/dwarf2/read.c:8674 (gdb+0x839fa8)
    #2 read_file_scope gdb/dwarf2/read.c:9610 (gdb+0x83ca7f)
    #3 process_die gdb/dwarf2/read.c:8614 (gdb+0x839e41)
    #4 process_full_comp_unit gdb/dwarf2/read.c:8383 (gdb+0x839480)
    #5 process_queue_item gdb/dwarf2/read.c:7592 (gdb+0x83599f)
...

Fix by making objstats->n_syms atomic.  Likewise for n_types.
This commit is contained in:
Tom de Vries
2022-07-15 16:56:56 +02:00
parent 3164537f25
commit 19947698de
2 changed files with 4 additions and 4 deletions

View File

@@ -167,13 +167,13 @@ struct entry_info
struct objstats
{
/* Number of full symbols read. */
int n_syms = 0;
std::atomic<int> n_syms {0};
/* Number of ".stabs" read (if applicable). */
int n_stabs = 0;
/* Number of types. */
int n_types = 0;
std::atomic<int> n_types {0};
/* Size of stringtable, (if applicable). */
int sz_strtab = 0;

View File

@@ -66,10 +66,10 @@ print_objfile_statistics (void)
objfile->per_bfd->n_minsyms);
if (OBJSTAT (objfile, n_syms) > 0)
gdb_printf (_(" Number of \"full\" symbols read: %d\n"),
OBJSTAT (objfile, n_syms));
OBJSTAT (objfile, n_syms).load ());
if (OBJSTAT (objfile, n_types) > 0)
gdb_printf (_(" Number of \"types\" defined: %d\n"),
OBJSTAT (objfile, n_types));
OBJSTAT (objfile, n_types).load ());
i = linetables = 0;
for (compunit_symtab *cu : objfile->compunits ())