binutils-gdb/gdb/python
Pierre-Marie de Rodat 63e43d3aed DWARF: handle non-local references in nested functions
GDB's current behavior when dealing with non-local references in the
context of nested fuctions is approximative:

  - code using valops.c:value_of_variable read the first available stack
    frame that holds the corresponding variable (whereas there can be
    multiple candidates for this);

  - code directly relying on read_var_value will instead read non-local
    variables in frames where they are not even defined.

This change adds the necessary context to symbol reads (to get the block
they belong to) and to blocks (the static link property, if any) so that
GDB can make the proper decisions when dealing with non-local varibale
references.

gdb/ChangeLog:

	* ada-lang.c (ada_read_var_value): Add a var_block argument
	and pass it to default_read_var_value.
	* block.c (block_static_link): New accessor.
	* block.h (block_static_link): Declare it.
	* buildsym.c (finish_block_internal): Add a static_link
	argument.  If there is a static link, associate it to the new
	block.
	(finish_block): Add a static link argument and pass it to
	finish_block_internal.
	(end_symtab_get_static_block): Update calls to finish_block and
	to finish_block_internal.
	(end_symtab_with_blockvector): Update call to
	finish_block_internal.
	* buildsym.h: Forward-declare struct dynamic_prop.
	(struct context_stack): Add a static_link field.
	(finish_block): Add a static link argument.
	* c-exp.y: Remove an obsolete comment (evaluation of variables
	already start from the selected frame, and now they climb *up*
	the call stack) and propagate the block information to the
	produced expression.
	* d-exp.y: Likewise.
	* f-exp.y: Likewise.
	* go-exp.y: Likewise.
	* jv-exp.y: Likewise.
	* m2-exp.y: Likewise.
	* p-exp.y: Likewise.
	* coffread.c (coff_symtab_read): Update calls to finish_block.
	* dbxread.c (process_one_symbol): Likewise.
	* xcoffread.c (read_xcoff_symtab): Likewise.
	* compile/compile-c-symbols.c (convert_one_symbol): Promote the
	"sym" parameter to struct block_symbol, update its uses and pass
	its block to calls to read_var_value.
	(convert_symbol_sym): Update the calls to convert_one_symbol.
	* compile/compile-loc2c.c (do_compile_dwarf_expr_to_c): Update
	call to read_var_value.
	* dwarf2loc.c (block_op_get_frame_base): New.
	(dwarf2_block_frame_base_locexpr_funcs): Implement the
	get_frame_base method.
	(dwarf2_block_frame_base_loclist_funcs): Likewise.
	(dwarf2locexpr_baton_eval): Add a frame argument and use it
	instead of the selected frame in order to evaluate the
	expression.
	(dwarf2_evaluate_property): Add a frame argument.  Update call
	to dwarf2_locexpr_baton_eval to provide a frame in available and
	to handle the absence of address stack.
	* dwarf2loc.h (dwarf2_evaluate_property): Add a frame argument.
	* dwarf2read.c (attr_to_dynamic_prop): Add a forward
	declaration.
	(read_func_scope): Record any available static link description.
	Update call to finish_block.
	(read_lexical_block_scope): Update call to finish_block.
	* findvar.c (follow_static_link): New.
	(get_hosting_frame): New.
	(default_read_var_value): Add a var_block argument.  Use
	get_hosting_frame to handle non-local references.
	(read_var_value): Add a var_block argument and pass it to the
	LA_READ_VAR_VALUE method.
	* gdbtypes.c (resolve_dynamic_range): Update calls to
	dwarf2_evaluate_property.
	(resolve_dynamic_type_internal): Likewise.
	* guile/scm-frame.c (gdbscm_frame_read_var): Update call to
	read_var_value, passing it the block coming from symbol lookup.
	* guile/scm-symbol.c (gdbscm_symbol_value): Update call to
	read_var_value (TODO).
	* infcmd.c (finish_command_continuation): Update call to
	read_var_value, passing it the block coming from symbol lookup.
	* infrun.c (insert_exception_resume_breakpoint): Likewise.
	* language.h (struct language_defn): Add a var_block argument to
	the LA_READ_VAR_VALUE method.
	* objfiles.c (struct static_link_htab_entry): New.
	(static_link_htab_entry_hash): New.
	(static_link_htab_entry_eq): New.
	(objfile_register_static_link): New.
	(objfile_lookup_static_link): New.
	(free_objfile): Free the STATIC_LINKS hashed map if needed.
	* objfiles.h: Include hashtab.h.
	(struct objfile): Add a static_links field.
	(objfile_register_static_link): New.
	(objfile_lookup_static_link): New.
	* printcmd.c (print_variable_and_value): Update call to
	read_var_value.
	* python/py-finishbreakpoint.c (bpfinishpy_init): Likewise.
	* python/py-frame.c (frapy_read_var): Update call to
	read_var_value, passing it the block coming from symbol lookup.
	* python/py-framefilter.c (extract_sym): Add a sym_block
	parameter and set the pointed value to NULL (TODO).
	(enumerate_args): Update call to extract_sym.
	(enumerate_locals): Update calls to extract_sym and to
	read_var_value.
	* python/py-symbol.c (sympy_value): Update call to
	read_var_value (TODO).
	* stack.c (read_frame_local): Update call to read_var_value.
	(read_frame_arg): Likewise.
	(return_command): Likewise.
	* symtab.h (struct symbol_block_ops): Add a get_frame_base
	method.
	(struct symbol): Add a block field.
	(SYMBOL_BLOCK): New accessor.
	* valops.c (value_of_variable): Remove frame/block handling and
	pass the block argument to read_var_value, which does this job
	now.
	(value_struct_elt_for_reference): Update calls to
	read_var_value.
	(value_of_this): Pass the block found to read_var_value.
	* value.h (read_var_value): Add a var_block argument.
	(default_read_var_value): Likewise.

gdb/testsuite/ChangeLog:

	* gdb.base/nested-subp1.exp: New file.
	* gdb.base/nested-subp1.c: New file.
	* gdb.base/nested-subp2.exp: New file.
	* gdb.base/nested-subp2.c: New file.
	* gdb.base/nested-subp3.exp: New file.
	* gdb.base/nested-subp3.c: New file.
2015-08-25 08:13:28 -04:00
..
lib/gdb PR python/17136 2015-08-06 09:24:58 -07:00
py-arch.c Split TRY_CATCH into TRY + CATCH 2015-03-07 15:14:14 +00:00
py-auto-load.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-block.c Split TRY_CATCH into TRY + CATCH 2015-03-07 15:14:14 +00:00
py-bpevent.c Fix redefinition errors in C++ mode 2015-02-11 11:20:21 +00:00
py-breakpoint.c Explicit locations: use new location API 2015-08-11 17:09:35 -07:00
py-cmd.c Remove --xdb 2015-04-11 19:49:03 +02:00
py-continueevent.c Fix redefinition errors in C++ mode 2015-02-11 11:20:21 +00:00
py-event.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-event.h Fix redefinition errors in C++ mode 2015-02-11 11:20:21 +00:00
py-events.h Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-evtregistry.c Fix redefinition errors in C++ mode 2015-02-11 11:20:21 +00:00
py-evts.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-exitedevent.c Fix redefinition errors in C++ mode 2015-02-11 11:20:21 +00:00
py-finishbreakpoint.c DWARF: handle non-local references in nested functions 2015-08-25 08:13:28 -04:00
py-frame.c DWARF: handle non-local references in nested functions 2015-08-25 08:13:28 -04:00
py-framefilter.c DWARF: handle non-local references in nested functions 2015-08-25 08:13:28 -04:00
py-function.c Fix redefinition errors in C++ mode 2015-02-11 11:20:21 +00:00
py-gdb-readline.c Split TRY_CATCH into TRY + CATCH 2015-03-07 15:14:14 +00:00
py-inferior.c Split TRY_CATCH into TRY + CATCH 2015-03-07 15:14:14 +00:00
py-infevents.c Fix redefinition errors in C++ mode 2015-02-11 11:20:21 +00:00
py-infthread.c Split TRY_CATCH into TRY + CATCH 2015-03-07 15:14:14 +00:00
py-lazy-string.c PR python/18438 2015-05-26 16:13:04 -07:00
py-linetable.c python: fix Linetable case to LineTable in docstrings and comments 2015-08-04 09:50:53 -07:00
py-newobjfileevent.c Fix redefinition errors in C++ mode 2015-02-11 11:20:21 +00:00
py-objfile.c Allow gdb to find debug symbols file by build-id for PE file format also 2015-06-15 12:10:55 +01:00
py-param.c Split TRY_CATCH into TRY + CATCH 2015-03-07 15:14:14 +00:00
py-prettyprint.c PR python/18089 2015-04-28 21:53:54 -07:00
py-progspace.c Add support for writing unwinders in Python. 2015-04-01 11:49:12 -07:00
py-signalevent.c Fix redefinition errors in C++ mode 2015-02-11 11:20:21 +00:00
py-stopevent.c Fix redefinition errors in C++ mode 2015-02-11 11:20:21 +00:00
py-stopevent.h Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-symbol.c DWARF: handle non-local references in nested functions 2015-08-25 08:13:28 -04:00
py-symtab.c python: fix Linetable case to LineTable in docstrings and comments 2015-08-04 09:50:53 -07:00
py-threadevent.c Fix redefinition errors in C++ mode 2015-02-11 11:20:21 +00:00
py-type.c Remove CHECK_TYPEDEF, use check_typedef instead 2015-07-14 16:42:16 -04:00
py-unwind.c Fix Python frame unwinder issue caught by Valgrind 2015-08-13 18:56:42 +01:00
py-utils.c Split TRY_CATCH into TRY + CATCH 2015-03-07 15:14:14 +00:00
py-value.c Remove CHECK_TYPEDEF, use check_typedef instead 2015-07-14 16:42:16 -04:00
py-varobj.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-xmethods.c PR python/18285 2015-04-29 13:24:21 -07:00
python-config.py
python-internal.h Remove redundant include directives. 2015-06-24 13:52:29 +01:00
python.c Initialize `location' in gdbpy_decode_line 2015-08-12 11:31:24 -07:00
python.h Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00