Commit Graph

43633 Commits

Author SHA1 Message Date
Christian Biesinger
33cb1647d6 Regenerate config.in
I forgot to do this in the last commit
(b231e86ac9)

gdb/ChangeLog:

2019-10-31  Christian Biesinger  <cbiesinger@google.com>

	* config.in: Regenerate.

Change-Id: I60946ffd853a59469c35f19ef8012ac6ea88a31c
2019-10-31 15:41:10 -05:00
Christian Biesinger
b231e86ac9 Use strerror_r in safe_strerror if available
Also stores the result in a thread-local static variable and
changes the return value to a const char*.

This is already important because Guile creates threads and
Python can create threads, but with the patch series here:
https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/176
GDB itself will create threads, too.

gdb/ChangeLog:

2019-10-31  Christian Biesinger  <cbiesinger@google.com>

	* configure: Regenerate.
	* configure.ac: Check for strerror_r.
	* gdbsupport/common-utils.h (safe_strerror): Change return value
	to const char * and document that this function is now threadsafe.
	* gdbsupport/posix-strerror.c (safe_strerror): Make buf
	thread_local and call strerror_r, if available.
	* utils.c (perror_string): Update.
	(print_sys_errmsg): Update.

Change-Id: I81048fbaf148035c221c528727f7efe58ba528eb
2019-10-31 15:14:14 -05:00
Luis Machado
a2726d4ff8 [ARM] Store exception handling information per-bfd instead of per-objfile
Based on feedback from Tromey, update the use of objfile_key in gdb/arm-tdep.c
to use bfd_key instead. That way we don't have to re-create the exception
handling data all over again if it was done before for the same BFD.

gdb/ChangeLog:

2019-10-31  Luis Machado  <luis.machado@linaro.org>

	* arm-tdep.c (arm_exidx_data_key): Use bfd_key instead of
	objfile_key.
	(arm_exidx_new_objfile): Adjust to use objfile->obfd instead of
	objfile to fetch per-bfd data.
	(arm_find_exidx_entry): Likewise.

Change-Id: Ia7b3208ea8d788414600fa6d770ac76db0562859
2019-10-31 16:30:44 -03:00
Christian Biesinger
75cafaa61a Convert int to bool in agent.c
Also moves an int declaration inside the for loop.

Code cleanup, no change in behavior intended.

gdb/ChangeLog:

2019-10-31  Christian Biesinger  <cbiesinger@google.com>

	* gdbsupport/agent.c (debug_agent): Change type to bool.
	(use_agent): Likewise.
	(all_agent_symbols_look_up): Likewise.
	(agent_loaded_p): Change return value to bool.
	(agent_look_up_symbols): Update.
	(agent_capability_check): Change return value to bool.
	* gdbsupport/agent.h (agent_loaded_p): Likewise.
	(debug_agent): Change type to bool.
	(use_agent): Likewise.
	(agent_capability_check): Change return value to bool.

gdb/gdbserver/ChangeLog:

2019-10-31  Christian Biesinger  <cbiesinger@google.com>

	* ax.h (debug_agent): Remove duplicate declaration.

Change-Id: Icb28a65fcc8c7108bcd59287e6be66bf56f8ccb5
2019-10-31 13:28:14 -05:00
Tom de Vries
3d11e68e4b [gdb/testsuite] Remove superfluous 3rd argument from gdb_test call
There's a pattern:
...
gdb_test <command> <pattern> <command>
...
that can be written shorter as:
...
gdb_test <command> <pattern>
...

Detect this pattern in proc gdb_test:
...
     global gdb_prompt
     upvar timeout timeout

     if [llength $args]>2 then {
 	set message [lindex $args 2]
+	if { $message == [lindex $args 0] } {
+	    error "HERE"
+	}
     } else {
 	set message [lindex $args 0]
     }
...
and fix all occurences in gdb.ada.

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2019-10-31  Tom de Vries  <tdevries@suse.de>

	* gdb.ada/array_bounds.exp: Drop superfluous 3rd argument to gdb_test.
	* gdb.ada/array_subscript_addr.exp: Same.
	* gdb.ada/arrayidx.exp: Same.
	* gdb.ada/arrayparam.exp: Same.
	* gdb.ada/arrayptr.exp: Same.
	* gdb.ada/boolean_expr.exp: Same.
	* gdb.ada/call_pn.exp: Same.
	* gdb.ada/complete.exp: Same.
	* gdb.ada/fixed_cmp.exp: Same.
	* gdb.ada/fun_addr.exp: Same.
	* gdb.ada/funcall_param.exp: Same.
	* gdb.ada/interface.exp: Same.
	* gdb.ada/mod_from_name.exp: Same.
	* gdb.ada/null_array.exp: Same.
	* gdb.ada/packed_array.exp: Same.
	* gdb.ada/packed_tagged.exp: Same.
	* gdb.ada/print_chars.exp: Same.
	* gdb.ada/print_pc.exp: Same.
	* gdb.ada/ptype_arith_binop.exp: Same.
	* gdb.ada/ptype_field.exp: Same.
	* gdb.ada/ptype_tagged_param.exp: Same.
	* gdb.ada/rec_return.exp: Same.
	* gdb.ada/ref_tick_size.exp: Same.
	* gdb.ada/str_ref_cmp.exp: Same.
	* gdb.ada/taft_type.exp: Same.
	* gdb.ada/tagged.exp: Same.
	* gdb.ada/type_coercion.exp: Same.
	* gdb.ada/uninitialized_vars.exp: Same.

Change-Id: Ibb84a41573c7f21295f3fd42da9b96534205c5c4
2019-10-31 17:37:02 +01:00
Tom de Vries
60b6ede845 [gdb/testsuite] Add -early pattern flag for gdb_test_multiple
Proc gdb_test_multiple builds up and executes a gdb_expect expression with
pattern/action clauses.  The clauses are either implicit (added by
gdb_test_multiple) or explicit (passed via the gdb_test_multiple parameter
user_code).

However, there are a few implicit clauses which are inserted before the
explicit ones, making sure those take precedence.

Add an -early pattern flag for a gdb_test_multiple user_code clause to specify
that the clause needs to be inserted before any implicit clause.

Using this pattern flag, we can f.i. setup a kfail for an assertion failure
<assert> during gdb_continue_to_breakpoint by the rewrite:
...
gdb_continue_to_breakpoint <msg> <pattern>
...
into:
...
set breakpoint_pattern "(?:Breakpoint|Temporary breakpoint) .* (at|in)"
gdb_test_multiple "continue" "continue to breakpoint: <msg>"  {
   -early -re "internal-error: <assert>" {
       setup_kfail gdb/nnnnn "*-*-*"
       exp_continue
   }
   -re "$breakpoint_pattern <pattern>\r\n$gdb_prompt $" {
       pass $gdb_test_name
   }
}

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2019-10-30  Tom de Vries  <tdevries@suse.de>

	* lib/gdb.exp (gdb_test_multiple): Handle -early pattern flag.

Change-Id: I376c636b0812be52e7137634b1a4f50bf2b999b6
2019-10-30 17:41:03 +01:00
Christian Biesinger
808590ec5a Only clear the minsym array when necessary
The array starts out initialized to zero:
  minimal_symbol *msymbol_hash[MINIMAL_SYMBOL_HASH_SIZE] {};

So we only need to explicitly clear it if there were previous minsyms
added to it. This patch does that.

gdb/ChangeLog:

2019-10-30  Christian Biesinger  <cbiesinger@google.com>

	* minsyms.c (clear_minimal_symbol_hash_tables): New function.
	(build_minimal_symbol_hash_tables): Code to clear the table moved
	to clear_minimal_symbol_hash_tables.
	(minimal_symbol_reader::install): Call clear_minimal_symbol_hash_tables
	when needed.

Change-Id: I7da994fe6747f67714e7efe9fdbb0dbc4d6ea532
2019-10-30 11:05:02 -05:00
Simon Marchi
f18ad8a16b Remove unused includes in infcmd.c and infrun.c
include-what-you-use reported this:

../../../src/binutils-gdb/gdb/infcmd.c should remove these lines:
- #include <signal.h>  // lines 22-22
- #include "cli/cli-decode.h"  // lines 48-48
- #include "cli/cli-utils.h"  // lines 56-56
- #include "event-top.h"  // lines 38-38
- #include "infcall.h"  // lines 57-57
- #include "parser-defs.h"  // lines 39-39

../../../src/binutils-gdb/gdb/infrun.c should remove these lines:
- #include <signal.h>  // lines 37-37
- #include "cli/cli-script.h"  // lines 31-31
- #include "continuations.h"  // lines 54-54
- #include "dictionary.h"  // lines 45-45
- #include "gdbsupport/gdb_wait.h"  // lines 28-28
- #include "interps.h"  // lines 55-55

Remove those includes.

Tested by rebuilding, and by quick inspection that the include fields
were indeed unnecessary.

gdb/ChangeLog:

	* infcmd.c: Remove includes.
	* infrun.c: Remove includes.

Change-Id: I5e25af54ecd2235960c4127add8f604ddbb19153
2019-10-29 17:54:35 -04:00
Simon Marchi
de93309a38 Clean up ada-lang.h
This patch cleans up ada-lang.h:

- Some functions just don't exist anymore, remove their declaration
- Some functions are implemented in ada-lang.c and only used there, make
  them static to that file.

I moved some functions higher in the file to avoid having to
forward-declare them, but the implementations are unchanged.

gdb/ChangeLog:

	* ada-lang.h (GROW_VECT): Move to ada-lang.c.
	(grow_vect): Remove declaration.
	(ada_type_of_array): Remove declaration.
	(ada_update_initial_language): Remove declaration.
	(ada_fold_name): Remove declaration.
	(ada_fill_in_ada_prototype): Remove declaration.
	(user_select_syms): Remove declaration.
	(get_selections): Remove declaration.
	(ada_tag_type): Remove declaration.
	(ada_value_tag): Remove declaration.
	(ada_is_others_clause): Remove declaration.
	(ada_in_variant): Remove declaration.
	(ada_value_struct_elt): Remove declaration.
	(ada_attribute_name): Remove declaration.
	(ada_system_address_type): Remove declaration.
	* ada-lang.c (ada_watch_location_expression): Make static.
	(GROW_VECT): Move here from ada-lang.h.
	(grow_vect): Make static.
	(ada_update_initial_language): Make static.
	(ada_fold_name): Make static.
	(ada_type_of_array): Make static.
	(encoded_ordered_before): Move up.
	(sort_choices): Move up.
	(print_signatures): Move up.
	(ada_print_symbol_signature): Move up.
	(get_selections): Move up and make static.
	(user_select_syms): Move up and make static.
	(ada_value_struct_elt): Move up and make static.
	(ada_tag_type): Make static.
	(ada_value_tag): Make static.
	(ada_is_others_clause): Make static.
	(ada_in_variant): Make static.
	(ada_attribute_name): Make static.

Change-Id: If0d46ba87d6585ab674c87244068a19e84718fc9
2019-10-29 17:52:24 -04:00
Simon Marchi
cdc46a9ff4 Remove unused includes in ada-*.c files
include-what-you-use reports:

../../../src/binutils-gdb/gdb/ada-lang.c should remove these lines:
- #include <sys/stat.h>  // lines 43-43
- #include <map>  // lines 66-66
- #include "c-lang.h"  // lines 33-33
- #include "demangle.h"  // lines 23-23
- #include "dictionary.h"  // lines 47-47
- #include "gdbsupport/gdb_vecs.h"  // lines 53-53
- #include "psymtab.h"  // lines 58-58

../../../src/binutils-gdb/gdb/ada-lang.c should remove these lines:
- #include <sys/stat.h>  // lines 43-43
- #include <map>  // lines 66-66
- #include "c-lang.h"  // lines 33-33
- #include "demangle.h"  // lines 23-23
- #include "dictionary.h"  // lines 47-47
- #include "gdbsupport/gdb_vecs.h"  // lines 53-53
- #include "psymtab.h"  // lines 58-58

../../../src/binutils-gdb/gdb/ada-valprint.c should remove these lines:
- #include "c-lang.h"  // lines 31-31
- #include "demangle.h"  // lines 26-26
- #include "infcall.h"  // lines 32-32
- #include "objfiles.h"  // lines 33-33
- #include "symtab.h"  // lines 22-22

Remove these includes.  Adding an include for gdbarch.h in
ada-valprint.c was necessary, because gdbarch_byte_order wouldn't be
found anymore.

gdb/ChangeLog:

	* ada-lang.c: Remove includes.
	* ada-typeprint.c: Remove includes.
	* ada-valprint.c: Remove includes.

Change-Id: I07c2f2237ef0ed5fd9aa855d33711d780794fce2
2019-10-29 17:52:15 -04:00
Simon Marchi
90421c5656 addrmap: use gdb_static_assert for type size assertions
These assertions can be done at compile time instead of at runtime.

gdb/ChangeLog:

	* addrmap.c: Add static assertions of type size, moved from
	_initialize_addrmap.
	(_initialize_addrmap): Remove.

Change-Id: If089fc5d620a7168bdcdf967c6c4fecd6696b670
2019-10-29 17:51:36 -04:00
Christian Biesinger
31edb80295 Change some arguments to gdb::string_view instead of name+len
Just some code cleanup. This change has a few benefits:
- Shorter argument list in the functions
- If the caller needs to calculate the string, they no longer
  need to explicitly call strlen
- It is easy to pass std::string to this (done in one place
  currently)

This also updates a couple of places that were passing 0/1 to
a bool parameter.

gdb/ChangeLog:

2019-10-29  Christian Biesinger  <cbiesinger@google.com>

	* coffread.c (record_minimal_symbol): Update.
	(process_coff_symbol): Update.
	* dbxread.c (read_dbx_symtab): Update.
	* dwarf2read.c (add_partial_symbol): Update.
	(fixup_go_packaging): Update.
	(load_partial_dies): Update.
	(new_symbol): Update.
	* elfread.c (record_minimal_symbol): Change signature to use
	gdb::string_view instead of name+len.
	(elf_symtab_read): Update.
	(elf_rel_plt_read): Update.
	* mdebugread.c (parse_partial_symbols): Update.
	(handle_psymbol_enumerators): Update.
	(new_symbol): Update.
	* minsyms.c (minimal_symbol_reader::record_full): Change signature
	to use gdb::string_view instead of name+len.
	* minsyms.h (class minimal_symbol_reader) <record_full>: Likewise.
	* psympriv.h (add_psymbol_to_list): Likewise.
	* psymtab.c (add_psymbol_to_bcache): Likewise.
	(add_psymbol_to_list): Likewise.
	* stabsread.c (define_symbol): Update.
	* symtab.c (symbol_set_names): Change signature to use gdb::string_view.
	* symtab.h (SYMBOL_SET_NAMES): Likewise.
	(symbol_set_names): Likewise.
	* xcoffread.c (scan_xcoff_symtab): Update.

Change-Id: I2675c6865e0368f9c755a1081088a53aa54dda4c
2019-10-29 14:19:59 -05:00
Christian Biesinger
0c921b219c Only make a nullterminated string if we need to
As of 7bb4305982, we no longer need
a nullterminated linkage_name to look up the entry in the hash table.

So this patch makes it so we only make the copy if the entry was
not found.

By auditing all callers of symbol_set_names, I found out that all cases
where the string may not be nullterminated already pass true for COPY_NAME.
So here, I am documenting that as a requirement and am removing the code
that relies on undefined behavior in symbol_set_names (it accessed the string
past the provided length to check for nulltermination). Note that the Ada
case at the beginning of symbol_set_names was already relying on this.

gdb/ChangeLog:

2019-10-29  Christian Biesinger  <cbiesinger@google.com>

	* symtab.h (symbol_set_names): Document that copy_name must be
	set to true for non-nullterminated strings.
	* symtab.c (symbol_set_names): Only make a nullterminated copy of
	linkage_name if the entry was not found and we need to demangle.

Change-Id: I183302e1f51483ff6dff0fd5c3b0f32f0f04a5d2
2019-10-29 14:19:41 -05:00
Christian Biesinger
35e65c49df Replace bsearch with a std::lower_bound-based search
This is more type-safe and can be faster due to inlining and
avoiding overhead from calling through a function pointer.

gdb/ChangeLog:

2019-10-29  Christian Biesinger  <cbiesinger@google.com>

	* Makefile.in (HFILES_NO_SRCDIR): Add gdb_binary_search.h.
	* dwarf2-frame.c (bsearch_fde_cmp): Update.
	(dwarf2_frame_find_fde): Replace bsearch with gdb::binary_search.
	* gdbsupport/gdb_binary_search.h: New file.

Change-Id: I07e0a0e333f4062b27fc68d3a3f24881ebc68fd4
2019-10-29 14:06:26 -05:00
Christian Biesinger
ed2a222951 Load system gdbinit files from a directory
Adds a configure option --with-system-gdbinit-dir to specify a directory
in which to look for gdbinit files.  All files in this directory are
loaded on startup (subject to -n/-nx as usual) as long as the extension
matches a known and enabled scripting language (.gdb/.py/.scm).

This also changes get_ext_lang_of_file to support ".gdb" files, similar
to get_ext_lang_defn's handling of EXT_LANG_GDB.

gdb/ChangeLog:

2019-10-29  Christian Biesinger  <cbiesinger@google.com>

	* NEWS: Mention new --with-system-gdbinit-dir option.
	* config.in: Regenerate.
	* configure: Regenerate.
	* configure.ac: Add new option --with-system-gdbinit-dir.
	* extension.c (get_ext_lang_of_file): Return extension_language_gdb
	for a ".gdb" suffix.
	* main.c (get_init_files): Change system_gdbinit argument to
	a vector and return the files in SYSTEM_GDBINIT_DIR in
	addition to SYSTEM_GDBINIT.
	(captured_main_1): Update.
	(print_gdb_help): Update.
	* top.c (print_gdb_configuration): Also print the value of
	SYSTEM_GDBINIT_DIR.

gdb/doc/ChangeLog:

2019-10-29  Christian Biesinger  <cbiesinger@google.com>

	* Makefile.in: Also set SYSTEM_GDBINIT_DIR for the info manual
	generation.
	* gdb.texinfo (many sections): Document new --with-system-gdbinit-dir
	option.

Change-Id: If233859ecc21bc6421d589b37cd658a3c7d030f2
2019-10-29 13:43:04 -05:00
Christian Biesinger
87f34879e5 Add a string_view version of startswith
Makes sure that the string is longer than prefix, so that strncmp will
do the right thing even if the string is not null-terminated.

For use in my string_view conversion patch:
https://sourceware.org/ml/gdb-patches/2019-10/msg00030.html
https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/125

gdb/ChangeLog:

2019-10-28  Christian Biesinger  <cbiesinger@google.com>

	* gdbsupport/common-utils.h (startswith): Add an overloaded version
	that takes gdb::string_view arguments.

Change-Id: I5389855de2fd70e7065a789a79374b0693651b71
2019-10-28 12:20:13 -05:00
Tom de Vries
30baf67b65 [gdb] Fix more typos in comments (2)
Fix typos in comments.  NFC.

Tested on x86_64-linux.

gdb/ChangeLog:

2019-10-26  Tom de Vries  <tdevries@suse.de>

	* aarch64-linux-tdep.c: Fix typos in comments.
	* aarch64-tdep.c: Same.
	* ada-lang.c: Same.
	* amd64-nat.c: Same.
	* arc-tdep.c: Same.
	* arch/aarch64-insn.c: Same.
	* block.c: Same.
	* breakpoint.h: Same.
	* btrace.h: Same.
	* c-varobj.c: Same.
	* cli/cli-decode.c: Same.
	* cli/cli-script.c: Same.
	* cli/cli-utils.h: Same.
	* coff-pe-read.c: Same.
	* coffread.c: Same.
	* compile/compile-cplus-symbols.c: Same.
	* compile/compile-object-run.c: Same.
	* completer.c: Same.
	* corelow.c: Same.
	* cp-support.c: Same.
	* demangle.c: Same.
	* dwarf-index-write.c: Same.
	* dwarf2-frame.c: Same.
	* dwarf2-frame.h: Same.
	* eval.c: Same.
	* frame-base.h: Same.
	* frame.h: Same.
	* gdbcmd.h: Same.
	* gdbtypes.h: Same.
	* gnu-nat.c: Same.
	* guile/scm-objfile.c: Same.
	* i386-tdep.c: Same.
	* i386-tdep.h: Same.
	* infcall.c: Same.
	* infcall.h: Same.
	* linux-nat.c: Same.
	* m68k-tdep.c: Same.
	* macroexp.c: Same.
	* memattr.c: Same.
	* mi/mi-cmd-disas.c: Same.
	* mi/mi-getopt.h: Same.
	* mi/mi-main.c: Same.
	* minsyms.c: Same.
	* nat/aarch64-sve-linux-sigcontext.h: Same.
	* objfiles.h: Same.
	* ppc-linux-nat.c: Same.
	* ppc-linux-tdep.c: Same.
	* ppc-tdep.h: Same.
	* progspace.h: Same.
	* prologue-value.h: Same.
	* python/py-evtregistry.c: Same.
	* python/py-instruction.h: Same.
	* record-btrace.c: Same.
	* record-full.c: Same.
	* remote.c: Same.
	* rs6000-tdep.c: Same.
	* ser-tcp.c: Same.
	* sol-thread.c: Same.
	* sparc-sol2-tdep.c: Same.
	* sparc64-tdep.c: Same.
	* stabsread.c: Same.
	* symfile.c: Same.
	* symtab.h: Same.
	* target.c: Same.
	* tracepoint.c: Same.
	* tui/tui-data.h: Same.
	* tui/tui-io.c: Same.
	* tui/tui-win.c: Same.
	* tui/tui.c: Same.
	* unittests/rsp-low-selftests.c: Same.
	* user-regs.h: Same.
	* utils.c: Same.
	* utils.h: Same.
	* valarith.c: Same.
	* valops.c: Same.
	* valprint.c: Same.
	* valprint.h: Same.
	* value.c: Same.
	* value.h: Same.
	* varobj.c: Same.
	* x86-nat.h: Same.
	* xtensa-tdep.c: Same.

gdb/gdbserver/ChangeLog:

2019-10-26  Tom de Vries  <tdevries@suse.de>

	* linux-aarch64-low.c: Fix typos in comments.
	* linux-arm-low.c: Same.
	* linux-low.c: Same.
	* linux-ppc-low.c: Same.
	* proc-service.c: Same.
	* regcache.h: Same.
	* server.c: Same.
	* tracepoint.c: Same.
	* win32-low.c: Same.

gdb/stubs/ChangeLog:

2019-10-26  Tom de Vries  <tdevries@suse.de>

	* ia64vms-stub.c: Fix typos in comments.
	* m32r-stub.c: Same.
	* m68k-stub.c: Same.
	* sh-stub.c: Same.

gdb/testsuite/ChangeLog:

2019-10-26  Tom de Vries  <tdevries@suse.de>

	* gdb.base/bigcore.c: Fix typos in comments.
	* gdb.base/ctf-ptype.c: Same.
	* gdb.base/long_long.c: Same.
	* gdb.dwarf2/dw2-op-out-param.S: Same.
	* gdb.python/py-evthreads.c: Same.
	* gdb.reverse/i387-stack-reverse.c: Same.
	* gdb.trace/tfile.c: Same.
	* lib/compiler.c: Same.
	* lib/compiler.cc: Same.

Change-Id: I8573d84a577894270179ae30f46c48d806fc1beb
2019-10-26 09:55:32 +02:00
Ali Tamur
1834d45f0f Fix find_charset_names.
The patch f2aec7f6d1 changed the return type of relocate_gdb_directory to
std::string, but the change is not reflected in find_charset_names function.
(Probably missed because the broken code is behind an #ifdef).

gdb/ChangeLog

	* charset.c (find_charset_names): Reflect API change.
2019-10-25 13:57:05 -07:00
Christian Biesinger
92174eeae8 Revert unintentional change in symtab.c
In the previous commit, I accidentally changed the wrong line;
this reverts it to what it should be.

gdb/ChangeLog:

2019-10-25  Christian Biesinger  <cbiesinger@google.com>

	* symtab.c (symbol_set_names): Revert unintentional change in the
	Ada case.

Change-Id: I9abf174927687e74c7435bd4607aab7f248c6e79
2019-10-25 14:47:19 -05:00
Christian Biesinger
5396ae1717 Don't make an extra copy + allocation of the demangled name
We can just keep around the malloc()-ed name we got from bfd and free
it later.

gdb/ChangeLog:

2019-10-25  Christian Biesinger  <cbiesinger@google.com>

	* symtab.c (struct demangled_name_entry): Change demangled name
	to a unique_xmalloc_ptr<char>, now that we don't allocate it as
	part of the struct anymore.
	(symbol_set_names): No longer obstack allocate + copy the demangled
	name, just store the allocated name from bfd.

Change-Id: Ie6ad50e1e1e73509f55d756f0a437897bb93e3b0
2019-10-25 14:09:02 -05:00
Tom Tromey
93878f4717 Allow out-of-order reads of CIEs
Currently gdb has an assertion that requires CIEs to be read in the
order in which they appear in the debug info:

   gdb_assert (n < 1
               || cie_table->entries[n - 1]->cie_pointer < cie->cie_pointer);

This assertion ensures that the table will be sorted, which is
important because it is later searched using bsearch.

However, a customer provided an executable that causes this assertion
to trigger.  This executable causes decode_frame_entry_1 to call
decode_frame_entry to find the CIE, resulting in an out-of-order read.

I don't know a good way to construct a reproducer, but this can happen
if the FDE appears before its CIE.  See
https://sourceware.org/bugzilla/show_bug.cgi?id=16563

This patch fixes the problem by storing CIEs in an unordered map.  The
CIE table is discarded after the frame section is parsed, so this
seemed both simple and straightforward.

gdb/ChangeLog
2019-10-25  Tom Tromey  <tromey@adacore.com>

	* dwarf2-frame.c (dwarf2_cie_table): Now a typedef.
	(bsearch_cie_cmp, add_cie): Remove.
	(find_cie): Reimplement.
	(decode_frame_entry_1, decode_frame_entry): Change type.  Update.
	(dwarf2_build_frame_info): Update.

Change-Id: I4a99597fa4b1398a9d105b683a36d992d506485c
2019-10-25 08:29:44 -06:00
Tom Tromey
52c64cf72d gdbserver does not need xstrdup
gdbserver has its own implementation of xstrdup.  However, because
gdbserver links against libiberty now, I think this is not needed.
This patch removes it.

gdb/gdbserver/ChangeLog
2019-10-25  Tom Tromey  <tromey@adacore.com>

	* utils.c (xstrdup): Remove.

Change-Id: I2aa56d18d0f9af8e70a00dff431d2fda5705a5d5
2019-10-25 08:22:44 -06:00
Tom de Vries
158da0d12a [gdb/testsuite] Use -wrap and $gdb_test_name in gdb_test_multiple calls (2)
Make gdb_test_multiple calls shorter by using new gdb_test_multiple variable
$gdb_test_name and new gdb_test_multiple pattern flag -wrap.

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2019-10-25  Tom de Vries  <tdevries@suse.de>

	* gdb.reverse/sigall-precsave.exp: Use -wrap and $gdb_test_name in
	gdb_test_multiple calls.
	* gdb.reverse/sigall-reverse.exp: Same.
	* gdb.reverse/solib-precsave.exp: Same.
	* gdb.reverse/solib-reverse.exp: Same.
	* gdb.reverse/until-precsave.exp: Same.
	* gdb.reverse/until-reverse.exp: Same.

Change-Id: I67bb327d069dbc439410996bcfe6c7f905b2ca52
2019-10-25 10:48:12 +02:00
H.J. Lu
7b71fc971b Call forget_cached_source_info to clear the stale source cache
Clear the stale source cache when re-reading symbols.

	PR gdb/25126
	* symfile.c (reread_symbols): Call forget_cached_source_info to
	clear the stale source cache.
2019-10-24 15:43:21 -07:00
Christian Biesinger
cbb5a2ea49 Remove python_has_threads check in configure.ac
The only use of python_has_threads has been removed in
commit 404f29021a

gdb/ChangeLog:

2019-10-24  Christian Biesinger  <cbiesinger@google.com>

	* configure: Rebuild.
	* configure.ac: Remove code that sets python_has_threads.

Change-Id: I75f1b873562bc2abc6f2db17699a3e82fcfd2de3
2019-10-24 14:14:07 -05:00
Christian Biesinger
71737c435d Simplify Python checks in configure.ac
The version checking code is not necessary. It is only used to define
HAVE_LIBPYTHON2_6 or HAVE_LIBPYTHON2_7, which is not used anywhere.

If a version check is desired, the PY_{MAJOR,MINOR}_VERSION macro from
the Python headers can be (and is) used, which does not require updating
configure.ac whenever a new Python version is released.

gdb/ChangeLog:

2019-10-24  Christian Biesinger  <cbiesinger@google.com>

	* config.in: Regenerate.
	* configure: Regenerate.
	* configure.ac: Remove the code that uses sed to get the python
	version and defines HAVE_LIBPYTHON2_6 / HAVE_LIBPYTHON2_7.

Change-Id: I07073870d9040c2bc8519882c8b3c1368edd4513
2019-10-24 13:47:37 -05:00
Tom de Vries
4ccdfbec50 [gdb/testsuite] Add -wrap pattern flag to gdb_test_multiple
Currently, in order to rewrite:
...
gdb_test <command> <pattern> <message>
...
using gdb_test_multiple, we get:
...
gdb_test_multiple <command> <message> {
    -re "\[\r\n\]*(?:<pattern>)\[\r\n\]+$gdb_prompt $" {
    	pass $gdb_test_name
    }
}
...

Add a '-wrap pattern flag to gdb_test_multiple, that wraps the regexp
pattern as gdb_test wraps its message argument.

This allows us to rewrite into the more compact:
...
gdb_test_multiple <command> <message> {
    -re -wrap <pattern> {
        pass $gdb_test_name
    }
}
...

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2019-10-24  Tom de Vries  <tdevries@suse.de>

	* lib/gdb.exp (gdb_test_multiple): Add -wrap pattern flag.
	* gdb.reverse/step-precsave.exp: Rewrite gdb_test_multiple containing
	kfail using -wrap pattern flag and convenience variable
	gdb_test_name.

Change-Id: Ie42c97d5ab7acf6db351299ccd23a83540fe6e1a
2019-10-24 18:43:46 +02:00
Andrew Burgess
33d569b709 gdb/python: Return None from Progspace.block_for_pc on error
The documentation for Progspace.block_for_pc says:

  Return the innermost gdb.Block containing the given pc value. If the
  block cannot be found for the pc value specified, the function will
  return None.

However, the implementation actually throws an error for invalid
addresses, like this:

    (gdb) python print gdb.current_progspace ().block_for_pc (1)
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    RuntimeError: Cannot locate object file for block.
    Error while executing Python code.
    (gdb)

This has been the behaviour since the command was first added (when
the documentation was still as above) in this commit:

    commit f3e9a8177c
    Date:   Wed Feb 24 21:18:28 2010 +0000

Since that commit the code in question has moved around, but the
important parts are largely unchanged.  The function in question is
now in py-progspace.c:pspy_block_for_pc.

Examining the code shows that the real state is more complex than just
the function throws an error instead of returning None, instead the
real situation is:

  1. If we can't find a compilation unit for the $pc value then we
  throw an error, but

  2. If we can find a compilation unit, but can't find a block within
  the compilation unit for the $pc then return None.

I suspect for most users of the Python API this distinction is
irrelevant, and I propose that we standardise on one single failure
mechanism.

Given the function can currently return None in some cases, and is
documented to return None on error, I propose we make that the case
for all error paths, which is what this patch does.

As the Progspace.block_for_pc method is currently untested, I've added
some basic tests including for a call with an invalid $pc.

This is potentially an API breaking change, though an undocumented
part of the API.  Also, users should have been checking and handling a
None return value anyway, so my hope is that this shouldn't be too
disruptive.

gdb/ChangeLog:

	* python/py-progspace.c (pspy_block_for_pc): Return None for all
	error paths.

gdb/testsuite/ChangeLog:

	* gdb.python/py-progspace.exp: Add tests for the
	Progspace.block_for_pc method.

Change-Id: I9cea8d2132902bcad0013d1fd39080dd5423cc57
2019-10-24 15:27:02 +01:00
Tom Tromey
f16f7b7c74 Fix opcodes includes
Now that gdb can unconditionally use a -I pointing at the top of the
source tree, we can remove the ugly "../opcodes/" formulation that was
needed earlier.  This patch adds the -I and cleans up these includes.

gdb/ChangeLog
2019-10-23  Tom Tromey  <tom@tromey.com>

	* arc-tdep.c: Remove ".." from include.
	* frv-tdep.c: Remove ".." from include.
	* lm32-tdep.c: Remove ".." from include.
	* microblaze-tdep.c: Remove ".." from include.
	* or1k-tdep.h: Remove ".." from include.
	* s12z-tdep.c: Remove ".." from include.
	* Makefile.in (OPCODES_CFLAGS): Add comment.
	(TOP_CFLAGS): New variable.
	(INTERNAL_CFLAGS_BASE): Add TOP_CFLAGS.

Change-Id: I21428726d55f9fab0c9da90b56f6664f258cf91a
2019-10-23 15:16:49 -06:00
Tom Tromey
6999161a2a Move readline to the readline/readline subdirectory
readline turns out to be a bit of a stumbling block for the project to
move gdbsupport (and then gdbserver) to the top-level.

The issue is that readline headers are intended to be included with
names like "readline/readline.h".  To support this, gdb effectively
adds a -I option pointing to the top-level source directory -- but,
importantly, this option is not used when the system readline is used.

For gdbsupport, a -I option like this would always be needed, but that
in turn would break the system readline case.  This was PR build/17077,
fixed in commit a8a5dbcab8.

Previously, we had discussed this on the gdb-patches list in terms of
removing readline from the tree

    https://sourceware.org/ml/gdb-patches/2019-09/msg00317.html

However, Eli expressed some concerns, and Joel did as well (off-list).

Given those concerns, and the fact that a patch-free local readline is
relatively new in gdb (it was locally patched for years), I changed my
mind and decided to handle this situation by moving the readline
sources down a level.

That is, upstream readline is now in readline/readline, and the
top-level readline directory just contains the minimal configury
needed to build that.

This fixes the problem because, when gdb unconditionally adds a
-I$(top_srcdir), this will not find readline headers.  A separate -I
will be needed instead, which is exactly what's needed for
--with-system-readline.

gdb/ChangeLog
2019-10-23  Tom Tromey  <tom@tromey.com>

	* Makefile.in (READLINE_DIR): Update.

gdb/doc/ChangeLog
2019-10-23  Tom Tromey  <tom@tromey.com>

	* Makefile.in (READLINE_DIR): Update.

readline/ChangeLog
2019-10-23  Tom Tromey  <tom@tromey.com>

	Move old contents to readline/ subdirectory.
	* aclocal.m4, configure, configure.ac, .gitignore, Makefile.am,
	Makefile.in, README: New files.

Change-Id: Ice156a2ee09ea68722b48f64d97146d7428ea9e4
2019-10-23 15:16:48 -06:00
Tankut Baris Aktemur
12e7c35ec3 infcall: refactor 'call_function_by_hand_dummy'
Extract out the code region that reserves stack space to a separate
function.

Fix the comment of 'call_function_by_hand_dummy' to remove reference
to the NARGS argument that was removed in commit (e71585ffe2 "Use
gdb:array_view in call_function_by_hand & friends").

gdb/ChangeLog:
2019-10-23  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

	* infcall.c (call_function_by_hand_dummy): Fix the function
	comment.  And extract out a code section into...
	(reserve_stack_space): ...this new function.

Change-Id: I8938ef4134aff68a0a21724aaa2406bfe453438a
2019-10-23 20:58:42 +02:00
Tankut Baris Aktemur
37055cada8 infcall: remove unused parameter in 'value_arg_coerce'
Remove the unused SP parameter from the auxiliary function
'value_arg_coerce'.

gdb/ChangeLog:
2019-10-23  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

	* infcall.c (value_arg_coerce): Remove an unused parameter.
	(call_function_by_hand_dummy): Update the call to
	'value_arg_coerce'.

Change-Id: If324a1dda3fa5d4c145790b92bd3f656c00296f4
2019-10-23 20:40:02 +02:00
Tankut Baris Aktemur
39bcc47c7e infcall: move assertions in 'call_function_by_hand_dummy' to an earlier spot
This is a refactoring that performs type assertions on the callee
function at the beginning of 'call_function_by_hand_dummy' rather than
at a later point so that

- the checks are grouped together at the beginning of the function for
improved readability, and

- we don't have to align and push things on the stack only to find out
later that the function call is illegal.

gdb/ChangeLog:
2019-10-23  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

	* infcall.c (call_function_by_hand_dummy): Refactor.

Change-Id: I411ac083ac6a9ee6eb93c4b82393a81a4fc927be
2019-10-23 20:40:02 +02:00
Tankut Baris Aktemur
bd888c0fe2 Add myself to the gdb/MAINTAINERS write-after-approval list
gdb/ChangeLog:
2019-10-23  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

	* MAINTAINERS (Write After Approval): Add Tankut Baris Aktemur.
2019-10-23 20:40:01 +02:00
Christian Biesinger
14796d2978 Add a note for how to get the list of threads
It's not immediately obvious how to get the list of threads,
so add a note about that in the "Threads in Python" section.

gdb/doc/ChangeLog:

2019-10-23  Christian Biesinger  <cbiesinger@google.com>

	* python.texi (Threads In Python): Add a note for how to get the
	list of threads.

Change-Id: I0fef8a7aff161fc347c09052319048c907a6e8c3
2019-10-23 11:27:28 -05:00
Tom Tromey
c12d372d26 Check for sigprocmask in common.m4
I noticed that gdbsupport uses HAVE_SIGPROCMASK, but common.m4 does
not check for it.  This means that gdbserver may not compile some
gdbsupport code properly.  This patch fixes this error.

gdb/ChangeLog
2019-10-23  Tom Tromey  <tom@tromey.com>

	* configure: Rebuild.
	* configure.ac: Don't check for sigprocmask.
	* gdbsupport/common.m4 (GDB_AC_COMMON): Check for sigprocmask.

gdb/gdbserver/ChangeLog
2019-10-23  Tom Tromey  <tom@tromey.com>

	* configure, config.in: Rebuild.

Change-Id: I2c0a4dd2c376507b9483b38707a242382faa8163
2019-10-23 09:06:21 -06:00
Tom Tromey
4d0b984b97 Use m4_include, not sinclude in .m4 files
Pedro pointed out that sinclude does not error if a file is missing.
This patch changes gdb to only use m4_include, which seems more
correct.

gdb/ChangeLog
2019-10-23  Tom Tromey  <tom@tromey.com>

	* configure: Rebuild.
	* acinclude.m4: Use m4_include, not sinclude.

gdb/gdbserver/ChangeLog
2019-10-23  Tom Tromey  <tom@tromey.com>

	* configure: Rebuild.
	* acinclude.m4: Use m4_include, not sinclude.

gdb/testsuite/ChangeLog
2019-10-23  Tom Tromey  <tom@tromey.com>

	* configure: Rebuild.
	* aclocal.m4: Use m4_include, not sinclude.

Change-Id: I970362e0af7875f9f72796401126acf0ff6dba11
2019-10-23 09:06:20 -06:00
Tom de Vries
7e785608ce [gdb/breakpoints] Fix fullname.exp when run from symlink dir
I run into this error with gdb.base/fullname.exp:
...
(gdb) file /data/gdb_versions/devel/build/gdb/testsuite/outputs/\
  gdb.base/fullname/fullname
Reading symbols from /data/gdb_versions/devel/build/gdb/testsuite/outputs/\
  gdb.base/fullname/fullname...
(gdb) break /data/gdb_versions/devel/build/gdb/testsuite/\
  outputs/gdb.base/fullname/tmp-fullname.c:21
No source file named /data/gdb_versions/devel/build/gdb/testsuite/outputs/\
  gdb.base/fullname/tmp-fullname.c.
Make breakpoint pending on future shared library load? (y or [n]) n
(gdb) FAIL: gdb.base/fullname.exp: set breakpoint by full path before loading symbols - built relative
...

The FAIL is due to this comparison in iterate_over_some_symtabs failing:
...
481                   if (FILENAME_CMP (real_path, fullname) == 0)
(gdb) p real_path
$2 = 0x1a201f0 "/data/gdb_versions/devel/build/gdb/testsuite/outputs/\
  gdb.base/fullname/tmp-fullname.c"
(gdb) p fullname
$3 = 0x1a1de80 "/home/vries/gdb_versions/devel/build/gdb/testsuite/outputs/\
  gdb.base/fullname/tmp-fullname.c"
...

The difference in pathnames is due to having a symlink dir:
...
$ ls -la /home/vries/gdb_versions
lrwxrwxrwx 1 vries users 18 26 jun  2018 /home/vries/gdb_versions -> /data/gdb_versions
...
and the test passses when eliminating it:
...
$ ( cd $(pwd -P); make check RUNTESTFLAGS=gdb.base/fullname.exp )
...

The FAIL is a regression from commit a0c1ffedcf "Only compute realpath when
basenames_may_differ is set".  Before, find_and_open_source was returning a
real-path, resulting in variable 'fullname' being the same as varible
'real_path' in the comparison listed above.  But after, that's no longer the
case.

Fix the FAIL by applying gdb_realpath on the fullname variable before the
comparison.

Tested on x86_64-linux.

I wasn't able to write a test-case.  The FAIL starts at:
...
$ cd build/gdb
$ mv testsuite testsuite.bla
$ ln -s testsuite.bla testsuite
...
but already this doesn't trigger it anymore:
...
$ cd build/gdb/outputs
$ mv outputs outputs.bla
$ ln -s outputs.bla outputs
...

gdb/ChangeLog:

2019-10-23  Tom de Vries  <tdevries@suse.de>

	PR breakpoints/24687
	* symtab.c (iterate_over_some_symtabs): Apply gdb_realpath on fullname.

Change-Id: I1ace62a234458781e958980f3b425edf1490df27
2019-10-23 09:33:46 +02:00
Christian Biesinger
403772ef61 Make demangled_name_entry::language not a bitfield
Having it as a bitfield causes extra work, and this is not memory-sensitive.
Furthermore, once https://sourceware.org/ml/gdb-patches/2019-10/msg00812.html
lands, the bitfield won't even save any memory at all.

gdb/ChangeLog:

2019-10-22  Christian Biesinger  <cbiesinger@google.com>

	* symtab.c (struct demangled_name_entry) <language>: Change from
	bitfield to regular variable.

Change-Id: I4ea31d1cfcbe0f09a09bd058cd304862308dc388
2019-10-22 15:36:37 -05:00
Christian Biesinger
3a49427939 Fix compile error & incorrect push
I accidentally pushed the wrong version of the patch for commit
7bb4305982 (where the review
comments were not fixed), and I did a bad conflict resolution
for ccb1ba6229 leading to a
compile error when libxxhash is available. This fixes both
issues.

gdb/ChangeLog:

2019-10-22  Christian Biesinger  <cbiesinger@google.com>

	* symtab.c (struct demangled_name_entry): Add a constructor.
	(free_demangled_name_entry): New function to call the destructor
	for demangled_name_entry.
	(create_demangled_names_hash): Pass free_demangled_name_entry to
	htab_create_alloc.
	(symbol_set_names): Call placement new for demangled_name_entry.
	* utils.c: No longer include xxhash.h here, now that fast_hash
	is inlined in the header.
	* utils.h: Instead, include it here.

Change-Id: If776099d39a65a12733d42efcb859feca1b07a39
2019-10-22 13:41:12 -05:00
Christian Biesinger
ccb1ba6229 Use libxxhash for hashing, if present
XXHash is faster than htab_hash_string:
------------------------------------------------------------
Benchmark                     Time           CPU Iterations
------------------------------------------------------------
BM_xxh3                      11 ns         11 ns   65887249
BM_xxh32                     19 ns         19 ns   36511877
BM_xxh64                     16 ns         16 ns   42964585
BM_hash_string              182 ns        182 ns    3853125
BM_iterative_hash            77 ns         77 ns    9087638

Unfortunately, XXH3 is still experimental (see
https://github.com/Cyan4973/xxHash#user-content-new-experimental-hash-algorithm)

However, regular XXH64 is still a lot faster than
htab_hash_string per my benchmark above. I used the
following string for the benchmark:
static constexpr char str[] = "_ZZZL13make_gdb_typeP7gdbarchP10tdesc_typeEN16gdb_type_creator19make_gdb_type_flagsEPK22tdesc_type_with_fieldsE19__PRETTY_FUNCTION__";

htab_hash_string is currently 4.35% + 7.98% (rehashing) of gdb
startup when attaching to Chrome's content_shell.

An additional 5.21% is spent in msymbol_hash, which does not use
this hash function. Unfortunately, since it has to lowercase the
string, it can't use this hash function.
BM_msymbol_hash                52 ns         52 ns   13281495

It may be worth investigating if strlen+XXHash is still faster than
htab_hash_string, which would make it easier to use in more places.

Debian ships xxhash as libxxhash{0,-dev}. Fedora ships it as xxhash-devel.

gdb/ChangeLog:

2019-10-22  Christian Biesinger  <cbiesinger@google.com>

	* Makefile.in: Link with libxxhash.
	* config.in: Regenerate.
	* configure: Regenerate.
	* configure.ac: Search for libxxhash.
	* utils.c (fast_hash): Use xxhash if present.

Change-Id: Icab218388b9f829522ed3977f04301ae6d4fc4ca
2019-10-22 11:47:24 -05:00
Christian Biesinger
1a6ff1a96b Add a fast_hash function in common-utils
Also updates a caller in symtab.c. For now this just calls htab_hash_string
but the next patch will change it to xxhash, if available.

gdb/ChangeLog:

2019-10-22  Christian Biesinger  <cbiesinger@google.com>

	* utils.h (fast_hash): New function.
	* symtab.c (hash_demangled_name_entry): Call new function
	fast_hash.

Change-Id: I77cac0d9aa78fc65316a2af449f52edcae72dc9b
2019-10-22 11:26:17 -05:00
Christian Biesinger
7bb4305982 Store the mangled name as a string_view
This should be a bit faster (because we can compare the size first),
but it is also a dependency for the next patch.

(3.47% of gdb startup time is spent in eq_demangled_name_entry when
attaching to Chrome's content_shell binary)

gdb/ChangeLog:

2019-10-22  Christian Biesinger  <cbiesinger@google.com>

	* symtab.c (struct demangled_name_entry): Change type of mangled
	to gdb::string_view. Also adds a constructor that takes the
	mangled name.
	(hash_demangled_name_entry): Update.
	(eq_demangled_name_entry): Update.
	(free_demangled_name_entry): New function to call the destructor
	now that this is not a POD anymore.
	(create_demangled_names_hash): Pass free_demangled_name_entry to
	htab_create_alloc.
	(symbol_set_names): Update.

Change-Id: I24711ae2bcaa9e79ca89a6f8fda385d400419175
2019-10-22 11:25:31 -05:00
Ali Tamur
7ba99d2188 DWARF 5 support: Handle line table and file indexes
*  Fix handling of file and directory indexes in line tables; in DWARF 5 the
indexes are zero-based. Make file_names field private to abstract this detail
from the clients. Introduce file_names, is_valid_file_index and
file_names_size methods. Reflect these changes in clients.
*  Handle DW_FORM_data16 in read_formatted_entries; it is used to record MD5
of the file entries in DWARF 5.
*  Fix a bug in line header parsing that calculates the length of the header
incorrectly. (Seemingly this manifests itself only in DWARF 5).

Tested with CC=/usr/bin/gcc (version 8.3.0) against master branch (also with
-gsplit-dwarf and -gdwarf-4 flags) and there was no increase in the set of
tests that fails. (gdb still cannot debug a 'hello world' program with DWARF 5,
so for the time being, this is all we care about).

This is part of an effort to support DWARF 5 in gdb.

gdb/ChangeLog:

	* dwarf2read.c (dir_index): Change type.
	(file_name_index): Likewise.
	(line_header::include_dir_at): Change comment and implementation on
	whether it is DWARF 5.
	(line_header::is_valid_file_index): New function.
	(line_header::file_name_at): Change comment and implementation on
	whether it is DWARF 5.
	(line_header::file_names): Change to private field renamed as
	m_file_names and introduce a new accessor method.
	(line_header::file_names_size): New method.
	(line_header::include_dirs): Change to private field and rename as
	m_include_dirs.
	(dw2_get_file_names_reader): Define local var at a smaller scope and
	reflect API change.
	(dwarf2_cu::setup_type_unit_groups): Reflect API change.
	(process_structure_scope): Likewise.
	(line_header::add_include_dir): Change message and reflect renaming.
	(line_header::add_file_name): Likewise.
	(read_formatted_entries): Handle DW_FORM_data16.
	(dwarf_decode_line_header): Fix line header length calculation.
	(psymtab_include_file_name): Change comment and API.
	(lnp_state_machine::m_file): Update comment and reflect type change.
	(lnp_state_machine::record_line): Reflect type change.
	(dwarf_decode_lines): Reflect API change.
	(file_file_name): Likewise.
	(file_full_name): Likewise.
2019-10-21 14:22:12 -07:00
Andrew Burgess
45f47c3a25 gdb: Ensure that !(a < a) is true in sort_cmp on obj_section objects
After the switch to use std::sort, if GDB is compiled with the
-D_GLIBCXX_DEBUG=1 flag then we see an error when using sort_cmp (in
objfiles.c) to sort obj_section objects.

The problem is that std::sort checks that the condition !(a < a)
holds, and currently this is not true.  GDB's sort_cmp is really
designed to sort lists in which no obj_section repeats, however, there
is some code in place to try and ensure we get a stable sort order if
there is a bug in GDB, unfortunately this code fails the above check.

By reordering some of the checks inside sort_cmp, it is pretty easy to
ensure that the !(a < a) condition holds.

I've not bothered to make this condition check optimal, like I said
this code is only in place to ensure that we get stable results if GDB
goes wrong, so I've made the smallest change needed to get the correct
behaviour.

After this commit I see no regressions when running GDB compiled with
-D_GLIBCXX_DEBUG=1.

gdb/ChangeLog:

	* objfiles.c (sort_cmp): Ensure that !(a < a) holds true.

Change-Id: I4b1e3e1640865104c0896cbb6c3fdbbc04d9645b
2019-10-21 21:10:02 +01:00
Tom Tromey
e5f3c0e3b8 Remove tui_exec_info_content
I happened to notice that the tui_exec_info_content typedef is unused.
This patch removes it.  Tested by rebuilding.

gdb/ChangeLog
2019-10-21  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.h (tui_exec_info_content): Remove typedef.

Change-Id: I768edc482366e830eb4528c799686bb27518cdcb
2019-10-21 09:26:39 -06:00
Tom Tromey
a0a461e5b4 Fix creation of nm.h when configure is changed
My earlier patch -- commit c5adaa192 ("Fix creation of stamp-h by
gdb's configure script") -- broke the creation of nm.h.  In
particular, configure removes nm.h, so if you touch configure and
rebuild, nothing will re-create the link, breaking the build.

This patch fixes the bug, and also updates configure.ac to use
AC_CONFIG_LINKS, rather than the obsolete AC_LINK_FILES.

Finally, I noticed that gcore is in generated_files in the
Makefile.in.  I think this is incorrect, as generated_files is only
needed for files that can be the target of a #include.  So, this patch
removes it.

gdb/ChangeLog
2019-10-21  Tom Tromey  <tom@tromey.com>

	* configure.ac (nm.h): Conditionally create nm.h link.  Subst
	NM_H.   Use AC_CONFIG_LINKS.
	* configure: Rebuild.
	* Makefile.in (NM_H): New variable.
	(generated_files): Add NM_H.  Remove gcore.
	(nm.h, stamp-nmh): New targets.

Change-Id: I8dd539785d52455e85389425e4bb996c8a127a0e
2019-10-21 07:45:30 -06:00
Tom de Vries
94cb375411 [gdb/testsuite] Compile infcall-nested-structs.exp with -O2
As mentioned in commit 745ff14e6e "[gdb/tdep] Fix 'Unexpected register class'
assert in amd64_push_arguments", of the 12 KFAILs added there, 3 are KPASSing
with g++ 4.8.5.

The KPASSes are due to:
- gdb incorrectly expecting the second half of the result of function
  rtn_str_struct_02_01 in register %rdx.
- rtn_str_struct_02_01 using %rdx as a temporary, thereby accidentally setting
  it to the expected value.

Reduce the chance of hiding errors due accidental register settings by
compiling the test-case with -O2.

This fixes the KPASSes when applied on top of commit 745ff14e6e.

Tested on x86_64-linux.

Tested with g++ 4.8.5, 7.4.1, 8.3.1, 9.2.1.

gdb/testsuite/ChangeLog:

2019-10-21  Tom de Vries  <tdevries@suse.de>

	* gdb.base/infcall-nested-structs.c: Add
	__attribute__((noinline,noclone)) to all functions.
	(call_all): Add missing variable initialization.  Simplify return value.
	(breakpt): Increment volatile variable, to prevent call from being
	optimized out.
	* gdb.base/infcall-nested-structs.exp: Compile with -O2.

Change-Id: Ic027e1c957fecd6686345639db99f5eaee3cdf05
2019-10-21 15:08:54 +02:00
Tom Tromey
54d83b8d39 Make unlink_objfile and put_objfile_before static
I noticed an obsolete comment just before unlink_objfile, and then I
noticed that both unlink_objfile and put_objfile_before could be
static.  This patch makes these changes, and also moves unlink_objfile
earlier, so that a forward declaration is not needed.

Tested by rebuilding.

gdb/ChangeLog
2019-10-20  Tom Tromey  <tom@tromey.com>

	* objfiles.h (unlink_objfile, put_objfile_before): Don't declare.
	* objfiles.c (unlink_objfile): Move earlier.  Now static.  Remove
	obsolete comment.
	(put_objfile_before): Now static.

Change-Id: I1b5927a60fd1cc59bfc9c6761f61652a01ef13e0
2019-10-20 20:54:06 -06:00
Simon Marchi
2377111731 gdb: Make startswith return a bool
gdb/ChangeLog:

	* gdbsupport/common-utils.h (startswith): Change return type to
	bool.

Change-Id: I1c11b9bb7f89b3885c1bb55097adb5be6d333ad4
2019-10-19 17:01:09 -04:00
Christian Biesinger
39ef2f6256 Replace some more qsort calls with std::sort
This has better typesafety, avoids a function pointer indirection,
and can benefit from inlining.

gdb/ChangeLog:

2019-10-19  Christian Biesinger  <cbiesinger@google.com>

	* bcache.c (bcache::print_statistics): Use std::sort instead of qsort.
	* breakpoint.c (bp_locations_compare): Rename to...
	(bp_location_is_less_than): ...this, and change to std::sort semantics.
	(update_global_location_list): Use std::sort instead of qsort.
	* buildsym.c (compare_line_numbers): Rename to...
	(lte_is_less_than): ...this, and change to std::sort semantics.
	(buildsym_compunit::end_symtab_with_blockvector): Use std::sort
	instead of qsort.
	* disasm.c (compare_lines): Rename to...
	(line_is_less_than): ...this, and change to std::sort semantics.
	(do_mixed_source_and_assembly_deprecated): Call std::sort instead
	of qsort.
	* dwarf2-frame.c (qsort_fde_cmp): Rename to...
	(fde_is_less_than): ...this, and change to std::sort semantics.
	(dwarf2_build_frame_info): Call std::sort instead of qsort.
	* mdebugread.c (compare_blocks):
	(block_is_less_than): ...this, and change to std::sort semantics.
	(sort_blocks): Call std::sort instead of qsort.
	* objfiles.c (qsort_cmp): Rename to...
	(sort_cmp): ...this, and change to std::sort semantics.
	(update_section_map): Call std::sort instead of qsort.
	* remote.c (compare_pnums): Remove.
	(map_regcache_remote_table): Call std::sort instead of qsort.
	* utils.c (compare_positive_ints): Remove.
	* utils.h (compare_positive_ints): Remove.
	* xcoffread.c (compare_lte): Remove.
	(arrange_linetable): Call std::sort instead of qsort.

Change-Id: Ibcddce12a3d07448701e731b7150fa23611d86de
2019-10-19 15:45:33 -05:00
Sergio Durigan Junior
f71433ee7f Fix typos in symfile.c and i386-darwin-tdep.c
This commit fixes two simple typos, one in gdb/symfile.c and the other
in gdb/i386-darwin-tdep.c.  s/wether/whether/.

2019-10-19  Sergio Durigan Junior  <sergiodj@redhat.com>

	* symfile.c (init_entry_point_info): Fix typo.
	* i386-darwin-tdep.c (darwin_dwarf_signal_frame_p): Fix typo.

Change-Id: I1fbb39c32009c61c862b6bd56ce12f24a9edb2c4
2019-10-19 01:10:09 -04:00
Tom de Vries
85102364b2 [gdb] Fix more typos in comments
Fix typos in comments.  NFC.

Tested on x86_64-linux.

gdb/ChangeLog:

2019-10-18  Tom de Vries  <tdevries@suse.de>

	* aarch64-tdep.c: Fix typos in comments.
	* ada-lang.c: Same.
	* ada-tasks.c: Same.
	* alpha-tdep.c: Same.
	* alpha-tdep.h: Same.
	* amd64-nat.c: Same.
	* amd64-windows-tdep.c: Same.
	* arc-tdep.c: Same.
	* arc-tdep.h: Same.
	* arch-utils.c: Same.
	* arm-nbsd-tdep.c: Same.
	* arm-tdep.c: Same.
	* ax-gdb.c: Same.
	* blockframe.c: Same.
	* btrace.c: Same.
	* c-varobj.c: Same.
	* coff-pe-read.c: Same.
	* coffread.c: Same.
	* cris-tdep.c: Same.
	* darwin-nat.c: Same.
	* dbxread.c: Same.
	* dcache.c: Same.
	* disasm.c: Same.
	* dtrace-probe.c: Same.
	* dwarf-index-write.c: Same.
	* dwarf2-frame-tailcall.c: Same.
	* dwarf2-frame.c: Same.
	* dwarf2read.c: Same.
	* eval.c: Same.
	* exceptions.c: Same.
	* fbsd-tdep.c: Same.
	* findvar.c: Same.
	* frame.c: Same.
	* frv-tdep.c: Same.
	* gnu-v3-abi.c: Same.
	* go32-nat.c: Same.
	* h8300-tdep.c: Same.
	* hppa-tdep.c: Same.
	* i386-linux-tdep.c: Same.
	* i386-tdep.c: Same.
	* ia64-libunwind-tdep.c: Same.
	* ia64-tdep.c: Same.
	* infcmd.c: Same.
	* infrun.c: Same.
	* linespec.c: Same.
	* linux-nat.c: Same.
	* linux-thread-db.c: Same.
	* machoread.c: Same.
	* mdebugread.c: Same.
	* mep-tdep.c: Same.
	* mn10300-tdep.c: Same.
	* namespace.c: Same.
	* objfiles.c: Same.
	* opencl-lang.c: Same.
	* or1k-tdep.c: Same.
	* osabi.c: Same.
	* ppc-linux-nat.c: Same.
	* ppc-linux-tdep.c: Same.
	* ppc-sysv-tdep.c: Same.
	* printcmd.c: Same.
	* procfs.c: Same.
	* record-btrace.c: Same.
	* record-full.c: Same.
	* remote-fileio.c: Same.
	* remote.c: Same.
	* rs6000-tdep.c: Same.
	* s12z-tdep.c: Same.
	* score-tdep.c: Same.
	* ser-base.c: Same.
	* ser-go32.c: Same.
	* skip.c: Same.
	* sol-thread.c: Same.
	* solib-svr4.c: Same.
	* solib.c: Same.
	* source.c: Same.
	* sparc-nat.c: Same.
	* sparc-sol2-tdep.c: Same.
	* sparc-tdep.c: Same.
	* sparc64-tdep.c: Same.
	* stabsread.c: Same.
	* stack.c: Same.
	* symfile.c: Same.
	* symtab.c: Same.
	* target-descriptions.c: Same.
	* target-float.c: Same.
	* thread.c: Same.
	* utils.c: Same.
	* valops.c: Same.
	* valprint.c: Same.
	* value.c: Same.
	* varobj.c: Same.
	* windows-nat.c: Same.
	* xcoffread.c: Same.
	* xstormy16-tdep.c: Same.
	* xtensa-tdep.c: Same.

Change-Id: I5175f1b107bfa4e1cdd4a3361ccb4739e53c75c4
2019-10-18 02:48:08 +02:00
Tom Tromey
c5adaa1921 Fix creation of stamp-h by gdb's configure script
I happened to notice that "make" would always print:

    CONFIG_HEADERS=config.h:config.in \
      CONFIG_COMMANDS="default depdir" \
      CONFIG_FILES= \
      CONFIG_LINKS= \
      /bin/sh config.status
    config.status: creating config.h
    config.status: config.h is unchanged

on every rebuild.  This seems to have changed due to an autoconf
upgrade at some point in the past.  In the autoconf gdb uses now, it
works to use AC_CONFIG_HEADERS and then create the stamp file via the
"commands" argument.

This patch also fixes up Makefile.in to use the new-style
config.status invocation.  It's no longer necessary to pass the output
file names via environment variables.

gdb/ChangeLog
2019-10-17  Tom Tromey  <tromey@adacore.com>

	* configure: Rebuild.
	* configure.ac: Use AC_CONFIG_HEADERS.  Create stamp-h there, not
	in AC_CONFIG_FILES invocation.
	* Makefile.in (Makefile, data-directory/Makefile, stamp-h): Use
	new-style config.status invocation.

gdb/gdbserver/ChangeLog
2019-10-17  Tom Tromey  <tromey@adacore.com>

	* configure: Rebuild.
	* configure.ac: Use AC_CONFIG_HEADERS.  Create stamp-h there, not
	in AC_CONFIG_FILES invocation.
	* Makefile.in (stamp-h, Makefile): Use new-style config.status
	invocation.

Change-Id: Ia0530d1c5b9756812d29ddb8dc1062326155e61e
2019-10-17 13:21:24 -06:00
Tom de Vries
405feb71d4 [gdb] Fix typos in comments
Fix typos in comments.  NFC.

Tested on x86_64-linux.

gdb/ChangeLog:

2019-10-17  Tom de Vries  <tdevries@suse.de>

	* arm-nbsd-nat.c: Fix typos in comments.
	* arm-tdep.c: Same.
	* darwin-nat-info.c: Same.
	* dwarf2read.c: Same.
	* elfread.c: Same.
	* event-top.c: Same.
	* findvar.c: Same.
	* gdbtypes.c: Same.
	* hppa-tdep.c: Same.
	* i386-tdep.c: Same.
	* jit.c: Same.
	* main.c: Same.
	* mdebugread.c: Same.
	* moxie-tdep.c: Same.
	* nto-procfs.c: Same.
	* osabi.c: Same.
	* ppc-linux-tdep.c: Same.
	* remote.c: Same.
	* riscv-tdep.c: Same.
	* s390-tdep.c: Same.
	* sh-tdep.c: Same.
	* sparc-linux-tdep.c: Same.
	* sparc-nat.c: Same.
	* stack.c: Same.
	* target-descriptions.c: Same.
	* top.c: Same.
	* varobj.c: Same.

Change-Id: I6047967abd2d51c9000dea15184d19f4e952c3ff
2019-10-17 18:06:36 +02:00
Tom de Vries
062f1fc13a [gdb/testsuite] Fix gdb.fortran/module.exp for debug info from other files
On openSUSE Leap 15.1, I get:
...
FAIL: gdb.fortran/module.exp: info variables -n
...
because the info variables command prints info also for init.c:
...
File init.c:^M
24:     const int _IO_stdin_used;^M
...
while the regexps in the test-case only expect info for module.f90.

Fix this by extending the regexps.

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2019-10-17  Tom de Vries  <tdevries@suse.de>

	* gdb.fortran/module.exp: Allow info variables to print info for files
	other than module.f90.

Change-Id: I401d8018b121fc7343f6bc8b671900349462457f
2019-10-17 10:07:05 +02:00
Tom Tromey
befcd486f4 Constify objfile::original_name
I noticed that objfile::original_name could be a "const char *" rather
than a plain "char *".  This patch implements this change.  Tested by
rebuilding.

gdb/ChangeLog
2019-10-16  Tom Tromey  <tom@tromey.com>

	* objfiles.h (struct objfile) <original_name>: Now const.
2019-10-16 20:44:21 -06:00
Andrew Burgess
0b54364d92 gdb/fortran: Add test for module variables in 'info variables' output
Recent work from Tom Tromey to better handle variables with associated
copy relocations has fixed a Fortran issue where module variables
wouldn't show up in the output of 'info variables'.

This commit adds a test for this functionality to ensure it doesn't
get broken in the future.

gdb/testsuite/ChangeLog:

	* gdb.fortran/module.exp: Extend with 'info variables' test.

Change-Id: I7306b1d0a9a72947fd48ad7a03f49df774d6573b
2019-10-16 22:22:09 +01:00
Andrew Burgess
7ff5fae704 gdb/testsuite: Allow cc-with-tweaks board file to be used with Fortran
The board file cc-with-tweaks is used as the core for lots of other
board files, for example cc-with-gdb-index and cc-with-debug-names.
This commit extends cc-with-tweaks so that it will wrap the Fortran
compiler, allowing for more test coverage.

I tested all of the board files that make use of cc-with-tweaks
running the gdb.fortran/*.exp test set, and in some cases I did see
extra failures.  The "standard" results are:

                    === gdb Summary ===

    # of expected passes            953
    # of known failures             2

With board file 'cc-with-dwz-m':

                    === gdb Summary ===

    # of expected passes            903
    # of unexpected failures        1
    # of known failures             2
    # of untested testcases         4

With board file 'dwarf4-gdb-index':

                    === gdb Summary ===

    # of expected passes            950
    # of unexpected failures        3
    # of known failures             2

With board file 'fission-dwp':

                    === gdb Summary ===

    # of expected passes            949
    # of unexpected failures        4
    # of known failures             2

Despite these extra failure I don't think this should prevent this
change going in as these failures presumably already exist in GDB.

gdb/testsuite/ChangeLog:

	* boards/cc-with-tweaks.exp: Setup F90_FOR_TARGET and
	F77_FOR_TARGET.

Change-Id: I06d412f94d0e119ad652dd6c20829f6705a54622
2019-10-16 22:22:09 +01:00
Christian Biesinger
17bfe554b9 Allow not saving the signal state in SIGSETJMP
Saving the signal state is very slow (this patch is a 14% speedup).  The
reason we need this code is because signal handler will leave the
signal blocked when we longjmp out of it.  But in this case we can
just manually unblock the signal instead of taking the unconditional
perf hit.

gdb/ChangeLog:

2019-10-16  Christian Biesinger  <cbiesinger@google.com>

	* gdbsupport/gdb_setjmp.h (SIGSETJMP): Allow passing in the value to
	pass on to sigsetjmp's second argument.
	* cp-support.c (gdb_demangle): Unblock SIGSEGV if we caught a crash.

Change-Id: Ib3010966050c64b4cc8b47d8cb45871652b0b3ea
2019-10-16 16:13:43 -05:00
Keith Seitz
950b74950f DWARF reader: Reject sections with invalid sizes
This is another fuzzer bug, gdb/23567.  This time, the fuzzer has
specifically altered the size of .debug_str:

$ eu-readelf -S objdump
Section Headers:
[Nr] Name                 Type         Addr             Off      Size     ES Flags Lk Inf Al
[31] .debug_str           PROGBITS     0000000000000000 0057116d ffffffffffffffff  1 MS     0   0  1

When this file is loaded into GDB, the DWARF reader crashes attempting
to access the string table (or it may just store a bunch of nonsense):

[gdb-8.3-6-fc30]
$ gdb -nx -q objdump
BFD: warning: /path/to/objdump has a corrupt section with a size (ffffffffffffffff) larger than the file size
Reading symbols from /path/to/objdump...
Segmentation fault (core dumped)

Nick has already committed a BFD patch to issue the warning seen above.

[gdb master 6acc1a0b]
$ gdb -BFD: warning: /path/to/objdump has a corrupt section with a size (ffffffffffffffff) larger than the file size
Reading symbols from /path/to/objdump...
(gdb) inf func
All defined functions:

File ./../include/dwarf2.def:
186:	const

              8 *>(.:
                     ;'@�B);
747:	const

              8 *�(.:
                     ;'@�B);
701:	const

              8 *�D �
                     (.:
                        ;'@�B);
71:	const

              8 *(.:
                    ;'@�B);
/* and more gibberish  */

Consider read_indirect_string_at_offset_from:

static const char *
read_indirect_string_at_offset_from (struct objfile *objfile,
                                     bfd *abfd, LONGEST str_offset,
                                     struct dwarf2_section_info *sect,
                                     const char *form_name,
                                     const char *sect_name)
{
  dwarf2_read_section (objfile, sect);
  if (sect->buffer == NULL)
    error (_("%s used without %s section [in module %s]"),
           form_name, sect_name, bfd_get_filename (abfd));
  if (str_offset >= sect->size)
    error (_("%s pointing outside of %s section [in module %s]"),
           form_name, sect_name, bfd_get_filename (abfd));
  gdb_assert (HOST_CHAR_BIT == 8);
  if (sect->buffer[str_offset] == '\0')
    return NULL;
  return (const char *) (sect->buffer + str_offset);
}

With sect_size being ginormous, the code attempts to access
sect->buffer[GINORMOUS], and depending on the layout of memory,
GDB either stores a bunch of gibberish strings or crashes.

This is an attempt to mitigate this by implementing a similar approach
used by BFD. In our case, we simply reject the section with the invalid
length:

$ ./gdb -nx -q objdump
BFD: warning: /path/to/objdump has a corrupt section with a size (ffffffffffffffff) larger than the file size
Reading symbols from /path/to/objdump...

warning: Discarding section .debug_str which has a section size (ffffffffffffffff) larger than the file size [in module /path/to/objdump]
DW_FORM_strp used without .debug_str section [in module /path/to/objdump]
(No debugging symbols found in /path/to/objdump)
(gdb)

Unfortunately, I have not found a way to regression test this, since it
requires poking ELF section headers.

gdb/ChangeLog:
2019-10-16  Keith Seitz  <keiths@redhat.com>

	PR gdb/23567
	* dwarf2read.c (dwarf2_per_objfile::locate_sections): Discard
	sections whose size is greater than the file size.

Change-Id: I896ac3b4eb2207c54e8e05c16beab3051d9b4b2f
2019-10-16 11:35:16 -07:00
Jim Wilson
ff371ec999 Add initial compile command support to RISC-V port.
This adds initial compile command support to the RISC-V port.  This fixes
about 228 testsuite failures on a riscv64-linux machine.  We need to get
the triplet right which is normally riscv64 or riscv32 instead of the
default riscv.  Also, we need to get the compiler options right, since we
don't accept the default -m64 and -mcmodel=large options, so we need to
construct -march and -mabi options which are correct for the target.  We
currently don't have info about all extensions used by the target, so this
may need to be adjusted later.  For now, I'm assuming that we have all
extensions required by the linux platform spec.

	gdb/
	* riscv-tdep.c (riscv_gcc_target_options): New.
	(riscv_gnu_triplet_regexp): New.
	(riscv_gdbarch_init): Call set_gdbarch_gcc_triplet_options and
	set_gdbarch_gnu_triplet_regexp.

Change-Id: I315ce8de7789ddf7bdd3b532f917519464941294
2019-10-16 10:58:37 -07:00
Christian Biesinger
fec4e896d6 Create xml-builtin.h to declare xml_builtins
xml-builtin.c only has character arrays and no dependencies, so this
creates a simple header file for that purpose so that gdbserver
can include that instead of re-declaring xml_builtin.

Despite the name, feature_to_c.sh is already specific to xml_builtins
(it hardcodes the variable name), so making it always output the
include for xml-builtin.h seems fine.

gdb/ChangeLog:

2019-10-16  Christian Biesinger  <cbiesinger@google.com>

	* Makefile.in: Add xml-builtin.h.
	* features/feature_to_c.sh: Add an include for xml-builtin.h
	to ensure that the compiler checks that the types match.
	* xml-builtin.h: New file.
	* xml-support.c (fetch_xml_builtin): Add missing const.
	* xml-support.h: Remove declaration of xml_builtins.

gdb/gdbserver/ChangeLog:

2019-10-16  Christian Biesinger  <cbiesinger@google.com>

	* server.c: Include xml-builtin.h.
	(get_xml_features): Don't declare xml_builtins here.

Change-Id: I806ef0851c43ead90b545a11794e41f5e5178436
2019-10-16 18:19:14 +02:00
Tom de Vries
d10eccaa72 [gdb/tdep] Fix inferior call arg passing for amd64
We currently have 12 KFAILS in gdb.base/infcall-nested-structs.exp for
PR tdep/25096.

A minimal version of the failure looks like this.  Consider test.c:
...
struct s { int c; struct { int a; float b; } s1; };
struct s ref = { 0, { 'a', 'b' } };

int __attribute__((noinline,noclone)) check (struct s arg)
{ return arg.s1.a == 'a' && arg.s1.b == 'b' && arg.c == 0; }

int main (void)
{ return check (ref); }
...

When calling 'check (ref)' from main, we have '1' as expected:
...
$ g++ test.c -g ; ./a.out ; echo $?
1
...

But when calling 'check (ref)' from the gdb prompt, we get '0':
...
$ gdb a.out -batch -ex start -ex "p check (ref)"
Temporary breakpoint 1 at 0x400518: file test.c, line 8.

Temporary breakpoint 1, main () at test.c:8
8       { return check (ref); }
$1 = 0
...

The layout of struct s is this:
- the field c occupies 4 bytes at offset 0,
- the s1.a field occupies 4 bytes at offset 4, and
- the s1.b field occupies 4 bytes at offset 8.

When compiling at -O2, we can see from the disassembly of main:
...
  4003f0:       48 8b 3d 31 0c 20 00    mov    0x200c31(%rip),%rdi \
                                               # 601028 <ref>
  4003f7:       f3 0f 10 05 31 0c 20    movss  0x200c31(%rip),%xmm0 \
                                               # 601030 <ref+0x8>
  4003fe:       00
  4003ff:       e9 ec 00 00 00          jmpq   4004f0 <_Z5check1s>
...
that check is called with fields c and s1.a passed in %rdi, and s1.b passed
in %xmm0.

However, the classification in theclass (a variable representing the first and
second eightbytes, to put it in SYSV X86_64 psABI terms) in
amd64_push_arguments is incorrect:
...
(gdb) p theclass
$1 = {AMD64_INTEGER, AMD64_INTEGER}
...
and therefore the struct is passed using %rdi and %rsi instead of using %rdi
and %xmm0, which explains the failure.

The reason that we're misclassifying the argument in amd64_classify_aggregate
has to do with how nested struct are handled.

Rather than using fields c and s1.a for the first eightbyte, and using field
s1.b for the second eightbyte, instead field c is used for the first
eightbyte, and fields s1.a and s1.b are classified together in an intermediate
eightbyte, which is then used to merge with both the first and second
eightbyte.

Fix this by factoring out a new function amd64_classify_aggregate_field, and
letting it recursively handle fields of nested structs.

Tested on x86_64-linux.

Tested with g++ 4.8.5, 7.4.1, 8.3.1, 9.2.1.

Tested with clang++ 5.0.2 (which requires removing additional_flags=-Wno-psabi
and adding additional_flags=-Wno-deprecated).

gdb/ChangeLog:

2019-10-16  Tom de Vries  <tdevries@suse.de>

	PR tdep/25096
	* amd64-tdep.c (amd64_classify_aggregate_field): Factor out of ...
	(amd64_classify_aggregate): ... here.
	(amd64_classify_aggregate_field): Handled fiels of nested structs
	recursively.

gdb/testsuite/ChangeLog:

2019-10-16  Tom de Vries  <tdevries@suse.de>

	PR tdep/25096
	* gdb.base/infcall-nested-structs.exp: Remove PR25096 KFAILs.

Change-Id: Id55c74755f0a431ce31223acc86865718ae0c123
2019-10-16 17:11:56 +02:00
Tom de Vries
745ff14e6e [gdb/tdep] Fix 'Unexpected register class' assert in amd64_push_arguments
Atm, when executing gdb.base/infcall-nested-structs.exp on x86_64-linux, we get:
...
FAIL: gdb.base/infcall-nested-structs.exp: l=c++: types-tc-tf: \
  p/d check_arg_struct_02_01 (ref_val_struct_02_01)
FAIL: gdb.base/infcall-nested-structs.exp: l=c++: types-ts-tf: \
  p/d check_arg_struct_02_01 (ref_val_struct_02_01)
FAIL: gdb.base/infcall-nested-structs.exp: l=c++: types-ti-tf: \
  p/d check_arg_struct_02_01 (ref_val_struct_02_01)

                === gdb Summary ===

nr of expected passes            9255
nr of unexpected failures        3
nr of expected failures          142
...

The 3 FAILs are reported as PR tdep/25096.

The 142 XFAILs are for a gdb assertion failure, reported in PR tdep/24104,
which should have been KFAILs since there's a problem in gdb rather than in
the environment.

A minimal version of the assertion failure looks like this. Consider test.c:
...
struct s { struct { } es1; long f; };
struct s ref = { {}, 'f' };

int __attribute__((noinline,noclone)) check (struct s arg)
{ return arg.f == 'f'; }

int main (void)
{ return check (ref); }
...

When calling 'check (ref)' from main, we have '1' as expected:
...
$ g++ test3.c -g && ( ./a.out; echo $? )
1
...

But when calling 'check (ref)' from the gdb prompt, we get:
...
$ gdb a.out -batch -ex start -ex "p check (ref)"
Temporary breakpoint 1 at 0x4004f7: file test.c, line 8.

Temporary breakpoint 1, main () at test.c:8
8       { return check (ref); }
src/gdb/amd64-tdep.c:982: internal-error: \
  CORE_ADDR amd64_push_arguments(regcache*, int, value**, CORE_ADDR, \
                                 function_call_return_method): \
  Assertion `!"Unexpected register class."' failed.
...

The assert happens in this loop in amd64_push_arguments:
...
          for (j = 0; len > 0; j++, len -= 8)
            {
              int regnum = -1;
              int offset = 0;

              switch (theclass[j])
                {
                case AMD64_INTEGER:
                  regnum = integer_regnum[integer_reg++];
                  break;

                case AMD64_SSE:
                  regnum = sse_regnum[sse_reg++];
                  break;

                case AMD64_SSEUP:
                  gdb_assert (sse_reg > 0);
                  regnum = sse_regnum[sse_reg - 1];
                  offset = 8;
                  break;

                default:
                  gdb_assert (!"Unexpected register class.");
                }
		...
            }
...
when processing theclass[0], which is AMD64_NO_CLASS:
...
(gdb) p theclass
$1 = {AMD64_NO_CLASS, AMD64_INTEGER}
...

The layout of struct s is that the empty field es1 occupies one byte (due to
c++) at offset 0, and the long field f occupies 8 bytes at offset 8.

When compiling at -O2, we can see from the disassembly of main:
...
  4003f0:       48 8b 3d 41 0c 20 00    mov    0x200c41(%rip),%rdi \
                                               # 601038 <ref+0x8>
  4003f7:       e9 e4 00 00 00          jmpq   4004e0 <_Z5check1s>
  4003fc:       0f 1f 40 00             nopl   0x0(%rax)
...
that check is called with field f passed in %rdi, meaning that the
classification in theclass is correct, it's just not supported in the loop in
amd64_push_arguments mentioned above.

Fix the assert by implementing support for 'AMD64_NO_CLASS' in that loop.

This exposes 9 more FAILs of the PR tdep/25096 type, so mark all 12 of them as
KFAIL.

Tested on x86_64-linux.

Tested with g++ 4.8.5, 7.4.1, 8.3.1, 9.2.1.  With 4.8.5, 3 of the 12 KFAILs
are KPASSing.

Tested with clang++ 5.0.2 (which requires removing additional_flags=-Wno-psabi
and adding additional_flags=-Wno-deprecated).

gdb/ChangeLog:

2019-10-16  Tom de Vries  <tdevries@suse.de>

	PR tdep/24104
	* amd64-tdep.c (amd64_push_arguments): Handle AMD64_NO_CLASS in loop
	that handles 'theclass'.

gdb/testsuite/ChangeLog:

2019-10-16  Tom de Vries  <tdevries@suse.de>

	PR tdep/24104
	* gdb.base/infcall-nested-structs.exp: Remove XFAIL for PR tdep/24104.
	Add KFAIL for PR tdep/25096.

Change-Id: I8b66345bbf5c00209ca75b1209fd4d60b36e9ede
2019-10-16 17:11:56 +02:00
Tom de Vries
03e1ab9424 [gdb/testsuite] Fix local-static.exp with g++-4.8
With g++-4.8, I see:
...
(gdb) PASS: gdb.cp/local-static.exp: c++: print free_inline_func(void)
print 'S::method()'::S_M_s_var_int^M
No symbol "S_M_s_var_int" in specified context.^M
(gdb) FAIL: gdb.cp/local-static.exp: c++: print 'S::method()'::S_M_s_var_int
...

The variable is declared like this (showing pruned .ii):
...
void S::method ()
{
  static int S_M_s_var_int = 4;
}
...

But the DWARF generated for the variable is encapsulated in an unnamed lexical
block:
...
 <1><121>: Abbrev Number: 5 (DW_TAG_structure_type)
    <122>   DW_AT_name        : S
    ...
 <2><14f>: Abbrev Number: 6 (DW_TAG_subprogram)
    ...
    <150>   DW_AT_name        : (indirect string, offset: 0x599): method
    <156>   DW_AT_linkage_name: (indirect string, offset: 0x517): \
                                _ZN1S6methodEv /* demangled: dS::method() */
    ...
 <1><3f8>: Abbrev Number: 21 (DW_TAG_subprogram)
    <3f9>   DW_AT_specification: <0x14f>
    ...
    <3fe>   DW_AT_low_pc      : 0x4004fc
    <406>   DW_AT_high_pc     : 0x2c /* 0x400528 */
    ...
 <2><418>: Abbrev Number: 17 (DW_TAG_formal_parameter)
    <419>   DW_AT_name        : (indirect string, offset: 0x68a): this
    ...
 <2><424>: Abbrev Number: 18 (DW_TAG_lexical_block)
    <425>   DW_AT_low_pc      : 0x400508
    <42d>   DW_AT_high_pc     : 0x1e /* 0x400526 */
 <3><435>: Abbrev Number: 22 (DW_TAG_variable)
    <436>   DW_AT_name        : (indirect string, offset: 0x29d): S_M_s_var_int
...
which has the effect that the variable is not addressable unless the program
counter is in the range of the lexical block.

This is caused by gcc PR debug/55541, which was fixed in gcc 5.

Mark in total 225 FAILs as XFAIL.

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2019-10-16  Tom de Vries  <tdevries@suse.de>

	PR testsuite/25059
	* gdb.cp/local-static.exp (do_test): Add xfails for gcc PR debug/55541.

Change-Id: Ibe86707eecffc79f1bb474d7928ea7d0c39a00a2
2019-10-16 17:00:04 +02:00
Tom de Vries
b17fcc1039 [gdb/testsuite] Fix regexp for reg value in jit-reader.exp
On openSUSE Leap 15.1 (as well as on Fedora-x86_64-m64 buildbot) I see:
...
FAIL: gdb.base/jit-reader.exp: with jit-reader: after mangling: current frame: info registers
...

The problem is that r10 is printed signed:
...
r10            0xffffffffffffffb0  -80^M
...
but the regexp expects a signed value:
...
            "r10            $hex +$decimal" \
...

Fix this by allowing signed values.

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2019-10-16  Tom de Vries  <tdevries@suse.de>

	* gdb.base/jit-reader.exp: Allow non-pointer registers to be printed
	as signed.

Change-Id: Ie494d24fad7a9af7ac6bfaf731c4aa04f1333830
2019-10-16 16:53:37 +02:00
Andrew Burgess
00975ff6eb gdb/gdbserver: Remove reference to vec-ipa.o
This comit:

    commit 0dc327459b
    Date:   Mon Oct 7 16:38:53 2019 +0100

        gdb: Remove vec.{c,h} and update code to not include vec.h

Broke the GDB build due to leaving a reference to vec-ipa.o in the
Makefile.in, this file is built from vec.c which has been removed.

I got away with this as I had an old version of the vec-ipa.o file
still in my build tree.

With this commit in place a clean build now completed successfully.

gdb/ChangeLog:

	* Makefile.in: Remove references to vec-ipa.o.

Change-Id: I4cf55951158dd7ee8f60cd054311a7c367e1d7bf
2019-10-15 22:01:53 +01:00
Andrew Burgess
791b7405f4 gdb: Update comments that reference VEC or vec.h
With the removal of the old VEC mechanism from the code base, update
comments that still make reference to VECs.  There should be no user
visible changes after this commit.

gdb/ChangeLog:

	* linespec.c (decode_digits_ordinary): Update comment.
	* make-target-delegates: No longer need to handle VEC case.
	* memrange.c (normalize_mem_ranges): Update comment.
	* namespace.c (add_using_directive): Update comment.
	* objc-lang.c (uniquify_strings): Update comment.
	* ppc-linux-nat.c (struct thread_points): Update comment.
	* probe.h (find_probes_in_objfile): Update comment.
	* target.h (enum flash_preserve_mode): Update comment.
	* varobj.c (varobj_restrict_range): Update comment.
	* varobj.h (varobj_list_children): Update comment.

Change-Id: Iefd2e903705c3e79cd13b43395c7a1c167f9a088
2019-10-15 21:32:28 +01:00
Andrew Burgess
0dc327459b gdb: Remove vec.{c,h} and update code to not include vec.h
Removes vec.c and vec.h from the source tree, and remove all the
remaining includes of vec.h.  There should be no user visible changes
after this commit.

I did have a few issues rebuilding GDB after applying this patch due
to cached dependencies, I found that running this command in the build
directory resolved my build issues without requiring a 'make clean':

    rm -fr gdb/gdbserver/gdbsupport/.deps/

gdb/ChangeLog:

	* Makefile.in: Remove references to vec.h and vec.c.
	* aarch64-tdep.c: No longer include vec.h.
	* ada-lang.c: Likewise.
	* ada-lang.h: Likewise.
	* arm-tdep.c: Likewise.
	* ax.h: Likewise.
	* breakpoint.h: Likewise.
	* charset.c: Likewise.
	* cp-support.h: Likewise.
	* dtrace-probe.c: Likewise.
	* dwarf2read.c: Likewise.
	* extension.h: Likewise.
	* gdb_bfd.c: Likewise.
	* gdbsupport/gdb_vecs.h: Likewise.
	* gdbsupport/vec.c: Remove.
	* gdbsupport/vec.h: Remove.
	* gdbthread.h: Likewise.
	* guile/scm-type.c: Likewise.
	* inline-frame.c: Likewise.
	* machoread.c: Likewise.
	* memattr.c: Likewise.
	* memrange.h: Likewise.
	* namespace.h: Likewise.
	* nat/linux-btrace.h: Likewise.
	* osdata.c: Likewise.
	* parser-defs.h: Likewise.
	* progspace.h: Likewise.
	* python/py-type.c: Likewise.
	* record-btrace.c: Likewise.
	* rust-exp.y: Likewise.
	* solib-target.c: Likewise.
	* stap-probe.c: Likewise.
	* target-descriptions.c: Likewise.
	* target-memory.c: Likewise.
	* target.h: Likewise.
	* varobj.c: Likewise.
	* varobj.h: Likewise.
	* xml-support.h: Likewise.

gdb/gdbserver/ChangeLog:

	* Makefile.in: Remove references to vec.c.

Change-Id: I0c91d7170bf1b5e992a387fcd9fe4f2abe343bb5
2019-10-15 21:31:55 +01:00
Andrew Burgess
ae6400219c gdb: Remove use of VEC from dwarf2read.c
This removes a use of VEC from GDB, from dwarf2read.c.  This removal
is not very clean, and would probably benefit from additional
refactoring in the future.

The problem here is that the VEC is contained within struct
dwarf2_per_cu_data, which is treated as POD in dwarf2read.c.  As such
it is actually a VEC pointer.  When converting this to a std::vector
in an ideal world we would not use a std::vector pointer, and use the
std::vector directly.  Sadly, to do that would require some rewriting
in dwarf2read.c - my concern would be introducing bugs during this
rewrite.

If we move to a std::vector pointer then we need to take care to
handle the case where the pointer is null.  The old VEC library would
handle null for us, making the VEC interface very clean.  With
std::vector we need to handle the null pointer case ourselves.

The achieve this then I've added a small number of function that wrap
up access to the std::vector, hopefully hiding the null pointer
management.

The final ugliness with this conversion is that, ideally, when
wrapping a data member behind an interface I would make the data
member private, however, treating the structure as POD once again
prevents this, so we are left with the data member being public, but
access (ideally) being through the published interface functions.

There should be no user visible changes after this commit.

gdb/ChangeLog:

	* gdb/dwarf2read.c (dwarf2_per_objfile::~dwarf2_per_objfile):
	Update for new std::vector based implementation.
	(process_psymtab_comp_unit_reader): Likewise.
	(scan_partial_symbols): Likewise.
	(recursively_compute_inclusions): Likewise.
	(compute_compunit_symtab_includes): Likewise.
	(process_imported_unit_die): Likewise.
	(queue_and_load_dwo_tu): Likewise.
	(follow_die_sig_1): Likewise.
	* gdb/dwarf2read.h: Remove DEF_VEC_P.
	(typedef dwarf2_per_cu_ptr): Remove.
	(struct dwarf2_per_cu_data) <imported_symtabs_empty>: New
	function.
	(struct dwarf2_per_cu_data) <imported_symtabs_push>: New function.
	(struct dwarf2_per_cu_data) <imported_symtabs_size>: New function.
	(struct dwarf2_per_cu_data) <imported_symtabs_free>: New function.
	(struct dwarf2_per_cu_data) <imported_symtabs>: Change to
	std::vector.

Change-Id: Id0f4bda977c9dd83b0ba3d7fb42f7e5e2b6869c8
2019-10-15 20:12:25 +01:00
Tom Tromey
55dfc88f7e Use %x when printing the TID
One spot in windows-nat.c uses %ld to print the TID, but all other
spots use %x, as does the infrun logging.  This makes it unnecessarily
hard to tell which other log messages correspond to this one.  This
patch changes the one outlier to use %x.

gdb/ChangeLog
2019-10-15  Tom Tromey  <tromey@adacore.com>

	* windows-nat.c (windows_nat_target::resume): Use %x when logging
	TID.

Change-Id: Ic66efeb8a7ec08e7fb007320318f51acbf976734
2019-10-15 11:42:35 -06:00
Tom Tromey
96b49c5ec0 Rename pid -> tid in windows-nat.c
A couple of spots in windows-nat.c used the name "pid" to refer to the
thread ID.  I found this confusing, so this patch changes the names.

gdb/ChangeLog
2019-10-15  Tom Tromey  <tromey@adacore.com>

	* windows-nat.c (windows_nat_target::fetch_registers)
	(windows_nat_target::store_registers): Rename "pid" to "tid".

Change-Id: Ia1a447e8da822d01ad94a5ca3760342bbdc0e66c
2019-10-15 11:42:35 -06:00
Tom Tromey
953cff5630 Change gcc_target_options to return std::string
This patch was inspired by a recent review that recommended using
std::string in a new implementation of the gcc_target_options gdbarch
function.  It changes this function to return std::string rather than
an ordinary xmalloc'd string.

I believe this caught a latent memory leak in compile.c:get_args.

Tested on x86-64 Fedora 29.

gdb/ChangeLog
2019-10-15  Tom Tromey  <tromey@adacore.com>

	* gdbarch.h, gdbarch.c: Rebuild.
	* gdbarch.sh (gcc_target_options): Change return type to
	std::string.
	* compile/compile.c (get_args): Update.
	* nios2-tdep.c (nios2_gcc_target_options): Return std::string.
	* arm-linux-tdep.c (arm_linux_gcc_target_options): Return
	std::string.
	* aarch64-linux-tdep.c (aarch64_linux_gcc_target_options): Return
	std::string.
	* arch-utils.c (default_gcc_target_options): Return std::string.
	* arch-utils.h (default_gcc_target_options): Return std::string.
	* s390-tdep.c (s390_gcc_target_options): Return std::string.

Change-Id: I51f61703426a323089e646da8f22320a2cafbc1f
2019-10-15 11:03:57 -06:00
Christian Biesinger
81e6b8eb20 Make tui-winsource not use breakpoint_chain
That's an internal variable of breakpoint.c. Insted, use
iterate_over_breakpoints to update the breakpoint list.

gdb/ChangeLog:

2019-10-15  Christian Biesinger  <cbiesinger@google.com>

	* breakpoint.c (breakpoint_chain): Make static.
	* tui/tui-winsource.c: Call iterate_over_breakpoints instead
	of accessing breakpoint_chain.

Change-Id: Ic259b2c3a4c1f5a47f34cfd7fccbdcf274417429
2019-10-15 15:30:00 +02:00
Christian Biesinger
95da600f40 Change iterate_over_breakpoints to take a function_view
This allows callers to pass in capturing lambdas.  Also changes the return
type to bool.

gdb/ChangeLog:

2019-10-15  Christian Biesinger  <cbiesinger@google.com>

	* breakpoint.c (iterate_over_breakpoints): Change function pointer
	to a gdb::function_view and return value to bool.
	* breakpoint.h (iterate_over_breakpoints): Likewise.
	* dummy-frame.c (pop_dummy_frame_bpt): Update.
	(pop_dummy_frame): Update.
	* guile/scm-breakpoint.c (bpscm_build_bp_list): Update.
	(gdbscm_breakpoints): Update.
	* python/py-breakpoint.c (build_bp_list): Update.
	(gdbpy_breakpoints): Update.
	* python/py-finishbreakpoint.c (bpfinishpy_detect_out_scope_cb):
	Update.
	(bpfinishpy_handle_stop): Update.
	(bpfinishpy_handle_exit): Update.
	* solib-svr4.c (svr4_update_solib_event_breakpoint): Update.
	(svr4_update_solib_event_breakpoints): Update.

Change-Id: Ia9de4deecae562a70a40f5cd49f5a74d64570251
2019-10-15 15:29:55 +02:00
Andreas Arnez
ba18312d8f s390: Fix infcalls passing a single-field struct with static members
The infcall-nested-structs test case yields 36 FAILs on s390x because GCC
and GDB disagree on how to pass a C++ struct like this as an argument to a
function:

  struct s { float x; static float y; };

For the purpose of argument passing, GCC ignores static fields, while GDB
does not.  Thus GCC passes the argument in a floating-point register and
GDB passes it via memory.

Fix this by explicitly ignoring static fields when detecting single-field
structs.

gdb/ChangeLog:

	* s390-tdep.c (s390_effective_inner_type): Ignore static fields
	when unwrapping single-field structs.
2019-10-15 14:20:14 +02:00
Tom de Vries
b7be2d03fb [gdb/testsuite] Fix gdb.ada/mi_task_arg.exp
On openSUSE Leap 15.1, we have:
...
FAIL: gdb.ada/mi_task_arg.exp: -stack-list-arguments 1 (unexpected output)
...

The problem is that the stack-list-arguments command prints a frame argument
'self_id' for function system.tasking.stages.task_wrapper:
...
frame={level="2",args=[{name="self_id",value="0x12345678"}]
...
where none (args=[]) is expected.

The frame argument is in fact correct.  The FAIL does not show for say, fedora
30, because there the executable uses the system.tasking.stages.task_wrapper
from /lib64/libgnarl-9.so.  Adding "additional_flags=-bargs
additional_flags=-shared additional_flags=-largs" to the flags argument of
gdb_compile_ada gives us the same PASS, but installing libada7-debuginfo gets
us the same FAIL again.

Fix the FAIL by allowing the 'self_id' argument.

Tested on x86_64-linux.

Change-Id: I5aee5856fa6aeb0cc78aa4fe69deecba5b00b77a
2019-10-15 02:21:37 +02:00
Simon Marchi
9223170f68 gdb.mi/list-thread-groups-available.exp: read entries one by one instead of increasing timeout
Commit 580f1034 ("Increase timeout in
gdb.mi/list-thread-groups-available.exp") changed
gdb.mi/list-thread-groups-available.exp to significantly increase the
timeout, which was necessary for when running with make check-read1.

Pedro suggested a better alternative, which is to use gdb_test_multiple
and consume one entry at a time.  This patch does that.

gdb/testsuite/ChangeLog:

	* gdb.mi/list-thread-groups-available.exp: Read entries one by
	one instead of increasing timeout.

Change-Id: I51b689458503240f24e401f054e6583d9172ebdf
2019-10-14 12:12:24 -04:00
Simon Marchi
6acc1a0b9d gdb: remove unused includes from dwarf2read.c
include-what-you-use says:

../../../src/binutils-gdb/gdb/dwarf2read.c should remove these lines:
- #include <ctype.h>  // lines 67-67
- #include <sys/stat.h>  // lines 59-59
- #include <sys/types.h>  // lines 83-83
- #include <cmath>  // lines 88-88
- #include <forward_list>  // lines 90-90
- #include <set>  // lines 89-89
- #include <unordered_set>  // lines 85-85
- #include "completer.h"  // lines 60-60
- #include "expression.h"  // lines 44-44
- #include "gdbsupport/byte-vector.h"  // lines 78-78
- #include "gdbsupport/filestuff.h"  // lines 71-71
- #include "gdbsupport/gdb_unlinker.h"  // lines 74-74

After a quick glance, that makes sense, so this patch removes them.

gdb/ChangeLog:

	* dwarf2read.c: Remove includes.

Change-Id: I13cfcb2f1d747144fddba7f66b329630b79dae90
2019-10-14 10:15:51 -04:00
Simon Marchi
284782de07 gdb: Silence -Wformat-nonliteral warning with clang
We get this warning when building with clang:

      CXX    ui-out.o
    /home/smarchi/src/binutils-gdb/gdb/ui-out.c:590:22: error: format string is not a string literal [-Werror,-Wformat-nonliteral]
      do_message (style, format, args);
                         ^~~~~~

This can be considered a legitimate warning, as call_do_message's format
parameter is not marked as a format string.  Therefore, we should
normally mark the call_do_message method with the `format` attribute.
However, doing so just moves (and multiplies) the problem, as all the
uses of call_do_message in the vmessage method now warn.  If we wanted
to continue on that path, we should silence the warning for each of
them, as a way of telling the compiler "it's ok, we know what we are
doing".

But since call_do_message is really just vmessage's little helper, it's
simpler to just silence the warning at that single point.

gdb/ChangeLog:

	* ui-out.c (ui_out::call_do_message): Silence
	-Wformat-nonliteral warning.

Change-Id: I58ad41793448f38835c5d6ba7b9e5c4dd8df260f
2019-10-13 19:53:40 -04:00
Tom de Vries
d039f01465 Mention PR c++/20020 in ChangeLog entry
[ Port of gdb-8.3-branch commit 59047affb0 "Update ChangeLog entry of commit
98c90f8028 and mention PR c++/20020". ]
2019-10-13 15:09:09 +02:00
Tom de Vries
34a7f2a4e3 Mention PR testsuite/25016 in ChangeLog entry
[ Port of gdb-8.3-branch commit 3d80b2e754 "Update ChangeLog entry of commit
3b752ac2e6 and mention PR testsuite/25016". ]
2019-10-13 15:09:09 +02:00
Tom de Vries
5862c886a2 Mention PR breakpoints/25011 in ChangeLog entry
[ Port of gdb-8.3-branch commit 88f07f28d5 "Update ChangeLog entry of commit
7e38ddcb2e and mention PR breakpoints/25011". ]
2019-10-13 15:09:09 +02:00
Tom de Vries
68255adc03 Mention PR gdb/25010 in ChangeLog entry
[ Port of gdb-8.3-branch commit 5ca0b868fa "Update ChangeLog entry of commit
8ac39635f6 and mention PR gdb/25010". ]
2019-10-13 15:09:09 +02:00
Simon Marchi
073bbbb058 gdb: small cleanup in breakpoint.c's includes
In an attempt to reduce the number of files re-build when some headers
are touched, I ran include-what-you-use with breakpoint.c as a guinea
pig.  It revealed a few files that were unnecessary to include, which
this patch removes.

breakpoint.c uses tilde_expand from readline, hence the necessity to
include tilde.h.  AFAIK, it's fine to include just that, and not the
whole readline headers.

include-what-you-use also reported many header files that should be
included but aren't, I suppose that breakpoint.c currently includes them
indirectly.  For now I'll pretend I didn't see that :).

gdb/ChangeLog:

	* breakpoint.c: Remove some includes: continuations.h, skip.h,
	mi/mi-main.h, readline/readline.h, readline/history.h.  Add
	include: readline/tilde.h.

-#include "skip.h"
 #include "ax-gdb.h"
 #include "dummy-frame.h"
 #include "interps.h"
@@ -69,11 +67,9 @@
 #include "thread-fsm.h"
 #include "tid-parse.h"
 #include "cli/cli-style.h"
-#include "mi/mi-main.h"

 /* readline include files */
-#include "readline/readline.h"
-#include "readline/history.h"
+#include "readline/tilde.h"

 /* readline defines this.  */
 #undef savestring

Change-Id: I88bfe9071f2f973fd84caaf04b95c33a4dfb33de
2019-10-12 23:46:16 -04:00
Tom de Vries
d6e7631356 [gdb/testsuite] Add KFAIL for missing support of reverse-debugging xsave
Normally the gdb.reverse/*.exp test-cases pass on my system (apart from the
record/23188 KFAIL for gdb.reverse/step-precsave.exp).  But when specifying
GLIBC_TUNABLES=glibc.tune.hwcaps=-XSAVEC_Usable to force glibc to use
_dl_runtime_resolve_xsave instead of _dl_runtime_resolve_xsavec, we run into
1054 FAILs like this:
...
(gdb) PASS: gdb.reverse/sigall-reverse.exp: b gen_HUP
continue^M
Continuing.^M
Process record does not support instruction 0xfae64 at address \
  0x7ffff7ded958.^M
Process record: failed to record execution log.^M
^M
Program stopped.^M
0x00007ffff7ded958 in _dl_runtime_resolve_xsave () from \
  /lib64/ld-linux-x86-64.so.2^M
(gdb) FAIL: gdb.reverse/sigall-reverse.exp: get signal ABRT
...

The problem is that the xsave instruction is not supported in
reverse-debugging (PR record/25038).

Add KFAILs for this PR.

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2019-10-13  Tom de Vries  <tdevries@suse.de>

	PR record/25038
	* gdb.reverse/sigall-precsave.exp: Add PR record/25038 KFAIL.
	* gdb.reverse/sigall-reverse.exp: Same.
	* gdb.reverse/solib-precsave.exp: Same.
	* gdb.reverse/solib-reverse.exp: Same.
	* gdb.reverse/step-precsave.exp: Same.
	* gdb.reverse/until-precsave.exp: Same.
	* gdb.reverse/until-reverse.exp: Same.
	* lib/gdb.exp (gdb_continue_to_breakpoint): Same.
2019-10-13 02:40:57 +02:00
Christian Biesinger
7b9a15e1ee Remove unnecessary declaration of trace_regblock_size
This variable is declared in tracepoint.h, which is already included
by remote.c.

gdb/ChangeLog:

2019-10-12  Christian Biesinger  <cbiesinger@google.com>

	* remote.c (remote_target::get_trace_status): Remove declaration of
	trace_regblock_size.
2019-10-12 19:36:18 -04:00
Christian Biesinger
cc8dee1f1c Move declaration of max_user_call_depth to header
Also removes an unnecessary declaration of cmdlist in cli-cmds.c.
I don't understand why it is there, the definition of cmdlist is
at the top of the same file.

gdb/ChangeLog:

2019-10-12  Christian Biesinger  <cbiesinger@google.com>

	* cli/cli-cmds.c (max_user_call_depth): Move comment to header.
	(show_user): Remove declaration of cmdlist.
	* cli/cli-cmds.h (max_user_call_depth): Declare.
	* cli/cli-script.c (execute_user_command): Remove declaration
	of max_user_call_depth.
2019-10-12 14:31:26 -05:00
Jim Wilson
5f93c5a6d5 Improve comments in print-utils.h.
Since I had to look at these function comments to fix the RISC-V ARI warnings,
I noticed that they make no sense.  The pulongest and plongest comments are
swapped.  phex is missing a comment.  And phex_nz doesn't mention how it is
different from phex.

	* gdbsupport/print-utils.h (pulongest): Fix comment.
	(plongest): Likewise.
	(phex): Add missing comment, mention leading zeros.
	(phex_nz): Add mention of no leading zeros to comment.
2019-10-11 11:28:35 -07:00
Jim Wilson
a83d4ef693 RISC-V: Fix two ARI warnings.
> gdb/riscv-tdep.c:1657: code: %ll: Do not use printf(%ll), instead use printf(%s,phex()) to dump a 'long long' value
gdb/riscv-tdep.c:1657:                  "Writing %lld-byte nop instruction to %s: %s\n",
> gdb/riscv-tdep.c:1658: code: long long: Do not use 'long long', instead use LONGEST
gdb/riscv-tdep.c:1658:                  ((unsigned long long) sizeof (nop_insn)),

fprintf_unfiltered doesn't support z (or j for that matter), and fixing that
is a larger patch than I'd like to write, so this does basically what the
ARI warnings recommends.  We don't need the cast as there is a prototype for
plongest.

	* riscv-tdep.c (riscv_push_dummy_code): Change %lld to %s and use
	plongest instead of unsigned long long cast.
2019-10-11 11:26:29 -07:00
Christian Biesinger
26344e0c53 Include gdbtk.h to avoid declarations
Once https://sourceware.org/ml/insight/2019-q4/msg00000.html lands,
we can just include gdbtk.h to get the declarations for
external_editor_command and gdbtk_test, instead of having to
declare them here in main.c.

gdb/ChangeLog:

2019-10-07  Christian Biesinger  <cbiesinger@google.com>

	* main.c (captured_main_1): Include gdbtk.h and remove declarations
	for external_editor_command and gdbtk_test.
2019-10-10 12:42:41 -05:00
Christian Biesinger
c2c440a903 Move declaration of varobjdebug to header
gdb/ChangeLog:

2019-10-10  Christian Biesinger  <cbiesinger@google.com>

	* mi/mi-cmd-var.c (varobjdebug): Remove declaration.
	* varobj.c (varobjdebug): Move comment to...
	* varobj.h (varobjdebug): ...here, and declare.
2019-10-10 12:37:47 -05:00
Andreas Arnez
6dfc004112 gdb/testsuite: Fix typos in infcall-nested-structs.c
Some of the comparison functions in infcall-nested-structs.c contain
redundant comparisons like a.<some_field> == a.<some_field> instead of
a.<some_field> == b.<some_field>.  They were introduced with this commit:

  36eb4c5f9b - "infcall-nested-structs: Test up to five fields"

Fix the redundant comparisons.

gdb/testsuite/ChangeLog:

	* gdb.base/infcall-nested-structs.c (cmp_struct_02_01)
	(cmp_struct_02_02, cmp_struct_04_01, cmp_struct_04_02)
	(cmp_struct_05_01, cmp_struct_static_02_01)
	(cmp_struct_static_04_01, cmp_struct_static_06_01): Fix redundant
	comparisons.
2019-10-10 12:22:49 +02:00
Tom de Vries
abcf2cc85a [gdb/testsuite] Fix ada tests with -fPIE/-pie
When running the gdb testsuite with target board unix/-fPIE/-pie, the
resulting ada executables are not PIE executables, because gnatmake doesn't
recognize -pie, and consequently doesn't pass it to gnatlink.

Fix this by replacing "-pie" with "-largs -pie -margs" in
target_compile_ada_from_dir, and doing the same for -no-pie.

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2019-10-10  Tom de Vries  <tdevries@suse.de>

	PR testsuite/24888
	* lib/ada.exp (target_compile_ada_from_dir): Route -pie/-no-pie to
	gnatlink.
2019-10-10 11:51:34 +02:00
Tom Tromey
a31bff9d2d Don't call erase_data_content from tui_data_window::show_registers
tui_data_window::show_registers currently calls erase_data_content.
However, I think it's better to have fewer calls to this (ideally just
one would suffice).  This refactors that function to remove this call.

gdb/ChangeLog
2019-10-09  Tom Tromey  <tom@tromey.com>

	* tui/tui-regs.c (tui_data_window::show_registers): Don't call
	erase_data_content.
2019-10-09 16:50:36 -06:00
Tom Tromey
7523da63ca Make TUI window handle a unique_ptr
This changes tui_gen_win_info::handle to be a specialization of
unique_ptr.  This is perhaps mildly uglier in some spots, due to the
proliferation of "get"; but on the other hand it cleans up some manual
management and it allows for the removal of tui_delete_win.

gdb/ChangeLog
2019-10-09  Tom Tromey  <tom@tromey.com>

	* tui/tui-wingeneral.h (tui_delete_win): Don't declare.
	* tui/tui-stack.c (tui_locator_window::rerender): Update.
	* tui/tui-command.c (tui_cmd_window::resize)
	(tui_refresh_cmd_win): Update.
	* tui/tui-win.c (tui_resize_all, tui_set_focus_command): Update.
	* tui/tui.c (tui_rl_other_window, tui_enable): Update.
	* tui/tui-data.c (~tui_gen_win_info): Remove.
	* tui/tui-layout.c (tui_gen_win_info::resize): Update.
	* tui/tui-io.c (update_cmdwin_start_line, tui_putc, tui_puts)
	(tui_redisplay_readline, tui_mld_flush)
	(tui_mld_erase_entire_line, tui_mld_getc, tui_getc): Update.
	* tui/tui-regs.c (tui_data_window::delete_data_content_windows)
	(tui_data_window::erase_data_content)
	(tui_data_item_window::rerender)
	(tui_data_item_window::refresh_window): Update.
	* tui/tui-wingeneral.c (tui_gen_win_info::refresh_window)
	(box_win, tui_gen_win_info::make_window)
	(tui_gen_win_info::make_visible): Update.
	(tui_delete_win): Remove.
	* tui/tui-winsource.c
	(tui_source_window_base::do_erase_source_content): Update.
	(tui_show_source_line, tui_source_window_base::update_tab_width)
	(tui_source_window_base::update_exec_info): Update.
	* tui/tui-data.h (struct curses_deleter): New.
	(struct tui_gen_win_info) <handle>: Now a unique_ptr.
	(struct tui_gen_win_info) <~tui_gen_win_info>: Define.
2019-10-09 16:50:35 -06:00
Tom Tromey
a7798e7f7d Remove declaration from tui-wingeneral.h
tui-wingeneral.h has an unused forward declaration.  This removes it.

gdb/ChangeLog
2019-10-09  Tom Tromey  <tom@tromey.com>

	* tui/tui-wingeneral.h (struct tui_gen_win_info): Don't declare.
2019-10-09 16:50:35 -06:00
Tom Tromey
5c45899e28 Remove tui_win_is_auxiliary
tui_win_is_auxiliary is not used, so remove it.

gdb/ChangeLog
2019-10-09  Tom Tromey  <tom@tromey.com>

	* tui/tui-data.c (tui_win_is_auxiliary): Remove.
	* tui/tui-data.h (tui_win_is_auxiliary): Don't declare.
2019-10-09 16:50:34 -06:00
Tom Tromey
6d7fd9aa47 Remove tui_default_win_viewport_height
tui_default_win_viewport_height was only called from a single spot,
for a single type of window.  This patch removes the function and
moves the logic into the sole caller.

gdb/ChangeLog
2019-10-09  Tom Tromey  <tom@tromey.com>

	* tui/tui-disasm.c (tui_get_low_disassembly_address): Compute
	window height directly.
	* tui/tui-layout.h (tui_default_win_viewport_height): Don't
	declare.
	* tui/tui-layout.c (tui_default_win_height): Remove.
	(tui_default_win_viewport_height): Remove.
2019-10-09 16:50:33 -06:00