deliverable/binutils-gdb.git
3 years agoImplement dumping
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Implement dumping

This patch implements the dumping methods for tuple_holding_operation.
A number of overloads are used.  Note that no default case is given.
This approach makes it simple to detect when a new overload is needed
-- compilation will fail.  (There is an example of this in a later
patch in the series.)

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* expprint.c (expr::dump_for_expression): New functions.
* expop.h (dump_for_expression): New overloads.
(tuple_holding_operation::dump, tuple_holding_operation::do_dump):
Update.

3 years agoIntroduce class operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Introduce class operation

This patch introduces class operation, the new base class for all
expression operations.

In the new approach, an operation is simply a class that presents a
certain interface.  Operations own their operands, and management is
done via unique_ptr.

The operation interface is largely ad hoc, based on the evolution of
expression handling in GDB.  Parts (for example,
evaluate_with_coercion) are probably redundant; however I took this
approach to try to avoid mixing different kinds of refactorings.

In some specific situations, rather than add a generic method across
the entire operation class hierarchy, I chose instead to use
dynamic_cast and specialized methods on certain concrete subclasses.
This will appear in some subsequent patches.

One goal of this work is to avoid the kinds of easy-to-make errors
that affected the old implementation.  To this end, some helper
subclasses are also added here.  These helpers automate the
implementation of the 'dump', 'uses_objfile', and 'constant_p'
methods.  Nearly every concrete operation that is subsequently added
will use these facilities.  (Note that the 'dump' implementation is
only outlined here, the body appears in the next patch.)

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* expression.h (expr::operation): New class.
(expr::make_operation): New function.
(expr::operation_up): New typedef.
* expop.h: New file.
* eval.c (operation::evaluate_for_cast)
(operation::evaluate_for_address, operation::evaluate_for_sizeof):
New methods.
* ax-gdb.c (operation::generate_ax): New method.

3 years agoSplit gen_expr_binop_rest
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split gen_expr_binop_rest

This splits gen_expr_binop_rest into two overloads.  One overload
retains the "pc" parameter, while the other does not, and furthermore
does not call gen_expr on the left-hand-side.  This split is useful
for subsequent patches in the new expression evaluation approach.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ax-gdb.c (gen_expr_binop_rest): Remove "pc" parameter.
(gen_expr_binop_rest): New overload.

3 years agoSplit out eval_multi_subscript
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_multi_subscript

This splits MULTI_SUBSCRIPT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_multi_subscript): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out ada_binop_exp
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out ada_binop_exp

This splits BINOP_EXP into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (ada_binop_exp): New function.
(ada_evaluate_subexp): Use it.

3 years agoChange value_val_atr to ada_val_atr
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Change value_val_atr to ada_val_atr

This renames value_val_atr to ada_val_atr, changing its parameters to
more closely mirror other expression helpers.  The
EVAL_AVOID_SIDE_EFFECTS case is moved into this function as well.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (ada_val_atr): Rename from value_val_atr.  Change
parameters.
(ada_evaluate_subexp): Use it.

3 years agoSplit out ada_binop_minmax
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out ada_binop_minmax

This splits OP_ATR_MIN and OP_ATR_MAX into a new function for future
use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (ada_binop_minmax): New function.
(ada_evaluate_subexp): Use it.

3 years agoSplit out ada_unop_atr
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out ada_unop_atr

This splits some Ada attribute operations into a new function for
future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (ada_unop_atr): New function.
(ada_evaluate_subexp): Use it.

3 years agoSplit out ada_binop_in_bounds
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out ada_binop_in_bounds

This splits BINOP_IN_BOUNDS into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (ada_binop_in_bounds): New function.
(ada_evaluate_subexp): Use it.

3 years agoSplit out ada_ternop_slice
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out ada_ternop_slice

This splits TERNOP_SLICE into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (ada_ternop_slice): New function.
(ada_evaluate_subexp): Use it.

3 years agoSplit out ada_equal_binop
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out ada_equal_binop

This splits BINOP_EQUAL and BINOP_NOTEQUAL into a new function for
future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (ada_equal_binop): New function.
(ada_evaluate_subexp): Use it.

3 years agoSplit out ada_mult_binop
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out ada_mult_binop

This splits BINOP_MUL into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (ada_mult_binop): New function.
(ada_evaluate_subexp): Use it.

3 years agoSplit out ada_abs
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out ada_abs

This splits UNOP_ABS into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (ada_abs): New function.
(ada_evaluate_subexp): Use it.

3 years agoSplit out ada_atr_size
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out ada_atr_size

This splits OP_ATR_SIZE into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (ada_atr_size): New function.
(ada_evaluate_subexp): Use it.

3 years agoSplit out ada_atr_tag
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out ada_atr_tag

This splits OP_ATR_TAG into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (ada_atr_tag): New function.
(ada_evaluate_subexp): Use it.

3 years agoSplit out ada_unop_in_range
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out ada_unop_in_range

This splits UNOP_IN_RANGE into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (ada_unop_in_range): New function.
(ada_evaluate_subexp): Use it.

3 years agoSplit out ada_unop_neg
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out ada_unop_neg

This splits UNOP_NEG into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (ada_unop_neg): New function.
(ada_evaluate_subexp): Use it.

3 years agoSplit out eval_ternop_in_range
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_ternop_in_range

This splits TERNOP_IN_RANGE into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* ada-lang.c (eval_ternop_in_range): New function.
(ada_evaluate_subexp): Use it.

3 years agoSplit out eval_opencl_assign
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_opencl_assign

This splits BINOP_ASSIGN into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* opencl-lang.c (eval_opencl_assign): New function.
(evaluate_subexp_opencl): Use it.

3 years agoSplit out eval_op_objc_msgcall
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_objc_msgcall

This splits OP_OBJC_MSGCALL into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_objc_msgcall): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_binop_assign_modify
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_binop_assign_modify

This splits BINOP_ASSIGN_MODIFY into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_binop_assign_modify): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_m2_subscript
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_m2_subscript

This splits BINOP_SUBSCRIPT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* m2-lang.c (eval_op_m2_subscript): New function.
(evaluate_subexp_modula2): Use it.

3 years agoSplit out eval_op_m2_high
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_m2_high

This splits UNOP_HIGH into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* m2-lang.c (eval_op_m2_high): New function.
(evaluate_subexp_modula2): Use it.

3 years agoSplit helper functions
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split helper functions

This splits a couple of address-of and sizeof functions, so that the
body can be reused by the (coming) new expression code.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (evaluate_subexp_for_address_base): New function.
(evaluate_subexp_for_address): Use it.
(evaluate_subexp_for_sizeof_base): New function.
(evaluate_subexp_for_sizeof): Use it.

3 years agoSplit out eval_op_rust_structop
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_rust_structop

This splits STRUCTOP_STRUCT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* rust-lang.c (eval_op_rust_structop): New function.
(rust_evaluate_subexp): Use it.

3 years agoSplit out eval_op_rust_struct_anon
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_rust_struct_anon

This splits STRUCTOP_ANONYMOUS into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* rust-lang.c (eval_op_rust_struct_anon): New function.
(rust_evaluate_subexp): Use it.

3 years agoSplit out eval_op_rust_array
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_rust_array

This splits OP_ARRAY into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* rust-lang.c (eval_op_rust_array): New function.
(rust_evaluate_subexp): Use it.

3 years agoSplit out eval_op_rust_complement
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_rust_complement

This splits UNOP_COMPLEMENT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* rust-lang.c (eval_op_rust_complement): New function.
(rust_evaluate_subexp): Use it.

3 years agoSplit out eval_op_rust_ind
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_rust_ind

This splits UNOP_IND into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* rust-lang.c (eval_op_rust_ind): New function.
(rust_evaluate_subexp): Use it.

3 years agoChange parameters to rust_subscript
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Change parameters to rust_subscript

This changes the parameters to rust_subscript, making it more suitable
for reuse by the (coming) new expression code.  In particular,
rust_subscript no longer evaluates its subexpressions.  Instead, they
are passed in.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* rust-lang.c (rust_subscript): Change parameters.
(rust_evaluate_subexp): Update.

3 years agoChange parameters to rust_range
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Change parameters to rust_range

This changes the parameters to rust_range, making it more suitable for
reuse by the (coming) new expression code.  In particular, rust_range
no longer evaluates its subexpressions.  Instead, they are passed in.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* rust-lang.c (rust_range): Change parameters.
(rust_evaluate_subexp): Update.

3 years agoSplit out eval_op_f_allocated
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_f_allocated

This splits out a helper function, eval_op_f_allocated, that will be
used in a later patch.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* f-lang.c (eval_op_f_allocated): New function.
(evaluate_subexp_f): Use it.

3 years agoSplit out fortran_require_array
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out fortran_require_array

This splits out a helper function, fortran_require_array, that will be
used in a later patch.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* f-lang.c (fortran_require_array): New function.
(evaluate_subexp_f): Use it.

3 years agoSplit out eval_op_f_kind
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_f_kind

This splits UNOP_FORTRAN_KIND into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* f-lang.c (eval_op_f_kind): New function.
(evaluate_subexp_f): Use it.

3 years agoSplit out eval_op_f_cmplx
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_f_cmplx

This splits BINOP_FORTRAN_CMPLX into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* f-lang.c (eval_op_f_cmplx): New function.
(evaluate_subexp_f): Use it.

3 years agoSplit out eval_op_f_modulo
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_f_modulo

This splits BINOP_FORTRAN_MODULO into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* f-lang.c (eval_op_f_modulo): New function.
(evaluate_subexp_f): Use it.

3 years agoSplit out eval_op_f_floor
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_f_floor

This splits UNOP_FORTRAN_FLOOR into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* f-lang.c (eval_op_f_floor): New function.
(evaluate_subexp_f): Use it.

3 years agoSplit out eval_op_f_ceil
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_f_ceil

This splits UNOP_FORTRAN_CEILING into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* f-lang.c (eval_op_f_ceil): New function.
(evaluate_subexp_f): Use it.

3 years agoSplit out eval_op_f_mod
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_f_mod

This splits BINOP_MOD into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* f-lang.c (eval_op_f_mod): New function.
(evaluate_subexp_f): Use it.

3 years agoSplit out eval_op_f_abs
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_f_abs

This splits UNOP_ABS into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* f-lang.c (eval_op_f_abs): New function.
(evaluate_subexp_f): Use it.

3 years agoSplit out eval_op_type
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_type

This splits OP_TYPE into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_type): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_postdec
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_postdec

This splits UNOP_POSTDECREMENT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_postdec): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_postinc
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_postinc

This splits UNOP_POSTINCREMENT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_postinc): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_predec
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_predec

This splits UNOP_PREDECREMENT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_predec): New file.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_preinc
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_preinc

This splits UNOP_PREINCREMENT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_preinc): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_memval
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_memval

This splits UNOP_MEMVAL into a new function for future use.  This new
function is also used to hande UNOP_MEMVAL_TYPE.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_memval): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_alignof
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_alignof

This splits UNOP_ALIGNOF into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_alignof): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_ind
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_ind

This splits UNOP_IND into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_ind): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_lognot
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_lognot

This splits UNOP_LOGICAL_NOT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_lognot): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_complement
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_complement

This splits UNOP_COMPLEMENT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_complement): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_neg
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_neg

This splits UNOP NEG into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_neg): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_plus
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_plus

This splits UNOP_PLUS into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_plus): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_repeat
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_repeat

This splits BINOP_REPEAT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_repeat): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_leq
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_leq

This splits BINOP_LEQ into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_leq): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_geq
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_geq

This splits BINOP_GEQ into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_geq): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_gtr
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_gtr

This splits BINOP_GTR into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_gtr): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_less
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_less

This splits BINOP_LESS into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_less): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_notequal
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_notequal

This splits BINOP_NOTEQUAL into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_notequal): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_equal
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_equal

This splits BINOP_EQUAL into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_equal): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_subscript
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_subscript

This splits BINOP_SUBSCRIPT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_subscript): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_binary
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_binary

This splits out a new eval_op_binary helper function.  This function
can handle several different binary operations:

    case BINOP_EXP:
    case BINOP_MUL:
    case BINOP_DIV:
    case BINOP_INTDIV:
    case BINOP_REM:
    case BINOP_MOD:
    case BINOP_LSH:
    case BINOP_RSH:
    case BINOP_BITWISE_AND:
    case BINOP_BITWISE_IOR:
    case BINOP_BITWISE_XOR:

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_binary): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_sub
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_sub

This splits BINOP_SUB into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_sub): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_add
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_add

This splits BINOP_ADD into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_add): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_member
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_member

This splits STRUCTOP_MEMBER into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_member): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_structop_ptr
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_structop_ptr

This splits STRUCTOP_PTR into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_structop_ptr): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_structop_struct
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_structop_struct

This splits STRUCTOP_STRUCT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_structop_struct): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_ternop
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_ternop

This splits TERNOP_SLICE into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_ternop): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_concat
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_concat

This splits BINOP_CONCAT into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_concat): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_objc_selector
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_objc_selector

This splits OP_OBJC_SELECTOR into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_objc_selector): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_string
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_string

This splits OP_STRING into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_string): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_register
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_register

This splits OP_REGISTER into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_register): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_func_static_var
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_func_static_var

This splits OP_FUNC_STATIC_VAR into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_func_static_var): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_var_msym_value
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_var_msym_value

This splits OP_VAR_MSYM_VALUE into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_var_msym_value): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_var_entry_value
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_var_entry_value

This splits OP_VAR_ENTRY_VALUE into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_var_entry_value): New function.
(evaluate_subexp_standard): Use it.

3 years agoSplit out eval_op_scope
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)] 
Split out eval_op_scope

This splits OP_SCOPE into a new function for future use.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

* eval.c (eval_op_scope): New function.
(evaluate_subexp_standard): Use it.

3 years agosim: delete unused BUILD_LIBS setting
Mike Frysinger [Mon, 8 Mar 2021 05:30:31 +0000 (00:30 -0500)] 
sim: delete unused BUILD_LIBS setting

This hasn't been initialized anywhere for years.  It used to be for
passing in the path to libiberty, but that stopped happening long ago.
Delete it to simplify the build logic.

3 years agosim: igen: update options API
Mike Frysinger [Mon, 8 Mar 2021 03:01:47 +0000 (22:01 -0500)] 
sim: igen: update options API

This local macro doesn't take any args, so adjust the API to match.
No one really noticed as this is behind code that is not normally
built, only when a dev specifically tries to compile it.

3 years agoAutomatic date update in version.in
GDB Administrator [Mon, 8 Mar 2021 00:00:26 +0000 (00:00 +0000)] 
Automatic date update in version.in

3 years agoRegenerated
Jeff Law [Sun, 7 Mar 2021 23:03:49 +0000 (16:03 -0700)] 
Regenerated

3 years agosim: testsuite: merge into toplevel automake
Mike Frysinger [Sun, 17 Jan 2021 16:13:37 +0000 (11:13 -0500)] 
sim: testsuite: merge into toplevel automake

This allows us to delete most of our custom test logic,
and avoids a recursive make for minor speed up.

3 years agosim: switch top level to automake
Mike Frysinger [Sun, 17 Jan 2021 11:17:36 +0000 (06:17 -0500)] 
sim: switch top level to automake

This doesn't gain us much by itself, but it sets us up for using more
features as we try to unify ports and avoid recursive make.

3 years agoAutomatic date update in version.in
GDB Administrator [Sun, 7 Mar 2021 00:00:23 +0000 (00:00 +0000)] 
Automatic date update in version.in

3 years agoFix build bug in ada-lang.c
Tom Tromey [Sat, 6 Mar 2021 16:38:26 +0000 (09:38 -0700)] 
Fix build bug in ada-lang.c

An earlier patch of mine introduced a build failure in ada-lang.c.  A
couple of "to_string" calls were not namespace-qualified.  In the
failing setup, the std string_view is being used, and so (apparently)
ADL doesn't find gdb::to_string.

This patch, from the bug, fixes the problem.

gdb/ChangeLog
2021-03-06  Chernov Sergey  <klen_s@mail.ru>

PR gdb/27528:
* ada-lang.c (ada_fold_name): Use gdb::to_string.

3 years agoMove dwarf2_get_dwz_file to dwarf2/dwz.h
Tom Tromey [Sat, 6 Mar 2021 16:26:39 +0000 (09:26 -0700)] 
Move dwarf2_get_dwz_file to dwarf2/dwz.h

This moves dwarf2_get_dwz_file and some helper code to dwarf2/dwz.h.
The main benefit of this is just shrinking dwarf2/read.c a little bit.

gdb/ChangeLog
2021-03-06  Tom Tromey  <tom@tromey.com>

* dwarf2/sect-names.h (dwarf2_elf_names): Declare.
* dwarf2/read.h (dwarf2_get_dwz_file): Move to dwz.h.
* dwarf2/read.c (dwarf2_elf_names): No longer static.
(locate_dwz_sections, dwz_search_other_debugdirs)
(dwarf2_get_dwz_file): Move to dwz.c.
* dwarf2/dwz.h (dwarf2_get_dwz_file): Move declaration from
read.h.
* dwarf2/dwz.c (locate_dwz_sections, dwz_search_other_debugdirs)
(dwarf2_get_dwz_file): Move from read.c.

3 years agoInclude scoped_fd.h in debuginfod-support.h
Tom Tromey [Sat, 6 Mar 2021 16:26:39 +0000 (09:26 -0700)] 
Include scoped_fd.h in debuginfod-support.h

debuginfod-support.h requires scoped_fd, so include the header here.

gdb/ChangeLog
2021-03-06  Tom Tromey  <tom@tromey.com>

* debuginfod-support.h: Include scoped_fd.h.

3 years agoAvoid crash on missing dwz file
Tom Tromey [Sat, 6 Mar 2021 16:26:39 +0000 (09:26 -0700)] 
Avoid crash on missing dwz file

If DWARF contains a reference to a "dwz" file, but there is no
.gnu_debugaltlink section, then gdb will crash.  This happens because
dwarf2_get_dwz_file will return NULL, but some callers do not expect
this.

This patch changes dwarf2_get_dwz_file so that callers can require a
dwz file.  Then, it updates the callers that are attempting to process
references to the dwz file to require one.

This includes a new testcase.  The dwarf.exp changes don't handle the
new forms exactly correctly -- they are only handled well enough to
let this test case complete.

gdb/ChangeLog
2021-03-06  Tom Tromey  <tom@tromey.com>

* dwarf2/read.h (dwarf2_get_dwz_file): Add 'require' parameter.
* dwarf2/read.c (dwarf2_get_dwz_file): Add 'require' parameter.
(get_abbrev_section_for_cu, read_attribute_value)
(get_debug_line_section): Update.
* dwarf2/macro.c (dwarf_decode_macro_bytes): Update.

gdb/testsuite/ChangeLog
2021-03-06  Tom Tromey  <tom@tromey.com>

* lib/dwarf.exp (_handle_DW_FORM): Treat DW_FORM_GNU_ref_alt and
DW_FORM_GNU_strp_alt like DW_FORM_sec_offset.
* gdb.dwarf2/dwznolink.exp: New file.

3 years agoChange section_is_p to a method on dwarf2_section_names
Tom Tromey [Sat, 6 Mar 2021 16:26:39 +0000 (09:26 -0700)] 
Change section_is_p to a method on dwarf2_section_names

This replaces section_is_p with a method on dwarf2_section_names.

gdb/ChangeLog
2021-03-06  Tom Tromey  <tom@tromey.com>

* dwarf2/sect-names.h (struct dwarf2_section_names) <matches>: New
method.
* dwarf2/read.c (section_is_p): Remove.
(dwarf2_per_bfd::locate_sections)
(dwarf2_per_bfd::locate_sections, locate_dwz_sections)
(locate_v1_virtual_dwo_sections, dwarf2_locate_dwo_sections)
(dwarf2_locate_common_dwp_sections)
(dwarf2_locate_v2_dwp_sections, dwarf2_locate_v5_dwp_sections):
Update.

3 years agoCreate new file dwarf2/sect-names.h
Tom Tromey [Sat, 6 Mar 2021 16:26:39 +0000 (09:26 -0700)] 
Create new file dwarf2/sect-names.h

This creates a new file, dwarf2/sect-names.h, and moves some
DWARF-specific type definitions from symfile.h into it.

gdb/ChangeLog
2021-03-06  Tom Tromey  <tom@tromey.com>

* xcoffread.c: Include sect-names.h.
* symfile.h (struct dwarf2_section_names, struct
dwarf2_debug_sections): Move to dwarf2/sect-names.h.
* dwarf2/sect-names.h: New file, from symfile.h.
* dwarf2/read.c: Include sect-names.h.

3 years agoMicro-optimize abbrev reading and storage
Tom Tromey [Sat, 6 Mar 2021 16:16:59 +0000 (09:16 -0700)] 
Micro-optimize abbrev reading and storage

Currently, and abbrev_info points to a separately allocated array of
attr_abbrev objects.  This array is constructed in a temporary vector,
then copied to the abbrev table's obstack.

This patch changes abbrev_info to use the struct hack to store the
objects directly, and changes abbrev_table::read to avoid an extra
copy when allocating, using the "growing objects" capability of
obstacks.

This saves a bit of space, and also perhaps a little time.

2021-03-06  Tom Tromey  <tom@tromey.com>

* dwarf2/read.c (read_attribute): Make 'abbrev' const.
* dwarf2/abbrev.c (abbrev_table::alloc_abbrev): Remove.
(abbrev_table::read): Update.
* dwarf2/abbrev.h (struct attr_abbrev): Move earlier.
(struct abbrev_info): Reformat.
<attrs>: Now an array.
(struct abbrev_table) <alloc_abbrev>: Remove.

3 years agoelf/x86-64: Subtract __ImageBase for R_AMD64_IMAGEBASE
H.J. Lu [Sat, 6 Mar 2021 02:24:56 +0000 (18:24 -0800)] 
elf/x86-64: Subtract __ImageBase for R_AMD64_IMAGEBASE

When linking Windows x86-64 relocatable object files to generate x86-64
ELF executable, we need to subtract __ImageBase, aka __executable_start,
for R_AMD64_IMAGEBASE relocation:

1. Add link_info to struct output_elf_obj_tdata to store linker info and
_bfd_get_link_info() to retrieve it.
2. Add ldelf_set_output_arch to set up link_info.
3. Add pex64_link_add_symbols to create an indirect reference to
__executable_start for __ImageBase to support R_AMD64_IMAGEBASE relocation
when adding symbols from Windows x86-64 relocatable object files to
generate x86-64 ELF executable.
4. Also subtract __ImageBase for R_AMD64_IMAGEBASE when generating x86-64
ELF executable.

bfd/

PR ld/27425
PR ld/27432
* bfd.c (_bfd_get_link_info): New function.
* elf-bfd.h (output_elf_obj_tdata): Add link_info.
(elf_link_info): New.
* libbfd-in.h (_bfd_get_link_info): New prototype.
* coff-x86_64.c (coff_amd64_reloc): Also subtract __ImageBase for
R_AMD64_IMAGEBASE when generating x86-64 ELF executable.
* pe-x86_64.c: Include "coff/internal.h" and "libcoff.h".
(pex64_link_add_symbols): New function.
(coff_bfd_link_add_symbols): New macro.
* libbfd.h: Regenerated.

ld/

PR ld/27425
PR ld/27432
* ldelf.c (ldelf_set_output_arch): New function.
* ldelf.h (ldelf_set_output_arch): New prototype.
* emultempl/elf.em (LDEMUL_SET_OUTPUT_ARCH): Default to
ldelf_set_output_arch.
* ld-x86-64/pe-x86-64-1.od: Expect __executable_start.
* testsuite/ld-x86-64/pe-x86-64-2.od: Likewise.
* testsuite/ld-x86-64/pe-x86-64-3.od: Likewise.
* testsuite/ld-x86-64/pe-x86-64-4.od: Likewise.
* testsuite/ld-x86-64/pe-x86-64-5.od: Likewise.
* testsuite/ld-x86-64/pe-x86-64-5.rd: Likewise.
* testsuite/ld-x86-64/pe-x86-64-6.obj.bz2: New file.
* testsuite/ld-x86-64/pe-x86-64-6.od: Likewise.
* testsuite/ld-x86-64/pe-x86-64.exp: Run ld/27425 test.

3 years agoMake valgrind tests more robust by adding --wait=1 to vgdb invocation
Mark Wielaard [Sat, 6 Mar 2021 00:49:27 +0000 (01:49 +0100)] 
Make valgrind tests more robust by adding --wait=1 to vgdb invocation

On my setup some valgrind tests failed somewhat reliably because
the target remote | vgdb command couldn't find the vgdb-pipe files
because valgrind startup hadn't finished yet.

I tried to fix this by replacing the "Memcheck, a memory error detector"
match to "TO DEBUG THIS PROCESS USING GDB: start GDB like this" which is
right before valgrind creates the vgdb-pipe files. But even that didn't
guarantee that the vgdb-pipe files were there (maybe valgrind should
print that text after it has created them?). But also not all tests
use --vgdb-error=0, so the text isn't always printed.

To make the tests reliable I added --wait=1 to the vgdb invocation.
That tells vgdb to try to find the vgdb-pipe files, and if they aren't
there yet, to wait 1 second and try again.

gdb/testsuite/ChangeLog:

* lib/valgrind.exp (vgdb_start): Add --wait=1 to vgdbcmd.

3 years agoCTF: add all members of an enum type to psymtab
Weimin Pan [Sat, 6 Mar 2021 00:17:00 +0000 (19:17 -0500)] 
CTF: add all members of an enum type to psymtab

With the following change which was made last April:

    [gdb] Use partial symbol table to find language for main
    commit d3214198119c1a2f9a6a2b8fcc56d8c324e1a245

The ctf reader was modified to enter all members of an enum type,
similar to what the dwarf2 reader did, into the psymtab or gdb
won't be able to find them. In addition, the empty name checking
needed to be moved down so members of a unnamed enum were not left
out.

gdb/ChangeLog:

* ctfread.c (ctf_psymtab_add_enums): New function.
(ctf_psymtab_type_cb): call ctf_psymtab_add_enums.

3 years agoCTF: set up debug info for function arguments
Weimin Pan [Fri, 5 Mar 2021 23:31:26 +0000 (18:31 -0500)] 
CTF: set up debug info for function arguments

Added this support in read_func_kind_type after gcc started generating
CTF for function arguments.

Replaced XNEW with std::vector and NULL with nullptr.

Expanded gdb.base/ctf-ptype.exp to test function arguments. Also fixed
some typos.

gdb/ChangeLog:

* ctfread.c (read_func_kind_type): Set up function arguments.

gdb/testsuite/ChangeLog:

* gdb.base/ctf-ptype.exp: Add function tests and fix typos.

3 years agoAutomatic date update in version.in
GDB Administrator [Sat, 6 Mar 2021 00:00:16 +0000 (00:00 +0000)] 
Automatic date update in version.in

3 years agogdb/riscv: write CSRs into baremetal core dumps
Andrew Burgess [Fri, 27 Nov 2020 14:39:23 +0000 (14:39 +0000)] 
gdb/riscv: write CSRs into baremetal core dumps

Use the current target description to include CSRs into the RISC-V
baremetal core dumps.

Every CSR declared in the current target description will be included
in the core dump.

It will be critical for users that they have the same target
description in use when loading the core file as was in use when
writing the core file.  This should be fine if the user allows the
target description to be written into the core file.

In more detail, this commit adds a NT_RISCV_CSR note type.  The
contents of this section is a series of either 4-byte (on RV32
targets), or 8-byte (on RV64 targets) values.  Every CSR that is
mentioned in the current target description is written out in the
order the registers appear in the target description.  As a
consequence it is critical that the exact same target description,
including the same register order, is in use when the CSRs are loaded
from the core file.

gdb/ChangeLog:

* riscv-none-tdep.c: Add 'user-regs.h' and 'target-description.h'
includes.
(riscv_csrset): New static global.
(riscv_update_csrmap): New function.
(riscv_iterate_over_regset_sections): Process CSRs.

3 years agogdb/riscv: make riscv target description names global
Andrew Burgess [Mon, 15 Feb 2021 16:07:48 +0000 (16:07 +0000)] 
gdb/riscv: make riscv target description names global

A later commit will need the names of the RISC-V target description
features in files other than riscv-tdep.c.  This commit just makes the
names global strings that can be accessed from other riscv-*.c files.

There should be no user visible changes after this commit.

gdb/ChangeLog:

        * riscv-tdep.c (riscv_feature_name_csr): Define.
        (riscv_feature_name_cpu): Define.
        (riscv_feature_name_fpu): Define.
        (riscv_feature_name_virtual): Define.
        (riscv_xreg_feature): Use riscv_feature_name_cpu.
        (riscv_freg_feature): Use riscv_feature_name_fpu.
        (riscv_virtual_feature): Use riscv_feature_name_virtual.
        (riscv_csr_feature): Use riscv_feature_name_csr.
        * riscv-tdep.h (riscv_feature_name_csr): Declare.

3 years agobfd/binutils: add support for RISC-V CSRs in core files
Andrew Burgess [Fri, 27 Nov 2020 14:04:16 +0000 (14:04 +0000)] 
bfd/binutils: add support for RISC-V CSRs in core files

Adds support for including RISC-V control and status registers into
core files.

The value for the define NT_RISCV_CSR is set to 0x900, this
corresponds to a patch I have proposed for the Linux kernel here:

  http://lists.infradead.org/pipermail/linux-riscv/2020-December/003910.html

As I have not yet heard if the above patch will be accepted into the
kernel or not I have set the note name string to "GDB", and the note
type to NT_RISCV_CSR.

This means that if the above patch is rejected from the kernel, and
the note type number 0x900 is assigned to some other note type, we
will still be able to distinguish between the GDB produced
NT_RISCV_CSR, and the kernel produced notes, where the name would be
set to "CORE".

bfd/ChangeLog:

* elf-bfd.h (elfcore_write_riscv_csr): Declare.
* elf.c (elfcore_grok_riscv_csr): New function.
(elfcore_grok_note): Handle NT_RISCV_CSR.
(elfcore_write_riscv_csr): New function.
(elfcore_write_register_note): Handle '.reg-riscv-csr'.

binutils/ChangeLog:

* readelf.c (get_note_type): Handle NT_RISCV_CSR.

include/ChangeLog:

* elf/common.h (NT_RISCV_CSR): Define.

3 years agogdb/riscv: introduce bare metal core dump support
Andrew Burgess [Mon, 30 Nov 2020 12:15:08 +0000 (12:15 +0000)] 
gdb/riscv: introduce bare metal core dump support

This commit adds the ability for bare metal RISC-V target to generate
core files from within GDB.

The intended use case is that a user will connect to a remote bare
metal target, debug up to some error condition, then generate a core
file in the normal way using:

  (gdb) generate-core-file

This core file can then be used to revisit the state of the remote
target without having to reconnect to the remote target.

The core file creation code is split between two new files.  In
elf-none-tdep.c is code for any architecture with the none
ABI (i.e. bare metal) when the BFD library is built with ELF support.

In riscv-none-tdep.c are the RISC-V specific parts.  This is where the
regset and regcache_map_entry structures are defined that control how
registers are laid out in the core file.  As this file could (in
theory at least) be used for a non-ELF bare metal RISC-V target, the
calls into elf-none-tdep.c are guarded with '#ifdef HAVE_ELF'.

Currently for RISC-V only the x-regs and f-regs (if present) are
written out.  In future commits I plan to add support for writing out
the RISC-V CSRs.

The core dump format is based around generating an ELF containing
sections for the writable regions of memory that a user could be
using.  Which regions are dumped rely on GDB's existing common core
dumping code, GDB will attempt to figure out the stack and heap as
well as copying out writable data sections as identified by the
original ELF.

Register information is added to the core dump using notes, just as it
is for Linux of FreeBSD core dumps.  The note types used consist of
the 3 basic types you would expect in a OS based core dump,
NT_PRPSINFO, NT_PRSTATUS, NT_FPREGSET.

The layout of these notes differs slightly (due to field sizes)
between RV32 and RV64.  Below I describe the data layout for each
note.  In all cases, all padding fields should be set to zero.

Note NT_PRPSINFO is optional.  Its data layout is:

  struct prpsinfo32_t /* For RV32.  */
  {
    uint8_t padding[32];
    char fname[16];
    char psargs[80];
  }

  struct prpsinfo64_t /* For RV64.  */
  {
    uint8_t padding[40];
    char fname[16];
    char psargs[80];
  }

Field 'fname' - null terminated string consisting of the basename of
    (up to the fist 15 characters of) the executable.  Any additional
    space should be set to zero.  If there's no executable name then
    this field can be set to all zero.

Field 'psargs' - a null terminated string up to 80 characters in
    length.  Any additional space should be filled with zero.  This
    field contains the full executable path and any arguments passed
    to the executable.  If there's nothing sensible to write in this
    field then fill it with zero.

Note NT_PRSTATUS is required, its data layout is:

  struct prstatus32_t /* For RV32.  */
  {
    uint8_t padding_1[12];
    uint16_t sig;
    uint8_t padding_2[10];
    uint32_t thread_id;
    uint8_t padding_3[44];
    uint32_t x_regs[32];
    uint8_t padding_4[4];
  }

  struct prstatus64_t /* For RV64.  */
  {
    uint8_t padding_1[12];
    uint16_t sig;
    uint8_t padding_2[18];
    uint32_t thread_id;
    uint8_t padding_3[76];
    uint64_t x_regs[32];
    uint8_t padding_4[4];
  }

Field 'sig' - the signal that stopped this thread.  It's implementation
    defined what this field actually means.  Within GDB this will be
    the signal number that the remote target reports as the stop
    reason for this thread.

Field 'thread_is' - the thread id for this thread.  It's implementation
    defined what this field actually means.  Within GDB this will be
    thread thread-id that is assigned to each remote thread.

Field 'x_regs' - at index 0 we store the program counter, and at
    indices 1 to 31 we store x-registers 1 to 31.  x-register 0 is not
    stored, its value is always zero anyway.

Note NT_FPREGSET is optional, its data layout is:

  fpregset32_t /* For targets with 'F' extension.  */
  {
    uint32_t f_regs[32];
    uint32_t fcsr;
  }

  fpregset64_t /* For targets with 'D' extension .  */
  {
    uint64_t f_regs[32];
    uint32_t fcsr;
  }

Field 'f_regs' - stores f-registers 0 to 31.

Field 'fcsr' - stores the fcsr CSR register, and is always 4-bytes.

The rules for ordering the notes is the same as for Linux.  The
NT_PRSTATUS note must come before any other notes about additional
register sets.  And for multi-threaded targets all registers for a
single thread should be grouped together.  This is because only
NT_PRSTATUS includes a thread-id, all additional register notes after
a NT_PRSTATUS are assumed to belong to the same thread until a
different NT_PRSTATUS is seen.

gdb/ChangeLog:

* Makefile.in (ALL_TARGET_OBS): Add riscv-none-tdep.o.
(ALLDEPFILES): Add riscv-none-tdep.c.
* configure: Regenerate.
* configure.ac (CONFIG_OBS): Add elf-none-tdep.o when BFD has ELF
support.
* configure.tgt (riscv*-*-*): Include riscv-none-tdep.c.
* elf-none-tdep.c: New file.
* elf-none-tdep.h: New file.
* riscv-none-tdep.c: New file.

3 years agobfd/riscv: prepare to handle bare metal core dump creation
Andrew Burgess [Mon, 30 Nov 2020 12:14:38 +0000 (12:14 +0000)] 
bfd/riscv: prepare to handle bare metal core dump creation

When creating a core file GDB will call the function
elfcore_write_prstatus to write out the general purpose registers
along with the pid/tid for the thread (into a prstatus structure) and
the executable name and arguments (into a prpsinfo_t structure).

However, for a bare metal RISC-V tool chain the prstatus_t and
prpsinfo_t types are not defined so the elfcore_write_prstatus
function will return NULL, preventing core file creation.

This commit provides the `elf_backend_write_core_note' hook and uses
the provided function to write out the required information.

In order to keep changes in the non bare metal tools to a minimum, the
provided backend function will itself return NULL when the prstatus_t
or pspsinfo_t types are available, the consequence of this is that the
generic code in elfcore_write_prstatus will be used just as before.
But, when prstatus_t or prpsinfo_t is not available, the new backend
function will write out the information using predefined offsets.

This new functionality will be used by a later GDB commit that will
add bare metal core dumps for RISC-V.

bfd/ChangeLog:

* elfnn-riscv.c (PRPSINFO_PR_FNAME_LENGTH): Define.
(PRPSINFO_PR_PSARGS_LENGTH): Define.
(riscv_write_core_note): New function.
(riscv_elf_grok_psinfo): Make use of two new length defines.
(elf_backend_write_core_note): Define.

3 years agogdb: write target description into core file
Andrew Burgess [Fri, 27 Nov 2020 15:41:52 +0000 (15:41 +0000)] 
gdb: write target description into core file

When a core file is created from within GDB add the target description
into a note within the core file.

When loading a core file, if the target description note is present
then load the target description from the core file.

The benefit of this is that we can be sure that, when analysing the
core file within GDB, that we are using the exact same target
description as was in use at the time the core file was created.

GDB already supports a mechanism for figuring out the target
description from a given corefile; gdbarch_core_read_description.
This new mechanism (GDB adding the target description) is not going to
replace the old mechanism.  Core files generated outside of GDB will
not include a target description, and so GDB still needs to be able to
figure out a target description for these files.

My primary motivation for adding this feature is that, in a future
commit, I will be adding support for bare metal core dumps on some
targets.  For RISC-V specifically, I want to be able to dump all the
available control status registers.  As different targets will present
different sets of register in their target description, including
registers that are possibly not otherwise known to GDB I wanted a way
to capture these registers in the core dump.

I therefore need a mechanism to write out an arbitrary set of
registers, and to then derive a target description from this arbitrary
set when later loading the core file.  The obvious approach (I think)
is to just reuse the target description.

Once I'd decided to add support for writing out the target description
I could either choose to make this RISC-V only, or make it generic.  I
figure that having the target description in the core file doesn't
hurt, and _might_ be helpful.  So that's how I got here, general
support for including the target description in GDB generated core
files.

In previous versions of this patch I added the target description from
generic code (in gcore.c).  However, doing this creates a dependency
between GDB's common code and bfd ELF support.  As ELF support in gdb
is optional (for example the target x86_64-apple-darwin20.3.0 does not
include ELF support) then having gcore.c require ELF support would
break the GDB build in some cases.

Instead, in this version of the patch, writing the target description
note is done from each specific targets make notes function.  Each of
these now calls a common function in gcore-elf.c (which is only linked
in when bfd has ELF support).  And so only targets that are ELF based
will call the new function and we can therefore avoid an unconditional
dependency on ELF support.

gdb/ChangeLog:

* corelow.c: Add 'xml-tdesc.h' include.
(core_target::read_description): Load the target description from
the core file when possible.
* fbsd-tdep.c (fbsd_make_corefile_notes): Add target description
note.
* gcore-elf.c: Add 'gdbsupport/tdesc.h' include.
(gcore_elf_make_tdesc_note): New function.
* gcore-elf.h (gcore_elf_make_tdesc_note): Declare.
* linux-tdep.c (linux_make_corefile_notes): Add target description
note.

This page took 0.046066 seconds and 4 git commands to generate.