public inbox for gdb-prs@sourceware.org
help / color / mirror / Atom feed
* [Bug symtab/30718] New: [gdb/symtab] More index-cache data races
@ 2023-08-04  0:21 vries at gcc dot gnu.org
  2023-08-04  0:26 ` [Bug symtab/30718] " vries at gcc dot gnu.org
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: vries at gcc dot gnu.org @ 2023-08-04  0:21 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=30718

            Bug ID: 30718
           Summary: [gdb/symtab] More index-cache data races
           Product: gdb
           Version: HEAD
            Status: NEW
          Severity: normal
          Priority: P2
         Component: symtab
          Assignee: unassigned at sourceware dot org
          Reporter: vries at gcc dot gnu.org
  Target Milestone: ---

With this (
https://sourceware.org/pipermail/gdb-patches/2023-August/201335.html ) patch
series applied, I still run into data races with the index-cache.

Consider:
...
$ cat ~/data/hello.c
#include <stdio.h>

int
main (void)
{
  printf ("hello\n");
  return 0;
}
...

Reproducer:
...
$ rm -f ~/.cache/gdb/* ; TSAN_OPTIONS=history_size=7 gdb -q -batch -iex "set
index-cache enabled on" ./a.out -ex "print foo"
==================
WARNING: ThreadSanitizer: data race (pid=21912)
  Write of size 1 at 0x7b200000410d by main thread:
    #0 dw_expand_symtabs_matching_file_matcher(dwarf2_per_objfile*,
gdb::function_view<bool (char const*, bool)>)
/data/vries/gdb/src/gdb/dwarf2/read.c:3077 (gdb+0x88b365)
    #1 cooked_index_functions::expand_symtabs_matching(objfile*,
gdb::function_view<bool (char const*, bool)>, lookup_name_info const*,
gdb::function_view<bool (char const*)>, gdb::function_view<bool
(compunit_symtab*)>, enum_flags<block_search_flag_values>, domain_enum,
search_domain) /data/vries/gdb/src/gdb/dwarf2/read.c:16812 (gdb+0x8c1c27)
    #2 objfile::map_symtabs_matching_filename(char const*, char const*,
gdb::function_view<bool (symtab*)>) /data/vries/gdb/src/gdb/symfile-debug.c:219
(gdb+0xf38b11)
    #3 iterate_over_symtabs(char const*, gdb::function_view<bool (symtab*)>)
/data/vries/gdb/src/gdb/symtab.c:648 (gdb+0xf60869)
    #4 lookup_symtab(char const*) /data/vries/gdb/src/gdb/symtab.c:662
(gdb+0xf6099a)
    #5 classify_name /data/vries/gdb/src/gdb/c-exp.y:3083 (gdb+0x68781d)
    #6 c_yylex /data/vries/gdb/src/gdb/c-exp.y:3251 (gdb+0x688000)
    #7 c_yyparse() /data/vries/gdb/leap-15-4/build/gdb/c-exp.c.tmp:1988
(gdb+0x67b4a8)
    #8 c_parse(parser_state*) /data/vries/gdb/src/gdb/c-exp.y:3417
(gdb+0x68910c)
    #9 language_defn::parser(parser_state*) const
/data/vries/gdb/src/gdb/language.c:598 (gdb+0xab90be)
    #10 parse_exp_in_context /data/vries/gdb/src/gdb/parse.c:414 (gdb+0xc66f13)
    #11 parse_expression(char const*, innermost_block_tracker*,
enum_flags<parser_flag>) /data/vries/gdb/src/gdb/parse.c:462 (gdb+0xc671e8)
    #12 process_print_command_args /data/vries/gdb/src/gdb/printcmd.c:1321
(gdb+0xca34dc)
    #13 print_command_1 /data/vries/gdb/src/gdb/printcmd.c:1335 (gdb+0xca35b9)
    #14 print_command /data/vries/gdb/src/gdb/printcmd.c:1468 (gdb+0xca3b0a)
    #15 do_simple_func /data/vries/gdb/src/gdb/cli/cli-decode.c:95
(gdb+0x6d949c)
    #16 cmd_func(cmd_list_element*, char const*, int)
/data/vries/gdb/src/gdb/cli/cli-decode.c:2735 (gdb+0x6e0edd)
    #17 execute_command(char const*, int) /data/vries/gdb/src/gdb/top.c:575
(gdb+0xff380e)
    #18 catch_command_errors /data/vries/gdb/src/gdb/main.c:518 (gdb+0xb5ae43)
    #19 execute_cmdargs /data/vries/gdb/src/gdb/main.c:617 (gdb+0xb5b130)
    #20 captured_main_1 /data/vries/gdb/src/gdb/main.c:1289 (gdb+0xb5cc25)
    #21 captured_main /data/vries/gdb/src/gdb/main.c:1310 (gdb+0xb5ce68)
    #22 gdb_main(captured_main_args*) /data/vries/gdb/src/gdb/main.c:1339
(gdb+0xb5cf1c)
    #23 main /data/vries/gdb/src/gdb/gdb.c:39 (gdb+0x4167ab)

  Previous read of size 1 at 0x7b200000410d by thread T11:
    #0 write_gdbindex /data/vries/gdb/src/gdb/dwarf2/index-write.c:1214
(gdb+0x831548)
    #1 write_dwarf_index(dwarf2_per_bfd*, char const*, char const*, char
const*, dw_index_kind) /data/vries/gdb/src/gdb/dwarf2/index-write.c:1469
(gdb+0x8327af)
    #2 index_cache::store(dwarf2_per_bfd*, index_cache_store_context const&)
/data/vries/gdb/src/gdb/dwarf2/index-cache.c:173 (gdb+0x82daa9)
    #3 cooked_index::maybe_write_index(dwarf2_per_bfd*,
index_cache_store_context const&)
/data/vries/gdb/src/gdb/dwarf2/cooked-index.c:642 (gdb+0x7f1ca5)
    #4 operator() /data/vries/gdb/src/gdb/dwarf2/cooked-index.c:471
(gdb+0x7f0ea5)
    #5 _M_invoke /usr/include/c++/7/bits/std_function.h:316 (gdb+0x7f296f)
    #6 std::function<void ()>::operator()() const
/usr/include/c++/7/bits/std_function.h:706 (gdb+0x7008c6)
    #7 void std::__invoke_impl<void, std::function<void
()>&>(std::__invoke_other, std::function<void ()>&)
/usr/include/c++/7/bits/invoke.h:60 (gdb+0x738114)
    #8 std::__invoke_result<std::function<void ()>&>::type
std::__invoke<std::function<void ()>&>(std::function<void ()>&)
/usr/include/c++/7/bits/invoke.h:95 (gdb+0x737e05)
    #9 std::__future_base::_Task_state<std::function<void ()>,
std::allocator<int>, void ()>::_M_run()::{lambda()#1}::operator()() const
/usr/include/c++/7/future:1421 (gdb+0x737acd)
    #10
std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>,
std::__future_base::_Result_base::_Deleter>,
std::__future_base::_Task_state<std::function<void ()>, std::allocator<int>,
void ()>::_M_run()::{lambda()#1}, void>::operator()() const
/usr/include/c++/7/future:1362 (gdb+0x7385d4)
    #11
std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> (),
std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>,
std::__future_base::_Result_base::_Deleter>,
std::__future_base::_Task_state<std::function<void ()>, std::allocator<int>,
void ()>::_M_run()::{lambda()#1}, void> >::_M_invoke(std::_Any_data const&)
/usr/include/c++/7/bits/std_function.h:302 (gdb+0x7381d0)
    #12 std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>::operator()() const
/usr/include/c++/7/bits/std_function.h:706 (gdb+0x733597)
    #13
std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*)
/usr/include/c++/7/future:561 (gdb+0x732b53)
    #14 void std::__invoke_impl<void, void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*,
bool*>(std::__invoke_memfun_deref, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)
/usr/include/c++/7/bits/invoke.h:73 (gdb+0x734bc3)
    #15 std::__invoke_result<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type
std::__invoke<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)
/usr/include/c++/7/bits/invoke.h:95 (gdb+0x733b39)
    #16 std::call_once<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&,
bool*&&)::{lambda()#1}::operator()() const /usr/include/c++/7/mutex:672
(gdb+0x732f81)
    #17 std::call_once<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&,
bool*&&)::{lambda()#2}::operator()() const /usr/include/c++/7/mutex:677
(gdb+0x733026)
    #18 std::call_once<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&,
bool*&&)::{lambda()#2}::_FUN() /usr/include/c++/7/mutex:677 (gdb+0x733066)
    #19 pthread_once <null> (libtsan.so.0+0x4457c)
    #20 __gthread_once
/usr/include/c++/7/x86_64-suse-linux/bits/gthr-default.h:699 (gdb+0x72f551)
    #21 void std::call_once<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)
/usr/include/c++/7/mutex:684 (gdb+0x733198)
    #22
std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>, bool)
/usr/include/c++/7/future:401 (gdb+0x7327c6)
    #23 std::__future_base::_Task_state<std::function<void ()>,
std::allocator<int>, void ()>::_M_run() /usr/include/c++/7/future:1423
(gdb+0x737b63)
    #24 std::packaged_task<void ()>::operator()()
/usr/include/c++/7/future:1556 (gdb+0x1dad270)
    #25 gdb::thread_pool::thread_function()
/data/vries/gdb/src/gdbsupport/thread-pool.cc:242 (gdb+0x1dacb92)
    #26 void std::__invoke_impl<void, void (gdb::thread_pool::*)(),
gdb::thread_pool*>(std::__invoke_memfun_deref, void (gdb::thread_pool::*&&)(),
gdb::thread_pool*&&) /usr/include/c++/7/bits/invoke.h:73 (gdb+0x1dadc41)
    #27 std::__invoke_result<void (gdb::thread_pool::*)(),
gdb::thread_pool*>::type std::__invoke<void (gdb::thread_pool::*)(),
gdb::thread_pool*>(void (gdb::thread_pool::*&&)(), gdb::thread_pool*&&)
/usr/include/c++/7/bits/invoke.h:95 (gdb+0x1dad072)
    #28 decltype (__invoke((_S_declval<0ul>)(), (_S_declval<1ul>)()))
std::thread::_Invoker<std::tuple<void (gdb::thread_pool::*)(),
gdb::thread_pool*> >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>)
/usr/include/c++/7/thread:234 (gdb+0x1db03a4)
    #29 std::thread::_Invoker<std::tuple<void (gdb::thread_pool::*)(),
gdb::thread_pool*> >::operator()() /usr/include/c++/7/thread:243
(gdb+0x1db032f)
    #30 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void
(gdb::thread_pool::*)(), gdb::thread_pool*> > >::_M_run()
/usr/include/c++/7/thread:186 (gdb+0x1db02e4)
    #31 <null> <null> (libstdc++.so.6+0xdcac2)

  Location is heap block of size 120 at 0x7b2000004100 allocated by main
thread:
    #0 operator new(unsigned long) <null> (libtsan.so.0+0x8c57c)
    #1 dwarf2_per_bfd::allocate_per_cu()
/data/vries/gdb/src/gdb/dwarf2/read.c:1804 (gdb+0x8862bc)
    #2 read_comp_units_from_section /data/vries/gdb/src/gdb/dwarf2/read.c:5232
(gdb+0x892ab9)
    #3 create_all_units /data/vries/gdb/src/gdb/dwarf2/read.c:5289
(gdb+0x893025)
    #4 dwarf2_build_psymtabs_hard /data/vries/gdb/src/gdb/dwarf2/read.c:5102
(gdb+0x89230b)
    #5 dwarf2_build_psymtabs /data/vries/gdb/src/gdb/dwarf2/read.c:3461
(gdb+0x88c9cf)
    #6 cooked_index_functions::read_partial_symbols(objfile*)
/data/vries/gdb/src/gdb/dwarf2/read.c:16715 (gdb+0x8e7378)
    #7 objfile::require_partial_symbols(bool)
/data/vries/gdb/src/gdb/symfile-debug.c:553 (gdb+0xf3a6cd)
    #8 read_symbols /data/vries/gdb/src/gdb/symfile.c:794 (gdb+0xf40002)
    #9 syms_from_objfile_1 /data/vries/gdb/src/gdb/symfile.c:966 (gdb+0xf40801)
    #10 syms_from_objfile /data/vries/gdb/src/gdb/symfile.c:983 (gdb+0xf408f2)
    #11 symbol_file_add_with_addrs /data/vries/gdb/src/gdb/symfile.c:1086
(gdb+0xf40f2d)
    #12 symbol_file_add_from_bfd(gdb::ref_ptr<bfd, gdb_bfd_ref_policy> const&,
char const*, enum_flags<symfile_add_flag>, std::vector<other_sections,
std::allocator<other_sections> >*, enum_flags<objfile_flag>, objfile*)
/data/vries/gdb/src/gdb/symfile.c:1167 (gdb+0xf414a7)
    #13 symbol_file_add(char const*, enum_flags<symfile_add_flag>,
std::vector<other_sections, std::allocator<other_sections> >*,
enum_flags<objfile_flag>) /data/vries/gdb/src/gdb/symfile.c:1180 (gdb+0xf41527)
    #14 symbol_file_add_main_1 /data/vries/gdb/src/gdb/symfile.c:1203
(gdb+0xf41633)
    #15 symbol_file_add_main(char const*, enum_flags<symfile_add_flag>)
/data/vries/gdb/src/gdb/symfile.c:1194 (gdb+0xf415af)
    #16 symbol_file_add_main_adapter /data/vries/gdb/src/gdb/main.c:549
(gdb+0xb5af44)
    #17 catch_command_errors /data/vries/gdb/src/gdb/main.c:518 (gdb+0xb5ae43)
    #18 captured_main_1 /data/vries/gdb/src/gdb/main.c:1203 (gdb+0xb5c6bb)
    #19 captured_main /data/vries/gdb/src/gdb/main.c:1310 (gdb+0xb5ce68)
    #20 gdb_main(captured_main_args*) /data/vries/gdb/src/gdb/main.c:1339
(gdb+0xb5cf1c)
    #21 main /data/vries/gdb/src/gdb/gdb.c:39 (gdb+0x4167ab)

  Thread T11 'gdb worker' (tid=21926, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x5ed75)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State,
std::default_delete<std::thread::_State> >, void (*)()) <null>
(libstdc++.so.6+0xdce3b)
    #2 gdb::thread_pool::set_thread_count(unsigned long)
/data/vries/gdb/src/gdbsupport/thread-pool.cc:168 (gdb+0x1dac81b)
    #3 update_thread_pool_size /data/vries/gdb/src/gdb/maint.c:857
(gdb+0xb68dc6)
    #4 _initialize_maint_cmds() /data/vries/gdb/src/gdb/maint.c:1478
(gdb+0xb6a845)
    #5 initialize_all_files() /data/vries/gdb/leap-15-4/build/gdb/init.c:728
(gdb+0x11866a6)
    #6 gdb_init() /data/vries/gdb/src/gdb/top.c:2313 (gdb+0xff83b8)
    #7 captured_main_1 /data/vries/gdb/src/gdb/main.c:1032 (gdb+0xb5bd82)
    #8 captured_main /data/vries/gdb/src/gdb/main.c:1310 (gdb+0xb5ce68)
    #9 gdb_main(captured_main_args*) /data/vries/gdb/src/gdb/main.c:1339
(gdb+0xb5cf1c)
    #10 main /data/vries/gdb/src/gdb/gdb.c:39 (gdb+0x4167ab)

SUMMARY: ThreadSanitizer: data race /data/vries/gdb/src/gdb/dwarf2/read.c:3077
in dw_expand_symtabs_matching_file_matcher(dwarf2_per_objfile*,
gdb::function_view<bool (char const*, bool)>)
==================
No symbol "foo" in current context.
ThreadSanitizer: reported 1 warnings
...

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug symtab/30718] [gdb/symtab] More index-cache data races
  2023-08-04  0:21 [Bug symtab/30718] New: [gdb/symtab] More index-cache data races vries at gcc dot gnu.org
@ 2023-08-04  0:26 ` vries at gcc dot gnu.org
  2023-08-04  0:27 ` vries at gcc dot gnu.org
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: vries at gcc dot gnu.org @ 2023-08-04  0:26 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=30718

--- Comment #1 from Tom de Vries <vries at gcc dot gnu.org> ---
Fixed by the usual:
...
diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h
index 5f7d2dcd895..9dfc435e861 100644
--- a/gdb/dwarf2/read.h
+++ b/gdb/dwarf2/read.h
@@ -104,10 +104,10 @@ struct dwarf2_per_cu_data
       is_dwz (false),
       reading_dwo_directly (false),
       tu_read (false),
-      mark (false),
-      files_read (false),
       queued (false),
       m_header_read_in (false),
+      mark (false),
+      files_read (false),
       scanned (false)
   {
   }
@@ -150,14 +150,6 @@ struct dwarf2_per_cu_data
      This flag is only valid if is_debug_types is true.  */
   unsigned int tu_read : 1;

-  /* A temporary mark bit used when iterating over all CUs in
-     expand_symtabs_matching.  */
-  unsigned int mark : 1;
-
-  /* True if we've tried to read the file table.  There will be no
-     point in trying to read it again next time.  */
-  bool files_read : 1;
-
   /* Wrap the following in struct packed instead of bitfields to avoid
      data races when the bitfields end up on the same memory location
      (per C++ memory model).  */
@@ -176,6 +168,14 @@ struct dwarf2_per_cu_data
      it private at the moment.  */
   mutable packed<bool, 1> m_header_read_in;

+  /* A temporary mark bit used when iterating over all CUs in
+     expand_symtabs_matching.  */
+  packed<unsigned int, 1> mark;
+
+  /* True if we've tried to read the file table.  There will be no
+     point in trying to read it again next time.  */
+  packed<bool, 1> files_read;
+
 private:
   /* The unit type of this CU.  */
   std::atomic<packed<dwarf_unit_type, 1>> m_unit_type {(dwarf_unit_type)0};
...

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug symtab/30718] [gdb/symtab] More index-cache data races
  2023-08-04  0:21 [Bug symtab/30718] New: [gdb/symtab] More index-cache data races vries at gcc dot gnu.org
  2023-08-04  0:26 ` [Bug symtab/30718] " vries at gcc dot gnu.org
@ 2023-08-04  0:27 ` vries at gcc dot gnu.org
  2023-08-04 13:06 ` cvs-commit at gcc dot gnu.org
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: vries at gcc dot gnu.org @ 2023-08-04  0:27 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=30718

--- Comment #2 from Tom de Vries <vries at gcc dot gnu.org> ---
I tried to trigger this using the gdb.base/index-cache.exp test-case, but
didn't manage sofar.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug symtab/30718] [gdb/symtab] More index-cache data races
  2023-08-04  0:21 [Bug symtab/30718] New: [gdb/symtab] More index-cache data races vries at gcc dot gnu.org
  2023-08-04  0:26 ` [Bug symtab/30718] " vries at gcc dot gnu.org
  2023-08-04  0:27 ` vries at gcc dot gnu.org
@ 2023-08-04 13:06 ` cvs-commit at gcc dot gnu.org
  2023-08-04 13:06 ` cvs-commit at gcc dot gnu.org
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2023-08-04 13:06 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=30718

--- Comment #3 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Tom de Vries <vries@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=38ef7c3513f6a4241b2bac61fd18d61c99564e04

commit 38ef7c3513f6a4241b2bac61fd18d61c99564e04
Author: Tom de Vries <tdevries@suse.de>
Date:   Fri Aug 4 15:05:57 2023 +0200

    [gdb/symtab] Fix data race on dwarf2_per_cu_data::{mark,is_debug_types}

    With gdb build with -fsanitize=thread, and the exec from test-case
    gdb.base/index-cache.exp, I run into:
    ...
    $ rm -f ~/.cache/gdb/*; \
      gdb -q -batch -iex "set index-cache enabled on" index-cache \
        -ex "print foobar"
      ...
    WARNING: ThreadSanitizer: data race (pid=23970)
      Write of size 1 at 0x7b200000410d by main thread:
        #0 dw_expand_symtabs_matching_file_matcher(dwarf2_per_objfile*,
gdb::function_view<bool (char const*, bool)>) gdb/dwarf2/read.c:3077
(gdb+0x7ac54e)
        #1 cooked_index_functions::expand_symtabs_matching(objfile*,
gdb::function_view<bool (char const*, bool)>, lookup_name_info const*,
gdb::function_view<bool (char const*)>, gdb::function_view<bool
(compunit_symtab*)>, enum_flags<block_search_flag_values>, domain_enum,
search_domain) gdb/dwarf2/read.c:16812 (gdb+0x7d039f)
        #2 objfile::map_symtabs_matching_filename(char const*, char const*,
gdb::function_view<bool (symtab*)>) gdb/symfile-debug.c:219 (gdb+0xda5aee)
        #3 iterate_over_symtabs(char const*, gdb::function_view<bool
(symtab*)>) gdb/symtab.c:648 (gdb+0xdc439d)
        #4 lookup_symtab(char const*) gdb/symtab.c:662 (gdb+0xdc44a2)
        #5 classify_name gdb/c-exp.y:3083 (gdb+0x61afec)
        #6 c_yylex gdb/c-exp.y:3251 (gdb+0x61dd13)
        #7 c_yyparse() build/gdb/c-exp.c.tmp:1988 (gdb+0x61f07e)
        #8 c_parse(parser_state*) gdb/c-exp.y:3417 (gdb+0x62d864)
        #9 language_defn::parser(parser_state*) const gdb/language.c:598
(gdb+0x9771c5)
        #10 parse_exp_in_context gdb/parse.c:414 (gdb+0xb10a9b)
        #11 parse_expression(char const*, innermost_block_tracker*,
enum_flags<parser_flag>) gdb/parse.c:462 (gdb+0xb110ae)
        #12 process_print_command_args gdb/printcmd.c:1321 (gdb+0xb4bf0c)
        #13 print_command_1 gdb/printcmd.c:1335 (gdb+0xb4ca2a)
        #14 print_command gdb/printcmd.c:1468 (gdb+0xb4cd5a)
        #15 do_simple_func gdb/cli/cli-decode.c:95 (gdb+0x65b078)
        #16 cmd_func(cmd_list_element*, char const*, int)
gdb/cli/cli-decode.c:2735 (gdb+0x65ed53)
        #17 execute_command(char const*, int) gdb/top.c:575 (gdb+0xe3a76a)
        #18 catch_command_errors gdb/main.c:518 (gdb+0xa1837d)
        #19 execute_cmdargs gdb/main.c:617 (gdb+0xa1853f)
        #20 captured_main_1 gdb/main.c:1289 (gdb+0xa1aa58)
        #21 captured_main gdb/main.c:1310 (gdb+0xa1b95a)
        #22 gdb_main(captured_main_args*) gdb/main.c:1339 (gdb+0xa1b95a)
        #23 main gdb/gdb.c:39 (gdb+0x42506a)

      Previous read of size 1 at 0x7b200000410d by thread T1:
        #0 write_gdbindex gdb/dwarf2/index-write.c:1214 (gdb+0x75bb30)
        #1 write_dwarf_index(dwarf2_per_bfd*, char const*, char const*, char
const*, dw_index_kind) gdb/dwarf2/index-write.c:1469 (gdb+0x75f803)
        #2 index_cache::store(dwarf2_per_bfd*, index_cache_store_context
const&) gdb/dwarf2/index-cache.c:173 (gdb+0x755a36)
        #3 cooked_index::maybe_write_index(dwarf2_per_bfd*,
index_cache_store_context const&) gdb/dwarf2/cooked-index.c:642 (gdb+0x71c96d)
        #4 operator() gdb/dwarf2/cooked-index.c:471 (gdb+0x71c96d)
        #5 _M_invoke /usr/include/c++/7/bits/std_function.h:316 (gdb+0x71c96d)
        #6 std::function<void ()>::operator()() const
/usr/include/c++/7/bits/std_function.h:706 (gdb+0x72a57c)
        #7 void std::__invoke_impl<void, std::function<void
()>&>(std::__invoke_other, std::function<void ()>&)
/usr/include/c++/7/bits/invoke.h:60 (gdb+0x72a5db)
        #8 std::__invoke_result<std::function<void ()>&>::type
std::__invoke<std::function<void ()>&>(std::function<void ()>&)
/usr/include/c++/7/bits/invoke.h:95 (gdb+0x72a5db)
        #9 std::__future_base::_Task_state<std::function<void ()>,
std::allocator<int>, void ()>::_M_run()::{lambda()#1}::operator()() const
/usr/include/c++/7/future:1421 (gdb+0x72a5db)
        #10
std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>,
std::__future_base::_Result_base::_Deleter>,
std::__future_base::_Task_state<std::function<void ()>, std::allocator<int>,
void ()>::_M_run()::{lambda()#1}, void>::operator()() const
/usr/include/c++/7/future:1362 (gdb+0x72a5db)
        #11
std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> (),
std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>,
std::__future_base::_Result_base::_Deleter>,
std::__future_base::_Task_state<std::function<void ()>, std::allocator<int>,
void ()>::_M_run()::{lambda()#1}, void> >::_M_invoke(std::_Any_data const&)
/usr/include/c++/7/bits/std_function.h:302 (gdb+0x72a5db)
        #12 std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>::operator()() const
/usr/include/c++/7/bits/std_function.h:706 (gdb+0x724954)
        #13
std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*)
/usr/include/c++/7/future:561 (gdb+0x724954)
        #14 void std::__invoke_impl<void, void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*,
bool*>(std::__invoke_memfun_deref, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)
/usr/include/c++/7/bits/invoke.h:73 (gdb+0x72434a)
        #15 std::__invoke_result<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type
std::__invoke<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)
/usr/include/c++/7/bits/invoke.h:95 (gdb+0x72434a)
        #16 std::call_once<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&,
bool*&&)::{lambda()#1}::operator()() const /usr/include/c++/7/mutex:672
(gdb+0x72434a)
        #17 std::call_once<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&,
bool*&&)::{lambda()#2}::operator()() const /usr/include/c++/7/mutex:677
(gdb+0x72434a)
        #18 std::call_once<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&,
bool*&&)::{lambda()#2}::_FUN() /usr/include/c++/7/mutex:677 (gdb+0x72434a)
        #19 pthread_once <null> (libtsan.so.0+0x4457c)
        #20 __gthread_once
/usr/include/c++/7/x86_64-suse-linux/bits/gthr-default.h:699 (gdb+0x72532b)
        #21 void std::call_once<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)
/usr/include/c++/7/mutex:684 (gdb+0x72532b)
        #22
std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>, bool)
/usr/include/c++/7/future:401 (gdb+0x174568d)
        #23 std::__future_base::_Task_state<std::function<void ()>,
std::allocator<int>, void ()>::_M_run() /usr/include/c++/7/future:1423
(gdb+0x174568d)
        #24 std::packaged_task<void ()>::operator()()
/usr/include/c++/7/future:1556 (gdb+0x174568d)
        #25 gdb::thread_pool::thread_function() gdbsupport/thread-pool.cc:242
(gdb+0x174568d)
        #26 void std::__invoke_impl<void, void (gdb::thread_pool::*)(),
gdb::thread_pool*>(std::__invoke_memfun_deref, void (gdb::thread_pool::*&&)(),
gdb::thread_pool*&&) /usr/include/c++/7/bits/invoke.h:73 (gdb+0x1748040)
        #27 std::__invoke_result<void (gdb::thread_pool::*)(),
gdb::thread_pool*>::type std::__invoke<void (gdb::thread_pool::*)(),
gdb::thread_pool*>(void (gdb::thread_pool::*&&)(), gdb::thread_pool*&&)
/usr/include/c++/7/bits/invoke.h:95 (gdb+0x1748040)
        #28 decltype (__invoke((_S_declval<0ul>)(), (_S_declval<1ul>)()))
std::thread::_Invoker<std::tuple<void (gdb::thread_pool::*)(),
gdb::thread_pool*> >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>)
/usr/include/c++/7/thread:234 (gdb+0x1748040)
        #29 std::thread::_Invoker<std::tuple<void (gdb::thread_pool::*)(),
gdb::thread_pool*> >::operator()() /usr/include/c++/7/thread:243
(gdb+0x1748040)
        #30 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void
(gdb::thread_pool::*)(), gdb::thread_pool*> > >::_M_run()
/usr/include/c++/7/thread:186 (gdb+0x1748040)
        #31 <null> <null> (libstdc++.so.6+0xdcac2)
      ...
    SUMMARY: ThreadSanitizer: data race gdb/dwarf2/read.c:3077 in
dw_expand_symtabs_matching_file_matcher(dwarf2_per_objfile*,
gdb::function_view<bool (char const*, bool)>)
    ...

    The race happens when issuing the "file $exec" command.

    The race is between:
    - a worker thread writing the index cache, and in the process reading
      dwarf2_per_cu_data::is_debug_type, and
    - the main thread writing to dwarf2_per_cu_data::mark.

    The two bitfields dwarf2_per_cu_data::mark and
    dwarf2_per_cu_data::is_debug_type share the same bitfield container.

    Fix this by making dwarf2_per_cu_data::mark a packed<unsigned int, 1>.

    Tested on x86_64-linux.

    PR symtab/30718
    Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30718

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug symtab/30718] [gdb/symtab] More index-cache data races
  2023-08-04  0:21 [Bug symtab/30718] New: [gdb/symtab] More index-cache data races vries at gcc dot gnu.org
                   ` (2 preceding siblings ...)
  2023-08-04 13:06 ` cvs-commit at gcc dot gnu.org
@ 2023-08-04 13:06 ` cvs-commit at gcc dot gnu.org
  2023-08-04 13:06 ` cvs-commit at gcc dot gnu.org
  2023-08-04 13:08 ` vries at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2023-08-04 13:06 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=30718

--- Comment #4 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Tom de Vries <vries@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0961970dea995ce9f8750bd615a534bbbd23cefd

commit 0961970dea995ce9f8750bd615a534bbbd23cefd
Author: Tom de Vries <tdevries@suse.de>
Date:   Fri Aug 4 15:05:57 2023 +0200

    [gdb/symtab] Fix data race on
dwarf2_per_cu_data::{files_read,is_debug_types}

    With gdb build with -fsanitize=thread, and the exec from test-case
    gdb.base/index-cache.exp, I run into:
    ...
    $ rm -f ~/.cache/gdb/*; \
      gdb -q -batch -iex "set index-cache enabled on" index-cache \
        -ex "print foobar"
      ...
    WARNING: ThreadSanitizer: data race (pid=25018)
      Write of size 1 at 0x7b200000410d by main thread:
        #0 dw2_get_file_names_reader gdb/dwarf2/read.c:2033 (gdb+0x7ab023)
        #1 dw2_get_file_names gdb/dwarf2/read.c:2130 (gdb+0x7ab023)
        #2 dw_expand_symtabs_matching_file_matcher(dwarf2_per_objfile*,
gdb::function_view<bool (char const*, bool)>) gdb/dwarf2/read.c:3105
(gdb+0x7ac6e9)
        #3 cooked_index_functions::expand_symtabs_matching(objfile*,
gdb::function_view<bool (char const*, bool)>, lookup_name_info const*,
gdb::function_view<bool (char const*)>, gdb::function_view<bool
(compunit_symtab*)>, enum_flags<block_search_flag_values>, domain_enum,
search_domain) gdb/dwarf2/read.c:16812 (gdb+0x7d040f)
        #4 objfile::map_symtabs_matching_filename(char const*, char const*,
gdb::function_view<bool (symtab*)>) gdb/symfile-debug.c:219 (gdb+0xda5b6e)
        #5 iterate_over_symtabs(char const*, gdb::function_view<bool
(symtab*)>) gdb/symtab.c:648 (gdb+0xdc441d)
        #6 lookup_symtab(char const*) gdb/symtab.c:662 (gdb+0xdc4522)
        #7 classify_name gdb/c-exp.y:3083 (gdb+0x61afec)
        #8 c_yylex gdb/c-exp.y:3251 (gdb+0x61dd13)
        #9 c_yyparse() build/gdb/c-exp.c.tmp:1988 (gdb+0x61f07e)
        #10 c_parse(parser_state*) gdb/c-exp.y:3417 (gdb+0x62d864)
        #11 language_defn::parser(parser_state*) const gdb/language.c:598
(gdb+0x977245)
        #12 parse_exp_in_context gdb/parse.c:414 (gdb+0xb10b1b)
        #13 parse_expression(char const*, innermost_block_tracker*,
enum_flags<parser_flag>) gdb/parse.c:462 (gdb+0xb1112e)
        #14 process_print_command_args gdb/printcmd.c:1321 (gdb+0xb4bf8c)
        #15 print_command_1 gdb/printcmd.c:1335 (gdb+0xb4caaa)
        #16 print_command gdb/printcmd.c:1468 (gdb+0xb4cdda)
        #17 do_simple_func gdb/cli/cli-decode.c:95 (gdb+0x65b078)
        #18 cmd_func(cmd_list_element*, char const*, int)
gdb/cli/cli-decode.c:2735 (gdb+0x65ed53)
        #19 execute_command(char const*, int) gdb/top.c:575 (gdb+0xe3a7ea)
        #20 catch_command_errors gdb/main.c:518 (gdb+0xa183fd)
        #21 execute_cmdargs gdb/main.c:617 (gdb+0xa185bf)
        #22 captured_main_1 gdb/main.c:1289 (gdb+0xa1aad8)
        #23 captured_main gdb/main.c:1310 (gdb+0xa1b9da)
        #24 gdb_main(captured_main_args*) gdb/main.c:1339 (gdb+0xa1b9da)
        #25 main gdb/gdb.c:39 (gdb+0x42506a)

      Previous read of size 1 at 0x7b200000410d by thread T2:
        #0 write_gdbindex gdb/dwarf2/index-write.c:1214 (gdb+0x75bb30)
        #1 write_dwarf_index(dwarf2_per_bfd*, char const*, char const*, char
const*, dw_index_kind) gdb/dwarf2/index-write.c:1469 (gdb+0x75f803)
        #2 index_cache::store(dwarf2_per_bfd*, index_cache_store_context
const&) gdb/dwarf2/index-cache.c:173 (gdb+0x755a36)
        #3 cooked_index::maybe_write_index(dwarf2_per_bfd*,
index_cache_store_context const&) gdb/dwarf2/cooked-index.c:642 (gdb+0x71c96d)
        #4 operator() gdb/dwarf2/cooked-index.c:471 (gdb+0x71c96d)
        #5 _M_invoke /usr/include/c++/7/bits/std_function.h:316 (gdb+0x71c96d)
        #6 std::function<void ()>::operator()() const
/usr/include/c++/7/bits/std_function.h:706 (gdb+0x72a57c)
        #7 void std::__invoke_impl<void, std::function<void
()>&>(std::__invoke_other, std::function<void ()>&)
/usr/include/c++/7/bits/invoke.h:60 (gdb+0x72a5db)
        #8 std::__invoke_result<std::function<void ()>&>::type
std::__invoke<std::function<void ()>&>(std::function<void ()>&)
/usr/include/c++/7/bits/invoke.h:95 (gdb+0x72a5db)
        #9 std::__future_base::_Task_state<std::function<void ()>,
std::allocator<int>, void ()>::_M_run()::{lambda()#1}::operator()() const
/usr/include/c++/7/future:1421 (gdb+0x72a5db)
        #10
std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>,
std::__future_base::_Result_base::_Deleter>,
std::__future_base::_Task_state<std::function<void ()>, std::allocator<int>,
void ()>::_M_run()::{lambda()#1}, void>::operator()() const
/usr/include/c++/7/future:1362 (gdb+0x72a5db)
        #11
std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> (),
std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>,
std::__future_base::_Result_base::_Deleter>,
std::__future_base::_Task_state<std::function<void ()>, std::allocator<int>,
void ()>::_M_run()::{lambda()#1}, void> >::_M_invoke(std::_Any_data const&)
/usr/include/c++/7/bits/std_function.h:302 (gdb+0x72a5db)
        #12 std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>::operator()() const
/usr/include/c++/7/bits/std_function.h:706 (gdb+0x724954)
        #13
std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*)
/usr/include/c++/7/future:561 (gdb+0x724954)
        #14 void std::__invoke_impl<void, void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*,
bool*>(std::__invoke_memfun_deref, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)
/usr/include/c++/7/bits/invoke.h:73 (gdb+0x72434a)
        #15 std::__invoke_result<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type
std::__invoke<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)
/usr/include/c++/7/bits/invoke.h:95 (gdb+0x72434a)
        #16 std::call_once<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&,
bool*&&)::{lambda()#1}::operator()() const /usr/include/c++/7/mutex:672
(gdb+0x72434a)
        #17 std::call_once<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&,
bool*&&)::{lambda()#2}::operator()() const /usr/include/c++/7/mutex:677
(gdb+0x72434a)
        #18 std::call_once<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&,
bool*&&)::{lambda()#2}::_FUN() /usr/include/c++/7/mutex:677 (gdb+0x72434a)
        #19 pthread_once <null> (libtsan.so.0+0x4457c)
        #20 __gthread_once
/usr/include/c++/7/x86_64-suse-linux/bits/gthr-default.h:699 (gdb+0x72532b)
        #21 void std::call_once<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)
/usr/include/c++/7/mutex:684 (gdb+0x72532b)
        #22
std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>, bool)
/usr/include/c++/7/future:401 (gdb+0x174570d)
        #23 std::__future_base::_Task_state<std::function<void ()>,
std::allocator<int>, void ()>::_M_run() /usr/include/c++/7/future:1423
(gdb+0x174570d)
        #24 std::packaged_task<void ()>::operator()()
/usr/include/c++/7/future:1556 (gdb+0x174570d)
        #25 gdb::thread_pool::thread_function() gdbsupport/thread-pool.cc:242
(gdb+0x174570d)
        #26 void std::__invoke_impl<void, void (gdb::thread_pool::*)(),
gdb::thread_pool*>(std::__invoke_memfun_deref, void (gdb::thread_pool::*&&)(),
gdb::thread_pool*&&) /usr/include/c++/7/bits/invoke.h:73 (gdb+0x17480c0)
        #27 std::__invoke_result<void (gdb::thread_pool::*)(),
gdb::thread_pool*>::type std::__invoke<void (gdb::thread_pool::*)(),
gdb::thread_pool*>(void (gdb::thread_pool::*&&)(), gdb::thread_pool*&&)
/usr/include/c++/7/bits/invoke.h:95 (gdb+0x17480c0)
        #28 decltype (__invoke((_S_declval<0ul>)(), (_S_declval<1ul>)()))
std::thread::_Invoker<std::tuple<void (gdb::thread_pool::*)(),
gdb::thread_pool*> >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>)
/usr/include/c++/7/thread:234 (gdb+0x17480c0)
        #29 std::thread::_Invoker<std::tuple<void (gdb::thread_pool::*)(),
gdb::thread_pool*> >::operator()() /usr/include/c++/7/thread:243
(gdb+0x17480c0)
        #30 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void
(gdb::thread_pool::*)(), gdb::thread_pool*> > >::_M_run()
/usr/include/c++/7/thread:186 (gdb+0x17480c0)
        #31 <null> <null> (libstdc++.so.6+0xdcac2)
      ...
    SUMMARY: ThreadSanitizer: data race gdb/dwarf2/read.c:2033 in
dw2_get_file_names_reader
    ...

    The race happens when issuing the "file $exec" command.

    The race is between:
    - a worker thread writing the index cache, and in the process reading
      dwarf2_per_cu_data::is_debug_type, and
    - the main thread writing to dwarf2_per_cu_data::files_read.

    The two bitfields dwarf2_per_cu_data::files_read and
    dwarf2_per_cu_data::is_debug_type share the same bitfield container.

    Fix this by making dwarf2_per_cu_data::files_read a packed<bool, 1>.

    Tested on x86_64-linux.

    PR symtab/30718
    Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30718

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug symtab/30718] [gdb/symtab] More index-cache data races
  2023-08-04  0:21 [Bug symtab/30718] New: [gdb/symtab] More index-cache data races vries at gcc dot gnu.org
                   ` (3 preceding siblings ...)
  2023-08-04 13:06 ` cvs-commit at gcc dot gnu.org
@ 2023-08-04 13:06 ` cvs-commit at gcc dot gnu.org
  2023-08-04 13:08 ` vries at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2023-08-04 13:06 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=30718

--- Comment #5 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Tom de Vries <vries@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=babce214ecb2a093606186a3f82d579cb026a925

commit babce214ecb2a093606186a3f82d579cb026a925
Author: Tom de Vries <tdevries@suse.de>
Date:   Fri Aug 4 15:05:57 2023 +0200

    [gdb/testsuite] Extend gdb.base/index-cache.exp further

    Add lookup of a non-existing symbol to test-case gdb.base/index-cache.exp.

    This serves as regression test for PR symtab/30718.

    PR symtab/30718
    Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30718

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug symtab/30718] [gdb/symtab] More index-cache data races
  2023-08-04  0:21 [Bug symtab/30718] New: [gdb/symtab] More index-cache data races vries at gcc dot gnu.org
                   ` (4 preceding siblings ...)
  2023-08-04 13:06 ` cvs-commit at gcc dot gnu.org
@ 2023-08-04 13:08 ` vries at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: vries at gcc dot gnu.org @ 2023-08-04 13:08 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=30718

Tom de Vries <vries at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
   Target Milestone|---                         |14.1
         Resolution|---                         |FIXED

--- Comment #6 from Tom de Vries <vries at gcc dot gnu.org> ---
Fixed.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-08-04 13:08 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-04  0:21 [Bug symtab/30718] New: [gdb/symtab] More index-cache data races vries at gcc dot gnu.org
2023-08-04  0:26 ` [Bug symtab/30718] " vries at gcc dot gnu.org
2023-08-04  0:27 ` vries at gcc dot gnu.org
2023-08-04 13:06 ` cvs-commit at gcc dot gnu.org
2023-08-04 13:06 ` cvs-commit at gcc dot gnu.org
2023-08-04 13:06 ` cvs-commit at gcc dot gnu.org
2023-08-04 13:08 ` vries at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).