From: Jan Vrany Date: Wed, 14 Jan 2026 14:31:36 +0000 (+0000) Subject: gdb/jit: add function symbols to global block X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=452411b260c537d92dfd598b006a50fa4f7f45b5;p=thirdparty%2Fbinutils-gdb.git gdb/jit: add function symbols to global block While playing with JIT reader I realized that it is not possible to set a breakpoint on jitted function: (gdb) b jit_function_stack_mangle Function "jit_function_stack_mangle" not defined. Make breakpoint pending on future shared library load? (y or [n]) The problem is that symbols for jitted functions (jit_function_stack_mangle in the above example) are not added to jitted compunit's global block: (gdb) maint print symtabs ... Symtab for file at 0x55d6f8c186c0 Read from object file << JIT compiled code at 0x5555555592a0 >> (0x55d6f8cd4090) Language: unknown Line table: line 1 at 0x7ffff7fbc000 (stmt) line 0 at 0x7ffff7fbc001 (stmt) Blockvector: block #000, object at 0x55d6f8c188b0, 0 symbols in 0x7ffff7fbc000..0x7ffff7fbc011 block #001, object at 0x55d6f8c18910 under 0x55d6f8c188b0, 0 symbols in 0x7ffff7fbc000..0x7ffff7fbc011 block #002, object at 0x55d6f8c18730 under 0x55d6f8c18910, 0 symbols in 0x7ffff7fbc000..0x7ffff7fbc00a, function jit_function_stack_mangle block #003, object at 0x55d6f8c187f0 under 0x55d6f8c18910, 0 symbols in 0x7ffff7fbc00a..0x7ffff7fbc011, function jit_function_add This commit changes JIT reader to add jitted functions to the global block: ... Blockvector: block #000, object at 0x55ed6665b180, 2 symbols in 0x7ffff7fbc000..0x7ffff7fbc011 void jit_function_stack_mangle(); block object 0x55ed6665b000, 0x7ffff7fbc000..0x7ffff7fbc00a void jit_function_add(); block object 0x55ed6665b0c0, 0x7ffff7fbc00a..0x7ffff7fbc011 block #001, object at 0x55ed6665b230 under 0x55ed6665b180, 0 symbols in 0x7ffff7fbc000..0x7ffff7fbc011 block #002, object at 0x55ed6665b000 under 0x55ed6665b230, 0 symbols in 0x7ffff7fbc000..0x7ffff7fbc00a, function jit_function_stack_mangle block #003, object at 0x55ed6665b0c0 under 0x55ed6665b230, 0 symbols in 0x7ffff7fbc00a..0x7ffff7fbc011, function jit_function_add Approved-By: Tom Tromey --- diff --git a/gdb/jit.c b/gdb/jit.c index 489386393a1..4add2fa4861 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -564,6 +564,7 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) object for each. Simultaneously, keep setting the real_block fields. */ int block_idx = FIRST_LOCAL_BLOCK; + std::vector global_symbols; for (gdb_block &gdb_block_iter : stab->blocks) { struct block *new_block = new (&objfile->objfile_obstack) block; @@ -585,6 +586,7 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) block_name->m_name = obstack_strdup (&objfile->objfile_obstack, gdb_block_iter.name.get ()); + global_symbols.push_back (block_name); new_block->set_function (block_name); @@ -606,12 +608,18 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) struct block *new_block; if (i == GLOBAL_BLOCK) - new_block = new (&objfile->objfile_obstack) global_block; + { + new_block = new (&objfile->objfile_obstack) global_block; + new_block->set_multidict + (mdict_create_linear (&objfile->objfile_obstack, global_symbols)); + } else - new_block = new (&objfile->objfile_obstack) block; + { + new_block = new (&objfile->objfile_obstack) block; + new_block->set_multidict + (mdict_create_linear (&objfile->objfile_obstack, {})); + } - new_block->set_multidict - (mdict_create_linear (&objfile->objfile_obstack, {})); new_block->set_superblock (block_iter); block_iter = new_block; diff --git a/gdb/testsuite/gdb.base/jit-reader.exp b/gdb/testsuite/gdb.base/jit-reader.exp index 549859627f1..8b3f50d15b7 100644 --- a/gdb/testsuite/gdb.base/jit-reader.exp +++ b/gdb/testsuite/gdb.base/jit-reader.exp @@ -244,6 +244,16 @@ proc jit_reader_test {} { ">>" \ "python gdb.Progspace.objfile_for_address" } + + # Check that jitted symbol completion works + gdb_test "complete break jit_func" \ + [multi_line "break jit_function_add" \ + "break jit_function_stack_mangle" ] \ + + # Check that breakpoint can be set on jitted function + gdb_test "break jit_function_add" \ + "Breakpoint 1 at 0x\[0-9a-f\]+" + gdb_test_no_output "del 1" } }