diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/linespec.c | 64 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 16 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/list-ambiguous.exp | 37 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/list-ambiguous0.c | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/list-ambiguous1.c | 5 |
6 files changed, 86 insertions, 46 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a9a6c58..1e0ae7d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2017-09-20 Pedro Alves <palves@redhat.com> + + * linespec.c (minsym_found): Handle non-text minsyms. + (symbol_to_sal): Record a sal.pc for non-block, non-label symbols. + 2017-09-20 Walfred Tedeschi <walfred.tedeschi@intel.com> * features/Makefile (i386-avx-mpx-avx512-pku.dat): Add missing diff --git a/gdb/linespec.c b/gdb/linespec.c index b69ab62..35ef159 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -4313,35 +4313,46 @@ minsym_found (struct linespec_state *self, struct objfile *objfile, CORE_ADDR pc; struct symtab_and_line sal; - sal = find_pc_sect_line (MSYMBOL_VALUE_ADDRESS (objfile, msymbol), - (struct obj_section *) 0, 0); - sal.section = MSYMBOL_OBJ_SECTION (objfile, msymbol); - - /* The minimal symbol might point to a function descriptor; - resolve it to the actual code address instead. */ - pc = gdbarch_convert_from_func_ptr_addr (gdbarch, sal.pc, ¤t_target); - if (pc != sal.pc) - sal = find_pc_sect_line (pc, NULL, 0); - - if (self->funfirstline) + if (msymbol_is_text (msymbol)) { - if (sal.symtab != NULL - && (COMPUNIT_LOCATIONS_VALID (SYMTAB_COMPUNIT (sal.symtab)) - || SYMTAB_LANGUAGE (sal.symtab) == language_asm)) + sal = find_pc_sect_line (MSYMBOL_VALUE_ADDRESS (objfile, msymbol), + (struct obj_section *) 0, 0); + sal.section = MSYMBOL_OBJ_SECTION (objfile, msymbol); + + /* The minimal symbol might point to a function descriptor; + resolve it to the actual code address instead. */ + pc = gdbarch_convert_from_func_ptr_addr (gdbarch, sal.pc, + ¤t_target); + if (pc != sal.pc) + sal = find_pc_sect_line (pc, NULL, 0); + + if (self->funfirstline) { - /* If gdbarch_convert_from_func_ptr_addr does not apply then - sal.SECTION, sal.LINE&co. will stay correct from above. - If gdbarch_convert_from_func_ptr_addr applies then - sal.SECTION is cleared from above and sal.LINE&co. will - stay correct from the last find_pc_sect_line above. */ - sal.pc = MSYMBOL_VALUE_ADDRESS (objfile, msymbol); - sal.pc = gdbarch_convert_from_func_ptr_addr (gdbarch, sal.pc, - ¤t_target); - if (gdbarch_skip_entrypoint_p (gdbarch)) - sal.pc = gdbarch_skip_entrypoint (gdbarch, sal.pc); + if (sal.symtab != NULL + && (COMPUNIT_LOCATIONS_VALID (SYMTAB_COMPUNIT (sal.symtab)) + || SYMTAB_LANGUAGE (sal.symtab) == language_asm)) + { + /* If gdbarch_convert_from_func_ptr_addr does not apply then + sal.SECTION, sal.LINE&co. will stay correct from above. + If gdbarch_convert_from_func_ptr_addr applies then + sal.SECTION is cleared from above and sal.LINE&co. will + stay correct from the last find_pc_sect_line above. */ + sal.pc = MSYMBOL_VALUE_ADDRESS (objfile, msymbol); + sal.pc = gdbarch_convert_from_func_ptr_addr (gdbarch, sal.pc, + ¤t_target); + if (gdbarch_skip_entrypoint_p (gdbarch)) + sal.pc = gdbarch_skip_entrypoint (gdbarch, sal.pc); + } + else + skip_prologue_sal (&sal); } - else - skip_prologue_sal (&sal); + } + else + { + sal.objfile = objfile; + sal.pc = MSYMBOL_VALUE_ADDRESS (objfile, msymbol); + sal.pspace = current_program_space; + sal.section = MSYMBOL_OBJ_SECTION (objfile, msymbol); } if (maybe_add_address (self->addr_set, objfile->pspace, sal.pc)) @@ -4628,6 +4639,7 @@ symbol_to_sal (struct symtab_and_line *result, *result = {}; result->symtab = symbol_symtab (sym); result->line = SYMBOL_LINE (sym); + result->pc = SYMBOL_VALUE_ADDRESS (sym); result->pspace = SYMTAB_PSPACE (result->symtab); return 1; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index d68072a..7ab92a2 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,19 @@ +2017-09-20 Pedro Alves <palves@redhat.com> + + * gdb.base/list-ambiguous.exp (test_list_ambiguous_function): + Rename to ... + (test_list_ambiguous_symbol): ... this and add a symbol name + parameter. Adjust. + (test_list_ambiguous_function): Reimplement on top of + test_list_ambiguous_symbol and also test listing ambiguous + variables. + * gdb.base/list-ambiguous0.c (ambiguous): Rename to ... + (ambiguous_fun): ... this. + (ambiguous_var): New. + * gdb.base/list-ambiguous1.c (ambiguous): Rename to ... + (ambiguous_fun): ... this. + (ambiguous_var): New. + 2017-09-19 John Baldwin <jhb@FreeBSD.org> * gdb.base/starti.c: New file. diff --git a/gdb/testsuite/gdb.base/list-ambiguous.exp b/gdb/testsuite/gdb.base/list-ambiguous.exp index db9d028..dd473ca 100644 --- a/gdb/testsuite/gdb.base/list-ambiguous.exp +++ b/gdb/testsuite/gdb.base/list-ambiguous.exp @@ -39,36 +39,41 @@ proc line_range_pattern { range_start range_end } { # Test the "list" command with linespecs that expand to multiple # locations. -proc test_list_ambiguous_function {} { +proc test_list_ambiguous_symbol {symbol_line symbol} { global srcfile srcfile2 - set lineno0 [gdb_get_line_number "ambiguous (void)" $srcfile] - set lineno1 [gdb_get_line_number "ambiguous (void)" $srcfile2] + set lineno0 [gdb_get_line_number $symbol_line $srcfile] + set lineno1 [gdb_get_line_number $symbol_line $srcfile2] set lines0_re [line_range_pattern [expr $lineno0 - 5] [expr $lineno0 + 4]] set lines1_re [line_range_pattern [expr $lineno1 - 5] [expr $lineno1 + 4]] set any "\[^\r\n\]*" set h0_re "file: \"${any}list-ambiguous0.c\", line number: $lineno0" set h1_re "file: \"${any}list-ambiguous1.c\", line number: $lineno1" - gdb_test "list ambiguous" "${h0_re}${lines0_re}\r\n${h1_re}${lines1_re}" - - gdb_test "list main,ambiguous" \ - "Specified last line 'ambiguous' is ambiguous:\r\n${h0_re}\r\n${h1_re}" - gdb_test "list ,ambiguous" \ - "Specified last line 'ambiguous' is ambiguous:\r\n${h0_re}\r\n${h1_re}" - gdb_test "list ambiguous,main" \ - "Specified first line 'ambiguous' is ambiguous:\r\n${h0_re}\r\n${h1_re}" - gdb_test "list ambiguous,ambiguous" \ - "Specified first line 'ambiguous' is ambiguous:\r\n${h0_re}\r\n${h1_re}" - gdb_test "list ambiguous," \ - "Specified first line 'ambiguous' is ambiguous:\r\n${h0_re}\r\n${h1_re}" + gdb_test "list $symbol" "${h0_re}${lines0_re}\r\n${h1_re}${lines1_re}" + + gdb_test "list main,$symbol" \ + "Specified last line '$symbol' is ambiguous:\r\n${h0_re}\r\n${h1_re}" + gdb_test "list ,$symbol" \ + "Specified last line '$symbol' is ambiguous:\r\n${h0_re}\r\n${h1_re}" + gdb_test "list $symbol,main" \ + "Specified first line '$symbol' is ambiguous:\r\n${h0_re}\r\n${h1_re}" + gdb_test "list $symbol,$symbol" \ + "Specified first line '$symbol' is ambiguous:\r\n${h0_re}\r\n${h1_re}" + gdb_test "list $symbol," \ + "Specified first line '$symbol' is ambiguous:\r\n${h0_re}\r\n${h1_re}" # While at it, test the "edit" command as well, since it shares # code with "list". - gdb_test "edit ambiguous" \ + gdb_test "edit $symbol" \ "Specified line is ambiguous:\r\n${h0_re}\r\n${h1_re}" } +proc test_list_ambiguous_function {} { + test_list_ambiguous_symbol "ambiguous_fun (void)" "ambiguous_fun" + test_list_ambiguous_symbol "ambiguous_var" "ambiguous_var" +} + gdb_test_no_output "set listsize 10" test_list_ambiguous_function diff --git a/gdb/testsuite/gdb.base/list-ambiguous0.c b/gdb/testsuite/gdb.base/list-ambiguous0.c index 91f7fe9..afd9457 100644 --- a/gdb/testsuite/gdb.base/list-ambiguous0.c +++ b/gdb/testsuite/gdb.base/list-ambiguous0.c @@ -19,12 +19,13 @@ -/* This function is defined in both +/* These symbols are defined in both list-ambiguous0.c/list-ambiguous1.c files, in order to test "list"'s behavior with ambiguous linespecs. */ -static void __attribute__ ((used)) ambiguous (void) {} +static void __attribute__ ((used)) ambiguous_fun (void) {} +static int ambiguous_var; diff --git a/gdb/testsuite/gdb.base/list-ambiguous1.c b/gdb/testsuite/gdb.base/list-ambiguous1.c index 024299a..69db11e 100644 --- a/gdb/testsuite/gdb.base/list-ambiguous1.c +++ b/gdb/testsuite/gdb.base/list-ambiguous1.c @@ -23,11 +23,12 @@ -/* This function is defined in both +/* These symbols are defined in both list-ambiguous0.c/list-ambiguous1.c files, in order to test "list"'s behavior with ambiguous linespecs. */ -static void __attribute__ ((used)) ambiguous (void) {} +static void __attribute__ ((used)) ambiguous_fun (void) {} +static int ambiguous_var; |