This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH c++ 2/6] mdebugread.c: Add cast


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!


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]