[PATCH 2/5] [gdb/symtab] Fix data race on per_cu->dwarf_version

Tom de Vries tdevries@suse.de
Sat Jul 2 11:07:09 GMT 2022


On 7/1/22 13:16, Tom de Vries via Gdb-patches wrote:
> On 6/29/22 17:29, Tom de Vries via Gdb-patches wrote:
>> When building gdb with -fsanitize=thread and gcc 12, and running 
>> test-case
>> gdb.dwarf2/dwz.exp, we run into a data race between thread T2 and the 
>> main
>> thread in the same write:
>> ...
>> Write of size 1 at 0x7b200000300c:^M
>>      #0 cutu_reader::cutu_reader(dwarf2_per_cu_data*, 
>> dwarf2_per_objfile*, \
>>      abbrev_table*, dwarf2_cu*, bool, abbrev_cache*) 
>> gdb/dwarf2/read.c:6252 \
>>      (gdb+0x82f3b3)^M
>> ...
>> which is here:
>> ...
>>           this_cu->dwarf_version = cu->header.version;
>> ...
>>
>> Both writes are called from the parallel for in 
>> dwarf2_build_psymtabs_hard,
>> this one directly:
>> ...
>>      #1 process_psymtab_comp_unit gdb/dwarf2/read.c:6774 (gdb+0x8304d7)^M
>>      #2 operator() gdb/dwarf2/read.c:7098 (gdb+0x8317be)^M
>>      #3 operator() gdbsupport/parallel-for.h:163 (gdb+0x872380)^M
>> ...
>> and this via the PU import:
>> ...
>>      #1 cooked_indexer::ensure_cu_exists(cutu_reader*, 
>> dwarf2_per_objfile*, \
>>      sect_offset, bool,  bool) gdb/dwarf2/read.c:17964 (gdb+0x85c43b)^M
>>      #2 cooked_indexer::index_imported_unit(cutu_reader*, unsigned 
>> char const*, \
>>      abbrev_info const*) gdb/dwarf2/read.c:18248 (gdb+0x85d8ff)^M
>>      #3 cooked_indexer::index_dies(cutu_reader*, unsigned char const*, \
>>      cooked_index_entry const*, bool) gdb/dwarf2/read.c:18302 
>> (gdb+0x85dcdb)^M
>>      #4 cooked_indexer::make_index(cutu_reader*) 
>> gdb/dwarf2/read.c:18443 \
>>      (gdb+0x85e68a)^M
>>      #5 process_psymtab_comp_unit gdb/dwarf2/read.c:6812 (gdb+0x830879)^M
>>      #6 operator() gdb/dwarf2/read.c:7098 (gdb+0x8317be)^M
>>      #7 operator() gdbsupport/parallel-for.h:171 (gdb+0x8723e2)^M
>> ...
>>
>> Fix this by setting the field earlier, in read_comp_units_from_section.
>>
>> The write in cutu_reader::cutu_reader() is still needed, in case
>> read_comp_units_from_section is not used.
>>
>> Make the write conditional, such that it doesn't trigger if the field is
>> already set by read_comp_units_from_section.
>>
> 
> I realized there's a similar write in the this_cu->is_debug_types == 
> true clause in cutu_reader::cutu_reader(), which I missed.  So I 
> introduced a member function set_version to make sure it's set in a 
> consistent way.
> 

This is what I ended up committing.

Further changes:
- add assert in set_version
- rename field to m_dwarf_version.

Thanks,
- Tom


-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-gdb-symtab-Fix-data-race-on-per_cu-dwarf_version.patch
Type: text/x-patch
Size: 5484 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/gdb-patches/attachments/20220702/ccc7259a/attachment-0001.bin>


More information about the Gdb-patches mailing list