Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gdb for openSUSE:Factory checked in at 2021-06-04 00:33:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gdb (Old) and /work/SRC/openSUSE:Factory/.gdb.new.1898 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gdb" Fri Jun 4 00:33:08 2021 rev:151 rq:894869 version:10.1 Changes: -------- --- /work/SRC/openSUSE:Factory/gdb/gdb.changes 2021-05-15 23:16:45.520602264 +0200 +++ /work/SRC/openSUSE:Factory/.gdb.new.1898/gdb.changes 2021-06-04 00:33:10.616873080 +0200 @@ -1,0 +2,6 @@ +Fri May 21 13:31:07 UTC 2021 - Tom de Vries <tdevr...@suse.com> + +- Backport fix for assert [bsc#1186040, swo#27889]: + * gdb-breakpoint-fix-assert-in-jit_event_handler.patch + +------------------------------------------------------------------- New: ---- gdb-breakpoint-fix-assert-in-jit_event_handler.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gdb.spec ++++++ --- /var/tmp/diff_new_pack.lzYRzm/_old 2021-06-04 00:33:12.728874719 +0200 +++ /var/tmp/diff_new_pack.lzYRzm/_new 2021-06-04 00:33:12.728874719 +0200 @@ -317,6 +317,7 @@ Patch2017: gdb-testsuite-fix-unset-of-debuginfod_urls-in-default_gdb_init.patch Patch2018: gdb-tui-fix-len_without_escapes-in-tui-disasm.c.patch Patch2019: gdb-build-hardcode-with-included-regex.patch +Patch2020: gdb-breakpoint-fix-assert-in-jit_event_handler.patch Patch2021: gdb-save-restore-file-offset-while-reading-notes-in-core-file.patch # Testsuite patches @@ -735,6 +736,7 @@ %patch2017 -p1 %patch2018 -p1 %patch2019 -p1 +%patch2020 -p1 %patch2021 -p1 %patch2500 -p1 ++++++ gdb-breakpoint-fix-assert-in-jit_event_handler.patch ++++++ [gdb/breakpoint] Fix assert in jit_event_handler Consider a minimal test-case test.c: ... int main (void) { return 0; } ... which we can compile into llvm byte code using clang: ... $ clang -g -S -emit-llvm --target=x86_64-unknown-unknown-elf test.c ... and then run using lli, which uses the llvm jit: ... $ lli test.ll ... If we run this under gdb, we run into an assert: ... $ gdb -q -batch -ex run --args /usr/bin/lli test.ll Dwarf Error: Cannot not find DIE at 0x18a936e7 \ [from module libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug] [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib64/libthread_db.so.1". src/gdb/jit.c:1178: internal-error: \ void jit_event_handler(gdbarch*, objfile*): \ Assertion `jiter->jiter_data != nullptr' failed. ... This is caused by the following. When running jit_breakpoint_re_set_internal, we first handle libLLVM.so.10.debug, and set a jit breakpoint. Next we handle libLLVM.so.10: ... (gdb) p the_objfile.original_name $42 = 0x2494170 "libLLVM.so.10" ... but the minimal symbols we find are from libLLVM.so.10.debug: ... (gdb) p reg_symbol.objfile.original_name $43 = 0x38e7c50 "libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug" (gdb) p desc_symbol.objfile.original_name $44 = 0x38e7c50 "libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug" ... and consequently, the objf_data is the one from libLLVM.so.10.debug: ... jiter_objfile_data *objf_data = get_jiter_objfile_data (reg_symbol.objfile); ... and so we hit this: ... if (objf_data->cached_code_address == addr) continue; ... and no second jit breakpoint is inserted. Subsequently, the jit breakpoint is triggered and handled, but when finding the symbol for the breakpoint address we get: ... (gdb) p jit_bp_sym.objfile.original_name $52 = 0x2494170 "libLLVM.so.10" ... The assert 'jiter->jiter_data != nullptr' triggers because it checks libLLVM.so.10 while the one with jiter_data setup is libLLVM.so.10.debug. This fixes the assert: ... jiter_objfile_data *objf_data - = get_jiter_objfile_data (reg_symbol.objfile); - = get_jiter_objfile_data (the_objfile); ... but consequently we'll have two jit breakpoints, so we also make sure we don't set a jit breakpoint on separate debug objects like libLLVM.so.10.debug. Tested on x86_64-linux. gdb/ChangeLog: 2021-05-21 Tom de Vries <tdevr...@suse.de> PR breakpoint/27889 * jit.c (jit_breakpoint_re_set_internal): Skip separate debug objects. Call get_jiter_objfile_data with the_objfile. --- gdb/jit.c | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/gdb/jit.c b/gdb/jit.c index 296b436c796..be10f197fd6 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -807,6 +807,10 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch, program_space *pspace) { for (objfile *the_objfile : pspace->objfiles ()) { + /* Skip separate debug objects. */ + if (the_objfile->separate_debug_objfile_backlink != nullptr) + continue; + if (the_objfile->skip_jit_symbol_lookup) continue; @@ -833,7 +837,7 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch, program_space *pspace) } jiter_objfile_data *objf_data - = get_jiter_objfile_data (reg_symbol.objfile); + = get_jiter_objfile_data (the_objfile); objf_data->register_code = reg_symbol.minsym; objf_data->descriptor = desc_symbol.minsym;