diff options
Diffstat (limited to 'gdb/linespec.c')
-rw-r--r-- | gdb/linespec.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/gdb/linespec.c b/gdb/linespec.c index 045c97af738..194d50cb3a1 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -2292,10 +2292,25 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls) ++m) { if (MSYMBOL_TYPE (elem->minsym) == mst_text_gnu_ifunc - && BMSYMBOL_VALUE_ADDRESS (*elem) == addr) + || MSYMBOL_TYPE (elem->minsym) == mst_data_gnu_ifunc) { - found_ifunc = true; - break; + CORE_ADDR msym_addr = BMSYMBOL_VALUE_ADDRESS (*elem); + if (MSYMBOL_TYPE (elem->minsym) == mst_data_gnu_ifunc) + { + struct gdbarch *gdbarch + = get_objfile_arch (elem->objfile); + msym_addr + = (gdbarch_convert_from_func_ptr_addr + (gdbarch, + msym_addr, + ¤t_target)); + } + + if (msym_addr == addr) + { + found_ifunc = true; + break; + } } } } @@ -4283,7 +4298,8 @@ minsym_found (struct linespec_state *self, struct objfile *objfile, { const char *msym_name = MSYMBOL_LINKAGE_NAME (msymbol); - if (MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc) + if (MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc + || MSYMBOL_TYPE (msymbol) == mst_data_gnu_ifunc) want_start_sal = gnu_ifunc_resolve_name (msym_name, &func_addr); else want_start_sal = true; |