This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH c++ 2/6] mdebugread.c: Add cast
- From: Simon Marchi <simon dot marchi at polymtl dot ca>
- To: Pedro Alves <palves at redhat dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Thu, 29 Oct 2015 13:50:09 -0400
- Subject: Re: [PATCH c++ 2/6] mdebugread.c: Add cast
- Authentication-results: sourceware.org; auth=none
- References: <1446123767-25046-1-git-send-email-simon dot marchi at polymtl dot ca> <1446123767-25046-3-git-send-email-simon dot marchi at polymtl dot ca> <563251B4 dot 5040408 at redhat dot com>
On 29 October 2015 at 13:04, Pedro Alves <palves@redhat.com> wrote:
> From: Pedro Alves <palves@redhat.com>
> Subject: [PATCH] mdebugread.c: Address class -> address class index
>
> This fixes this error in C++ mode:
>
> /home/pedro/gdb/mygit/cxx-convertion/src/gdb/mdebugread.c:654:11: error: invalid conversion from âintâ to âaddress_classâ [-fpermissive]
> theclass = mdebug_register_index;
> ^
>
> The "theclass" local is of type enum address_class, however, what it
> really holds is an address class index. Class index values by design
> match the address class values up until LOC_FINAL_VALUE, but extend
> beyond that, so it's not really right to store an address class index
> in an enum address_class.
>
> The fix is really the same as making the 'theclass' local be of type int,
> but while we're at it, we get rid of the goto, and thus the local
> becomes the 'aclass_index' parameter in the new add_data_symbol
> function.
>
> gdb/ChangeLog:
> 2015-10-29 Pedro Alves <palves@redhat.com>
>
> * mdebugread.c (add_data_symbol): New function, factored out from
> ...
> (parse_symbol): ... here. Delete 'theclass' local.
> ---
> gdb/mdebugread.c | 48 ++++++++++++++++++++++++++++--------------------
> 1 file changed, 28 insertions(+), 20 deletions(-)
>
> diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
> index 03c1ff8..da5ec60 100644
> --- a/gdb/mdebugread.c
> +++ b/gdb/mdebugread.c
> @@ -567,6 +567,26 @@ static const struct symbol_register_ops mdebug_register_funcs = {
> static int mdebug_register_index;
> static int mdebug_regparm_index;
>
> +/* Common code for symbols describing data. */
> +
> +static int
> +add_data_symbol (SYMR *sh, union aux_ext *ax, int bigend,
> + struct symbol *s, int aclass_index, struct block *b,
> + struct objfile *objfile, char *name)
> +{
> + SYMBOL_DOMAIN (s) = VAR_DOMAIN;
> + SYMBOL_ACLASS_INDEX (s) = aclass_index;
> + add_symbol (s, top_stack->cur_st, b);
> +
> + /* Type could be missing if file is compiled without debugging info. */
> + if (SC_IS_UNDEF (sh->sc)
> + || sh->sc == scNil || sh->index == indexNil)
> + SYMBOL_TYPE (s) = objfile_type (objfile)->nodebug_data_symbol;
> + else
> + SYMBOL_TYPE (s) = parse_type (cur_fd, ax, sh->index, 0, bigend, name);
> + /* Value of a data symbol is its memory address. */
> +}
> +
> static int
> parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
> struct section_offsets *section_offsets, struct objfile *objfile)
> @@ -581,7 +601,6 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
> struct type *t;
> struct field *f;
> int count = 1;
> - enum address_class theclass;
> TIR tir;
> long svalue = sh->value;
> int bitsize;
> @@ -622,15 +641,14 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
> break;
>
> case stGlobal: /* External symbol, goes into global block. */
> - theclass = LOC_STATIC;
> b = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (top_stack->cur_st),
> GLOBAL_BLOCK);
> s = new_symbol (name);
> SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
> - goto data;
> + add_data_symbol (sh, ax, bigend, s, LOC_STATIC, b, objfile, name);
> + break;
>
> case stStatic: /* Static data, goes into current block. */
> - theclass = LOC_STATIC;
> b = top_stack->cur_block;
> s = new_symbol (name);
> if (SC_IS_COMMON (sh->sc))
> @@ -644,29 +662,19 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
> }
> else
> SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
> - goto data;
> + add_data_symbol (sh, ax, bigend, s, LOC_STATIC, b, objfile, name);
> + break;
>
> case stLocal: /* Local variable, goes into current block. */
> b = top_stack->cur_block;
> s = new_symbol (name);
> SYMBOL_VALUE (s) = svalue;
> if (sh->sc == scRegister)
> - theclass = mdebug_register_index;
> - else
> - theclass = LOC_LOCAL;
> -
> - data: /* Common code for symbols describing data. */
> - SYMBOL_DOMAIN (s) = VAR_DOMAIN;
> - SYMBOL_ACLASS_INDEX (s) = theclass;
> - add_symbol (s, top_stack->cur_st, b);
> -
> - /* Type could be missing if file is compiled without debugging info. */
> - if (SC_IS_UNDEF (sh->sc)
> - || sh->sc == scNil || sh->index == indexNil)
> - SYMBOL_TYPE (s) = objfile_type (objfile)->nodebug_data_symbol;
> + add_data_symbol (sh, ax, bigend, s, mdebug_register_index,
> + b, objfile, name);
> else
> - SYMBOL_TYPE (s) = parse_type (cur_fd, ax, sh->index, 0, bigend, name);
> - /* Value of a data symbol is its memory address. */
> + add_data_symbol (sh, ax, bigend, s, LOC_LOCAL,
> + b, objfile, name);
> break;
>
> case stParam: /* Arg to procedure, goes into current
>
> --
> 1.9.3
That looks good!