- Backport fix for assert [bsc#1186040, swo#27889]:
* gdb-breakpoint-fix-assert-in-jit_event_handler.patch OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=280
This commit is contained in:
parent
bedbb9e5b8
commit
ac70ee3aa8
114
gdb-breakpoint-fix-assert-in-jit_event_handler.patch
Normal file
114
gdb-breakpoint-fix-assert-in-jit_event_handler.patch
Normal file
@ -0,0 +1,114 @@
|
||||
[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 <tdevries@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;
|
||||
|
@ -1,3 +1,9 @@
|
||||
-------------------------------------------------------------------
|
||||
Fri May 21 13:31:07 UTC 2021 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Backport fix for assert [bsc#1186040, swo#27889]:
|
||||
* gdb-breakpoint-fix-assert-in-jit_event_handler.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed May 12 14:12:41 UTC 2021 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
|
2
gdb.spec
2
gdb.spec
@ -317,6 +317,7 @@ Patch2016: gdb-testsuite-ignore-debuginfod_urls.patch
|
||||
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 @@ find -name "*.info*"|xargs rm -f
|
||||
%patch2017 -p1
|
||||
%patch2018 -p1
|
||||
%patch2019 -p1
|
||||
%patch2020 -p1
|
||||
%patch2021 -p1
|
||||
|
||||
%patch2500 -p1
|
||||
|
Loading…
x
Reference in New Issue
Block a user