[v4,1/5] Add suitable defines to use at call and use sites

Message ID 20250909124344.318803-1-guillaume.vacherias@foss.st.com
State New
Headers
Series [v4,1/5] Add suitable defines to use at call and use sites |

Commit Message

Guillaume VACHERIAS - foss Sept. 9, 2025, 12:43 p.m. UTC
  Hello Jan,

I've added a structure `generic_type` which simplifies and clarify the
linking mechanism. I hope this aligns with what your suggestion !

Changes since v1:
- Added new prerequisite patch to better handle call and use sites.
- Change function process_debug_info arguments bool to unsigned int.
- Change option name to "--map-global-vars" instead of "-Y/--map-file".
- Added information on DWARF dependencues of this option.
- Correct switch-case braces alignment.
- Correct type of structure container field holding DW_AT_name from
(unsigned char *) to plain text (char *).
- Change to sizeof (<expression>) to avoid risk of variable's types being
changed.
- Replace error messages with asserts.
- Rename enumeration identifier UNKNOWN to UNKNWON_TYPE to be less generic.
- Remove unnecessary typedef aliases.

Changes since v2:
- Fix defines DO_LOC and DO_TYPES values to lower-case x-exes.
- Correctly set and clear do_flags anew.
- Remove unnecessary parenthesis.

Changes since v3:
- Introduce `generic_type` structure which generalize all structure
containers. `generic_type` will serve as linked list to contain different type
of DWARF informaation.
- Introduce `generic_type_l` structure for element insertion at tail of list.
- Use tail and head pointers as well for enumeration and subrange contents.
- Changed get_or_create_<structure> as well as free_<structure> function to
match with new structure `generic_type`.
- Changed objdump.exp test to ensure that DWARF2 is used and order of display
of information does not matter.

Guillaume.

---
Fuse do_loc and do_types arguments into a signle unsigned int do_flags for
better code readability.

binutils/

	* dwarf.c (DO_LOC, DO_TYPES): Define.
	(process_debug_info): Change arguments do_loc and do_types
	to a single unsigned int do_flags.
	(find_cu_tu_set_v2): Change parameter do_types from int to bool.
---
 binutils/dwarf.c | 75 +++++++++++++++++++++++++++---------------------
 1 file changed, 43 insertions(+), 32 deletions(-)
  

Comments

Jan Beulich Sept. 15, 2025, 2:57 p.m. UTC | #1
On 09.09.2025 14:43, Guillaume VACHERIAS wrote:
> Hello Jan,
> 
> I've added a structure `generic_type` which simplifies and clarify the
> linking mechanism. I hope this aligns with what your suggestion !

This doesn't look to apply to this patch? In fact everything up to ...

> Changes since v1:
> - Added new prerequisite patch to better handle call and use sites.
> - Change function process_debug_info arguments bool to unsigned int.
> - Change option name to "--map-global-vars" instead of "-Y/--map-file".
> - Added information on DWARF dependencues of this option.
> - Correct switch-case braces alignment.
> - Correct type of structure container field holding DW_AT_name from
> (unsigned char *) to plain text (char *).
> - Change to sizeof (<expression>) to avoid risk of variable's types being
> changed.
> - Replace error messages with asserts.
> - Rename enumeration identifier UNKNOWN to UNKNWON_TYPE to be less generic.
> - Remove unnecessary typedef aliases.
> 
> Changes since v2:
> - Fix defines DO_LOC and DO_TYPES values to lower-case x-exes.
> - Correctly set and clear do_flags anew.
> - Remove unnecessary parenthesis.
> 
> Changes since v3:
> - Introduce `generic_type` structure which generalize all structure
> containers. `generic_type` will serve as linked list to contain different type
> of DWARF informaation.
> - Introduce `generic_type_l` structure for element insertion at tail of list.
> - Use tail and head pointers as well for enumeration and subrange contents.
> - Changed get_or_create_<structure> as well as free_<structure> function to
> match with new structure `generic_type`.
> - Changed objdump.exp test to ensure that DWARF2 is used and order of display
> of information does not matter.
> 
> Guillaume.

... here looks like it's meant to go into a cover letter?

> ---

If everything down from here is what is supposed to be committed, then: Okay.

Jan

> Fuse do_loc and do_types arguments into a signle unsigned int do_flags for
> better code readability.
> 
> binutils/
> 
> 	* dwarf.c (DO_LOC, DO_TYPES): Define.
> 	(process_debug_info): Change arguments do_loc and do_types
> 	to a single unsigned int do_flags.
> 	(find_cu_tu_set_v2): Change parameter do_types from int to bool.
> ---
>  binutils/dwarf.c | 75 +++++++++++++++++++++++++++---------------------
>  1 file changed, 43 insertions(+), 32 deletions(-)
> 
> diff --git a/binutils/dwarf.c b/binutils/dwarf.c
> index bc5aa2b6b1b..b2bb3e595fe 100644
> --- a/binutils/dwarf.c
> +++ b/binutils/dwarf.c
> @@ -51,6 +51,9 @@
>  #define MAX(a, b) ((a) > (b) ? (a) : (b))
>  #define MIN(a, b) ((a) < (b) ? (a) : (b))
>  
> +#define DO_LOC     0x1
> +#define DO_TYPES   0x2
> +
>  static const char *regname (unsigned int regno, int row);
>  static const char *regname_internal_by_table_only (unsigned int regno);
>  
> @@ -1727,7 +1730,7 @@ decode_location_expression (unsigned char * data,
>     This is used for DWARF package files.  */
>  
>  static struct cu_tu_set *
> -find_cu_tu_set_v2 (uint64_t cu_offset, int do_types)
> +find_cu_tu_set_v2 (uint64_t cu_offset, bool do_types)
>  {
>    struct cu_tu_set *p;
>    unsigned int nsets;
> @@ -3759,8 +3762,7 @@ static bool
>  process_debug_info (struct dwarf_section * section,
>  		    void *file,
>  		    enum dwarf_section_display_enum abbrev_sec,
> -		    bool do_loc,
> -		    bool do_types)
> +		    unsigned int do_flags)
>  {
>    unsigned char *start = section->start;
>    unsigned char *end = start + section->size;
> @@ -3808,9 +3810,9 @@ process_debug_info (struct dwarf_section * section,
>        return false;
>      }
>  
> -  if ((do_loc || do_debug_loc || do_debug_ranges || do_debug_info)
> +  if (((do_flags & DO_LOC) || do_debug_loc || do_debug_ranges || do_debug_info)
>        && alloc_num_debug_info_entries == 0
> -      && !do_types)
> +      && !(do_flags & DO_TYPES))
>      {
>        /* Then allocate an array to hold the information.  */
>        debug_information = cmalloc (num_units, sizeof (*debug_information));
> @@ -3832,7 +3834,7 @@ process_debug_info (struct dwarf_section * section,
>        alloc_num_debug_info_entries = num_units;
>      }
>  
> -  if (!do_loc)
> +  if (!(do_flags & DO_LOC))
>      {
>        load_debug_section_with_follow (str, file);
>        load_debug_section_with_follow (line_str, file);
> @@ -3855,7 +3857,7 @@ process_debug_info (struct dwarf_section * section,
>        return false;
>      }
>  
> -  if (!do_loc && dwarf_start_die == 0)
> +  if (!(do_flags & DO_LOC) && dwarf_start_die == 0)
>      introduce (section, false);
>  
>    free_all_abbrevs ();
> @@ -3891,7 +3893,7 @@ process_debug_info (struct dwarf_section * section,
>  
>        SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end_cu);
>  
> -      this_set = find_cu_tu_set_v2 (cu_offset, do_types);
> +      this_set = find_cu_tu_set_v2 (cu_offset, (do_flags & DO_TYPES));
>  
>        if (compunit.cu_version < 5)
>  	{
> @@ -3902,7 +3904,10 @@ process_debug_info (struct dwarf_section * section,
>        else
>  	{
>  	  SAFE_BYTE_GET_AND_INC (compunit.cu_unit_type, hdrptr, 1, end_cu);
> -	  do_types = (compunit.cu_unit_type == DW_UT_type);
> +	  if (compunit.cu_unit_type == DW_UT_type)
> +	    do_flags |= DO_TYPES;
> +	  else
> +	    do_flags &= ~DO_TYPES;
>  
>  	  SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end_cu);
>  	}
> @@ -3973,7 +3978,7 @@ process_debug_info (struct dwarf_section * section,
>  
>        SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end_cu);
>  
> -      this_set = find_cu_tu_set_v2 (cu_offset, do_types);
> +      this_set = find_cu_tu_set_v2 (cu_offset, (do_flags & DO_TYPES));
>  
>        if (compunit.cu_version < 5)
>  	{
> @@ -3984,7 +3989,10 @@ process_debug_info (struct dwarf_section * section,
>        else
>  	{
>  	  SAFE_BYTE_GET_AND_INC (compunit.cu_unit_type, hdrptr, 1, end_cu);
> -	  do_types = (compunit.cu_unit_type == DW_UT_type);
> +	  if (compunit.cu_unit_type == DW_UT_type)
> +	    do_flags |= DO_TYPES;
> +	  else
> +	    do_flags &= ~DO_TYPES;
>  
>  	  SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end_cu);
>  	}
> @@ -4022,7 +4030,7 @@ process_debug_info (struct dwarf_section * section,
>  	  compunit.cu_pointer_size = offset_size;
>  	}
>  
> -      if (do_types)
> +      if (do_flags & DO_TYPES)
>  	{
>  	  SAFE_BYTE_GET_AND_INC (signature, hdrptr, 8, end_cu);
>  	  SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size, end_cu);
> @@ -4034,10 +4042,11 @@ process_debug_info (struct dwarf_section * section,
>  	  continue;
>  	}
>  
> -      if ((do_loc || do_debug_loc || do_debug_ranges || do_debug_info)
> +      if (((do_flags & DO_LOC) || do_debug_loc
> +	  || do_debug_ranges || do_debug_info)
>  	  && num_debug_info_entries == 0
>  	  && alloc_num_debug_info_entries > unit
> -	  && ! do_types)
> +	  && ! (do_flags & DO_TYPES))
>  	{
>  	  free_debug_information (&debug_information[unit]);
>  	  memset (&debug_information[unit], 0, sizeof (*debug_information));
> @@ -4049,7 +4058,7 @@ process_debug_info (struct dwarf_section * section,
>  	  debug_information[unit].ranges_base = DEBUG_INFO_UNAVAILABLE;
>  	}
>  
> -      if (!do_loc && dwarf_start_die == 0)
> +      if (!(do_flags & DO_LOC) && dwarf_start_die == 0)
>  	{
>  	  printf (_("  Compilation Unit @ offset %#" PRIx64 ":\n"),
>  		  cu_offset);
> @@ -4068,7 +4077,7 @@ process_debug_info (struct dwarf_section * section,
>  	  printf (_("   Abbrev Offset: %#" PRIx64 "\n"),
>  		  compunit.cu_abbrev_offset);
>  	  printf (_("   Pointer Size:  %d\n"), compunit.cu_pointer_size);
> -	  if (do_types)
> +	  if (do_flags & DO_TYPES)
>  	    {
>  	      printf (_("   Signature:     %#" PRIx64 "\n"), signature);
>  	      printf (_("   Type Offset:   %#" PRIx64 "\n"), type_offset);
> @@ -4151,7 +4160,7 @@ process_debug_info (struct dwarf_section * section,
>  		    break;
>  		}
>  
> -	      if (!do_loc && die_offset >= dwarf_start_die
> +	      if (!(do_flags & DO_LOC) && die_offset >= dwarf_start_die
>  		  && (dwarf_cutoff_level == -1
>  		      || level < dwarf_cutoff_level))
>  		printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
> @@ -4180,7 +4189,7 @@ process_debug_info (struct dwarf_section * section,
>  	      continue;
>  	    }
>  
> -	  if (!do_loc)
> +	  if (!(do_flags & DO_LOC))
>  	    {
>  	      if (dwarf_start_die != 0 && die_offset < dwarf_start_die)
>  		do_printing = 0;
> @@ -4210,7 +4219,7 @@ process_debug_info (struct dwarf_section * section,
>  
>  	  if (entry == NULL)
>  	    {
> -	      if (!do_loc && do_printing)
> +	      if (!(do_flags & DO_LOC) && do_printing)
>  		{
>  		  printf ("\n");
>  		  fflush (stdout);
> @@ -4222,7 +4231,7 @@ process_debug_info (struct dwarf_section * section,
>  	      return false;
>  	    }
>  
> -	  if (!do_loc && do_printing)
> +	  if (!(do_flags & DO_LOC) && do_printing)
>  	    printf (" (%s)\n", get_TAG_name (entry->tag));
>  
>  	  switch (entry->tag)
> @@ -4233,7 +4242,7 @@ process_debug_info (struct dwarf_section * section,
>  	    case DW_TAG_compile_unit:
>  	    case DW_TAG_skeleton_unit:
>  	      need_base_address = 1;
> -	      need_dwo_info = do_loc;
> +	      need_dwo_info = do_flags & DO_LOC;
>  	      break;
>  	    case DW_TAG_entry_point:
>  	      need_base_address = 0;
> @@ -4289,7 +4298,7 @@ process_debug_info (struct dwarf_section * section,
>  	       attr && attr->attribute;
>  	       attr = attr->next)
>  	    {
> -	      if (! do_loc && do_printing)
> +	      if (! (do_flags & DO_LOC) && do_printing)
>  		/* Show the offset from where the tag was extracted.  */
>  		printf ("    <%tx>", tags - section_begin);
>  	      tags = read_and_display_attr (attr->attribute,
> @@ -4303,7 +4312,8 @@ process_debug_info (struct dwarf_section * section,
>  					    offset_size,
>  					    compunit.cu_version,
>  					    debug_info_p,
> -					    do_loc || ! do_printing,
> +					    (do_flags & DO_LOC)
> +					    || ! do_printing,
>  					    section,
>  					    this_set,
>  					    level);
> @@ -4343,9 +4353,9 @@ process_debug_info (struct dwarf_section * section,
>  
>    /* Set num_debug_info_entries here so that it can be used to check if
>       we need to process .debug_loc and .debug_ranges sections.  */
> -  if ((do_loc || do_debug_loc || do_debug_ranges || do_debug_info)
> +  if (((do_flags & DO_LOC) || do_debug_loc || do_debug_ranges || do_debug_info)
>        && num_debug_info_entries == 0
> -      && ! do_types)
> +      && ! (do_flags & DO_TYPES))
>      {
>        if (num_units > alloc_num_debug_info_entries)
>  	num_debug_info_entries = alloc_num_debug_info_entries;
> @@ -4353,7 +4363,7 @@ process_debug_info (struct dwarf_section * section,
>  	num_debug_info_entries = num_units;
>      }
>  
> -  if (!do_loc)
> +  if (!(do_flags & DO_LOC))
>      printf ("\n");
>  
>    return true;
> @@ -4381,12 +4391,13 @@ load_debug_info (void * file)
>    (void) load_cu_tu_indexes (file);
>  
>    if (load_debug_section_with_follow (info, file)
> -      && process_debug_info (&debug_displays [info].section, file, abbrev, true, false))
> +      && process_debug_info (&debug_displays [info].section, file,
> +			     abbrev, DO_LOC))
>      return num_debug_info_entries;
>  
>    if (load_debug_section_with_follow (info_dwo, file)
>        && process_debug_info (&debug_displays [info_dwo].section, file,
> -			     abbrev_dwo, true, false))
> +			     abbrev_dwo, DO_LOC))
>      return num_debug_info_entries;
>  
>    num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
> @@ -7675,19 +7686,19 @@ display_debug_str (struct dwarf_section *section,
>  static int
>  display_debug_info (struct dwarf_section *section, void *file)
>  {
> -  return process_debug_info (section, file, section->abbrev_sec, false, false);
> +  return process_debug_info (section, file, section->abbrev_sec, 0);
>  }
>  
>  static int
>  display_debug_types (struct dwarf_section *section, void *file)
>  {
> -  return process_debug_info (section, file, section->abbrev_sec, false, true);
> +  return process_debug_info (section, file, section->abbrev_sec, DO_TYPES);
>  }
>  
>  static int
>  display_trace_info (struct dwarf_section *section, void *file)
>  {
> -  return process_debug_info (section, file, section->abbrev_sec, false, true);
> +  return process_debug_info (section, file, section->abbrev_sec, DO_TYPES);
>  }
>  
>  static int
> @@ -12559,7 +12570,7 @@ load_separate_debug_files (void * file, const char * filename)
>        free_dwo_info ();
>  
>        if (process_debug_info (& debug_displays[info].section, file, abbrev,
> -			      true, false))
> +			      DO_LOC))
>  	{
>  	  bool introduced = false;
>  	  dwo_info *dwinfo;
  
Guillaume VACHERIAS - foss Sept. 16, 2025, 8:36 a.m. UTC | #2
> > Hello Jan,
> >
> > I've added a structure `generic_type` which simplifies and clarify the
> > linking mechanism. I hope this aligns with what your suggestion !
> 
> This doesn't look to apply to this patch? In fact everything up to ...
> 
> > Changes since v1:
> > - Added new prerequisite patch to better handle call and use sites.
> > - Change function process_debug_info arguments bool to unsigned int.
> > - Change option name to "--map-global-vars" instead of "-Y/--map-file".
> > - Added information on DWARF dependencues of this option.
> > - Correct switch-case braces alignment.
> > - Correct type of structure container field holding DW_AT_name from
> > (unsigned char *) to plain text (char *).
> > - Change to sizeof (<expression>) to avoid risk of variable's types being
> > changed.
> > - Replace error messages with asserts.
> > - Rename enumeration identifier UNKNOWN to UNKNWON_TYPE to be
> less generic.
> > - Remove unnecessary typedef aliases.
> >
> > Changes since v2:
> > - Fix defines DO_LOC and DO_TYPES values to lower-case x-exes.
> > - Correctly set and clear do_flags anew.
> > - Remove unnecessary parenthesis.
> >
> > Changes since v3:
> > - Introduce `generic_type` structure which generalize all structure
> > containers. `generic_type` will serve as linked list to contain different type
> > of DWARF informaation.
> > - Introduce `generic_type_l` structure for element insertion at tail of list.
> > - Use tail and head pointers as well for enumeration and subrange
> contents.
> > - Changed get_or_create_<structure> as well as free_<structure> function
> to
> > match with new structure `generic_type`.
> > - Changed objdump.exp test to ensure that DWARF2 is used and order of
> display
> > of information does not matter.
> >
> > Guillaume.
> 
> ... here looks like it's meant to go into a cover letter?

Yes, I should've use option --cover-letter, as I thought that everything before
separator "---" wouldn't be included in the commit message.

Guillaume.
> 
> > ---
> 
> If everything down from here is what is supposed to be committed, then:
> Okay.
> 
> Jan
> 
> > Fuse do_loc and do_types arguments into a signle unsigned int do_flags for
> > better code readability.
> >
> > binutils/
> >
> > 	* dwarf.c (DO_LOC, DO_TYPES): Define.
> > 	(process_debug_info): Change arguments do_loc and do_types
> > 	to a single unsigned int do_flags.
> > 	(find_cu_tu_set_v2): Change parameter do_types from int to bool.
> > ---
> >  binutils/dwarf.c | 75 +++++++++++++++++++++++++++---------------------
> >  1 file changed, 43 insertions(+), 32 deletions(-)
> >
> > diff --git a/binutils/dwarf.c b/binutils/dwarf.c
> > index bc5aa2b6b1b..b2bb3e595fe 100644
> > --- a/binutils/dwarf.c
> > +++ b/binutils/dwarf.c
> > @@ -51,6 +51,9 @@
> >  #define MAX(a, b) ((a) > (b) ? (a) : (b))
> >  #define MIN(a, b) ((a) < (b) ? (a) : (b))
> >
> > +#define DO_LOC     0x1
> > +#define DO_TYPES   0x2
> > +
> >  static const char *regname (unsigned int regno, int row);
> >  static const char *regname_internal_by_table_only (unsigned int regno);
> >
> > @@ -1727,7 +1730,7 @@ decode_location_expression (unsigned char *
> data,
> >     This is used for DWARF package files.  */
> >
> >  static struct cu_tu_set *
> > -find_cu_tu_set_v2 (uint64_t cu_offset, int do_types)
> > +find_cu_tu_set_v2 (uint64_t cu_offset, bool do_types)
> >  {
> >    struct cu_tu_set *p;
> >    unsigned int nsets;
> > @@ -3759,8 +3762,7 @@ static bool
> >  process_debug_info (struct dwarf_section * section,
> >  		    void *file,
> >  		    enum dwarf_section_display_enum abbrev_sec,
> > -		    bool do_loc,
> > -		    bool do_types)
> > +		    unsigned int do_flags)
> >  {
> >    unsigned char *start = section->start;
> >    unsigned char *end = start + section->size;
> > @@ -3808,9 +3810,9 @@ process_debug_info (struct dwarf_section *
> section,
> >        return false;
> >      }
> >
> > -  if ((do_loc || do_debug_loc || do_debug_ranges || do_debug_info)
> > +  if (((do_flags & DO_LOC) || do_debug_loc || do_debug_ranges ||
> do_debug_info)
> >        && alloc_num_debug_info_entries == 0
> > -      && !do_types)
> > +      && !(do_flags & DO_TYPES))
> >      {
> >        /* Then allocate an array to hold the information.  */
> >        debug_information = cmalloc (num_units, sizeof
> (*debug_information));
> > @@ -3832,7 +3834,7 @@ process_debug_info (struct dwarf_section *
> section,
> >        alloc_num_debug_info_entries = num_units;
> >      }
> >
> > -  if (!do_loc)
> > +  if (!(do_flags & DO_LOC))
> >      {
> >        load_debug_section_with_follow (str, file);
> >        load_debug_section_with_follow (line_str, file);
> > @@ -3855,7 +3857,7 @@ process_debug_info (struct dwarf_section *
> section,
> >        return false;
> >      }
> >
> > -  if (!do_loc && dwarf_start_die == 0)
> > +  if (!(do_flags & DO_LOC) && dwarf_start_die == 0)
> >      introduce (section, false);
> >
> >    free_all_abbrevs ();
> > @@ -3891,7 +3893,7 @@ process_debug_info (struct dwarf_section *
> section,
> >
> >        SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end_cu);
> >
> > -      this_set = find_cu_tu_set_v2 (cu_offset, do_types);
> > +      this_set = find_cu_tu_set_v2 (cu_offset, (do_flags & DO_TYPES));
> >
> >        if (compunit.cu_version < 5)
> >  	{
> > @@ -3902,7 +3904,10 @@ process_debug_info (struct dwarf_section *
> section,
> >        else
> >  	{
> >  	  SAFE_BYTE_GET_AND_INC (compunit.cu_unit_type, hdrptr, 1,
> end_cu);
> > -	  do_types = (compunit.cu_unit_type == DW_UT_type);
> > +	  if (compunit.cu_unit_type == DW_UT_type)
> > +	    do_flags |= DO_TYPES;
> > +	  else
> > +	    do_flags &= ~DO_TYPES;
> >
> >  	  SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1,
> end_cu);
> >  	}
> > @@ -3973,7 +3978,7 @@ process_debug_info (struct dwarf_section *
> section,
> >
> >        SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end_cu);
> >
> > -      this_set = find_cu_tu_set_v2 (cu_offset, do_types);
> > +      this_set = find_cu_tu_set_v2 (cu_offset, (do_flags & DO_TYPES));
> >
> >        if (compunit.cu_version < 5)
> >  	{
> > @@ -3984,7 +3989,10 @@ process_debug_info (struct dwarf_section *
> section,
> >        else
> >  	{
> >  	  SAFE_BYTE_GET_AND_INC (compunit.cu_unit_type, hdrptr, 1,
> end_cu);
> > -	  do_types = (compunit.cu_unit_type == DW_UT_type);
> > +	  if (compunit.cu_unit_type == DW_UT_type)
> > +	    do_flags |= DO_TYPES;
> > +	  else
> > +	    do_flags &= ~DO_TYPES;
> >
> >  	  SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1,
> end_cu);
> >  	}
> > @@ -4022,7 +4030,7 @@ process_debug_info (struct dwarf_section *
> section,
> >  	  compunit.cu_pointer_size = offset_size;
> >  	}
> >
> > -      if (do_types)
> > +      if (do_flags & DO_TYPES)
> >  	{
> >  	  SAFE_BYTE_GET_AND_INC (signature, hdrptr, 8, end_cu);
> >  	  SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size,
> end_cu);
> > @@ -4034,10 +4042,11 @@ process_debug_info (struct dwarf_section *
> section,
> >  	  continue;
> >  	}
> >
> > -      if ((do_loc || do_debug_loc || do_debug_ranges || do_debug_info)
> > +      if (((do_flags & DO_LOC) || do_debug_loc
> > +	  || do_debug_ranges || do_debug_info)
> >  	  && num_debug_info_entries == 0
> >  	  && alloc_num_debug_info_entries > unit
> > -	  && ! do_types)
> > +	  && ! (do_flags & DO_TYPES))
> >  	{
> >  	  free_debug_information (&debug_information[unit]);
> >  	  memset (&debug_information[unit], 0, sizeof
> (*debug_information));
> > @@ -4049,7 +4058,7 @@ process_debug_info (struct dwarf_section *
> section,
> >  	  debug_information[unit].ranges_base =
> DEBUG_INFO_UNAVAILABLE;
> >  	}
> >
> > -      if (!do_loc && dwarf_start_die == 0)
> > +      if (!(do_flags & DO_LOC) && dwarf_start_die == 0)
> >  	{
> >  	  printf (_("  Compilation Unit @ offset %#" PRIx64 ":\n"),
> >  		  cu_offset);
> > @@ -4068,7 +4077,7 @@ process_debug_info (struct dwarf_section *
> section,
> >  	  printf (_("   Abbrev Offset: %#" PRIx64 "\n"),
> >  		  compunit.cu_abbrev_offset);
> >  	  printf (_("   Pointer Size:  %d\n"), compunit.cu_pointer_size);
> > -	  if (do_types)
> > +	  if (do_flags & DO_TYPES)
> >  	    {
> >  	      printf (_("   Signature:     %#" PRIx64 "\n"), signature);
> >  	      printf (_("   Type Offset:   %#" PRIx64 "\n"), type_offset);
> > @@ -4151,7 +4160,7 @@ process_debug_info (struct dwarf_section *
> section,
> >  		    break;
> >  		}
> >
> > -	      if (!do_loc && die_offset >= dwarf_start_die
> > +	      if (!(do_flags & DO_LOC) && die_offset >= dwarf_start_die
> >  		  && (dwarf_cutoff_level == -1
> >  		      || level < dwarf_cutoff_level))
> >  		printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
> > @@ -4180,7 +4189,7 @@ process_debug_info (struct dwarf_section *
> section,
> >  	      continue;
> >  	    }
> >
> > -	  if (!do_loc)
> > +	  if (!(do_flags & DO_LOC))
> >  	    {
> >  	      if (dwarf_start_die != 0 && die_offset < dwarf_start_die)
> >  		do_printing = 0;
> > @@ -4210,7 +4219,7 @@ process_debug_info (struct dwarf_section *
> section,
> >
> >  	  if (entry == NULL)
> >  	    {
> > -	      if (!do_loc && do_printing)
> > +	      if (!(do_flags & DO_LOC) && do_printing)
> >  		{
> >  		  printf ("\n");
> >  		  fflush (stdout);
> > @@ -4222,7 +4231,7 @@ process_debug_info (struct dwarf_section *
> section,
> >  	      return false;
> >  	    }
> >
> > -	  if (!do_loc && do_printing)
> > +	  if (!(do_flags & DO_LOC) && do_printing)
> >  	    printf (" (%s)\n", get_TAG_name (entry->tag));
> >
> >  	  switch (entry->tag)
> > @@ -4233,7 +4242,7 @@ process_debug_info (struct dwarf_section *
> section,
> >  	    case DW_TAG_compile_unit:
> >  	    case DW_TAG_skeleton_unit:
> >  	      need_base_address = 1;
> > -	      need_dwo_info = do_loc;
> > +	      need_dwo_info = do_flags & DO_LOC;
> >  	      break;
> >  	    case DW_TAG_entry_point:
> >  	      need_base_address = 0;
> > @@ -4289,7 +4298,7 @@ process_debug_info (struct dwarf_section *
> section,
> >  	       attr && attr->attribute;
> >  	       attr = attr->next)
> >  	    {
> > -	      if (! do_loc && do_printing)
> > +	      if (! (do_flags & DO_LOC) && do_printing)
> >  		/* Show the offset from where the tag was extracted.  */
> >  		printf ("    <%tx>", tags - section_begin);
> >  	      tags = read_and_display_attr (attr->attribute,
> > @@ -4303,7 +4312,8 @@ process_debug_info (struct dwarf_section *
> section,
> >  					    offset_size,
> >  					    compunit.cu_version,
> >  					    debug_info_p,
> > -					    do_loc || ! do_printing,
> > +					    (do_flags & DO_LOC)
> > +					    || ! do_printing,
> >  					    section,
> >  					    this_set,
> >  					    level);
> > @@ -4343,9 +4353,9 @@ process_debug_info (struct dwarf_section *
> section,
> >
> >    /* Set num_debug_info_entries here so that it can be used to check if
> >       we need to process .debug_loc and .debug_ranges sections.  */
> > -  if ((do_loc || do_debug_loc || do_debug_ranges || do_debug_info)
> > +  if (((do_flags & DO_LOC) || do_debug_loc || do_debug_ranges ||
> do_debug_info)
> >        && num_debug_info_entries == 0
> > -      && ! do_types)
> > +      && ! (do_flags & DO_TYPES))
> >      {
> >        if (num_units > alloc_num_debug_info_entries)
> >  	num_debug_info_entries = alloc_num_debug_info_entries;
> > @@ -4353,7 +4363,7 @@ process_debug_info (struct dwarf_section *
> section,
> >  	num_debug_info_entries = num_units;
> >      }
> >
> > -  if (!do_loc)
> > +  if (!(do_flags & DO_LOC))
> >      printf ("\n");
> >
> >    return true;
> > @@ -4381,12 +4391,13 @@ load_debug_info (void * file)
> >    (void) load_cu_tu_indexes (file);
> >
> >    if (load_debug_section_with_follow (info, file)
> > -      && process_debug_info (&debug_displays [info].section, file, abbrev,
> true, false))
> > +      && process_debug_info (&debug_displays [info].section, file,
> > +			     abbrev, DO_LOC))
> >      return num_debug_info_entries;
> >
> >    if (load_debug_section_with_follow (info_dwo, file)
> >        && process_debug_info (&debug_displays [info_dwo].section, file,
> > -			     abbrev_dwo, true, false))
> > +			     abbrev_dwo, DO_LOC))
> >      return num_debug_info_entries;
> >
> >    num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
> > @@ -7675,19 +7686,19 @@ display_debug_str (struct dwarf_section
> *section,
> >  static int
> >  display_debug_info (struct dwarf_section *section, void *file)
> >  {
> > -  return process_debug_info (section, file, section->abbrev_sec, false,
> false);
> > +  return process_debug_info (section, file, section->abbrev_sec, 0);
> >  }
> >
> >  static int
> >  display_debug_types (struct dwarf_section *section, void *file)
> >  {
> > -  return process_debug_info (section, file, section->abbrev_sec, false,
> true);
> > +  return process_debug_info (section, file, section->abbrev_sec,
> DO_TYPES);
> >  }
> >
> >  static int
> >  display_trace_info (struct dwarf_section *section, void *file)
> >  {
> > -  return process_debug_info (section, file, section->abbrev_sec, false,
> true);
> > +  return process_debug_info (section, file, section->abbrev_sec,
> DO_TYPES);
> >  }
> >
> >  static int
> > @@ -12559,7 +12570,7 @@ load_separate_debug_files (void * file, const
> char * filename)
> >        free_dwo_info ();
> >
> >        if (process_debug_info (& debug_displays[info].section, file, abbrev,
> > -			      true, false))
> > +			      DO_LOC))
> >  	{
> >  	  bool introduced = false;
> >  	  dwo_info *dwinfo;
  

Patch

diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index bc5aa2b6b1b..b2bb3e595fe 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -51,6 +51,9 @@ 
 #define MAX(a, b) ((a) > (b) ? (a) : (b))
 #define MIN(a, b) ((a) < (b) ? (a) : (b))
 
+#define DO_LOC     0x1
+#define DO_TYPES   0x2
+
 static const char *regname (unsigned int regno, int row);
 static const char *regname_internal_by_table_only (unsigned int regno);
 
@@ -1727,7 +1730,7 @@  decode_location_expression (unsigned char * data,
    This is used for DWARF package files.  */
 
 static struct cu_tu_set *
-find_cu_tu_set_v2 (uint64_t cu_offset, int do_types)
+find_cu_tu_set_v2 (uint64_t cu_offset, bool do_types)
 {
   struct cu_tu_set *p;
   unsigned int nsets;
@@ -3759,8 +3762,7 @@  static bool
 process_debug_info (struct dwarf_section * section,
 		    void *file,
 		    enum dwarf_section_display_enum abbrev_sec,
-		    bool do_loc,
-		    bool do_types)
+		    unsigned int do_flags)
 {
   unsigned char *start = section->start;
   unsigned char *end = start + section->size;
@@ -3808,9 +3810,9 @@  process_debug_info (struct dwarf_section * section,
       return false;
     }
 
-  if ((do_loc || do_debug_loc || do_debug_ranges || do_debug_info)
+  if (((do_flags & DO_LOC) || do_debug_loc || do_debug_ranges || do_debug_info)
       && alloc_num_debug_info_entries == 0
-      && !do_types)
+      && !(do_flags & DO_TYPES))
     {
       /* Then allocate an array to hold the information.  */
       debug_information = cmalloc (num_units, sizeof (*debug_information));
@@ -3832,7 +3834,7 @@  process_debug_info (struct dwarf_section * section,
       alloc_num_debug_info_entries = num_units;
     }
 
-  if (!do_loc)
+  if (!(do_flags & DO_LOC))
     {
       load_debug_section_with_follow (str, file);
       load_debug_section_with_follow (line_str, file);
@@ -3855,7 +3857,7 @@  process_debug_info (struct dwarf_section * section,
       return false;
     }
 
-  if (!do_loc && dwarf_start_die == 0)
+  if (!(do_flags & DO_LOC) && dwarf_start_die == 0)
     introduce (section, false);
 
   free_all_abbrevs ();
@@ -3891,7 +3893,7 @@  process_debug_info (struct dwarf_section * section,
 
       SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end_cu);
 
-      this_set = find_cu_tu_set_v2 (cu_offset, do_types);
+      this_set = find_cu_tu_set_v2 (cu_offset, (do_flags & DO_TYPES));
 
       if (compunit.cu_version < 5)
 	{
@@ -3902,7 +3904,10 @@  process_debug_info (struct dwarf_section * section,
       else
 	{
 	  SAFE_BYTE_GET_AND_INC (compunit.cu_unit_type, hdrptr, 1, end_cu);
-	  do_types = (compunit.cu_unit_type == DW_UT_type);
+	  if (compunit.cu_unit_type == DW_UT_type)
+	    do_flags |= DO_TYPES;
+	  else
+	    do_flags &= ~DO_TYPES;
 
 	  SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end_cu);
 	}
@@ -3973,7 +3978,7 @@  process_debug_info (struct dwarf_section * section,
 
       SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end_cu);
 
-      this_set = find_cu_tu_set_v2 (cu_offset, do_types);
+      this_set = find_cu_tu_set_v2 (cu_offset, (do_flags & DO_TYPES));
 
       if (compunit.cu_version < 5)
 	{
@@ -3984,7 +3989,10 @@  process_debug_info (struct dwarf_section * section,
       else
 	{
 	  SAFE_BYTE_GET_AND_INC (compunit.cu_unit_type, hdrptr, 1, end_cu);
-	  do_types = (compunit.cu_unit_type == DW_UT_type);
+	  if (compunit.cu_unit_type == DW_UT_type)
+	    do_flags |= DO_TYPES;
+	  else
+	    do_flags &= ~DO_TYPES;
 
 	  SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end_cu);
 	}
@@ -4022,7 +4030,7 @@  process_debug_info (struct dwarf_section * section,
 	  compunit.cu_pointer_size = offset_size;
 	}
 
-      if (do_types)
+      if (do_flags & DO_TYPES)
 	{
 	  SAFE_BYTE_GET_AND_INC (signature, hdrptr, 8, end_cu);
 	  SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size, end_cu);
@@ -4034,10 +4042,11 @@  process_debug_info (struct dwarf_section * section,
 	  continue;
 	}
 
-      if ((do_loc || do_debug_loc || do_debug_ranges || do_debug_info)
+      if (((do_flags & DO_LOC) || do_debug_loc
+	  || do_debug_ranges || do_debug_info)
 	  && num_debug_info_entries == 0
 	  && alloc_num_debug_info_entries > unit
-	  && ! do_types)
+	  && ! (do_flags & DO_TYPES))
 	{
 	  free_debug_information (&debug_information[unit]);
 	  memset (&debug_information[unit], 0, sizeof (*debug_information));
@@ -4049,7 +4058,7 @@  process_debug_info (struct dwarf_section * section,
 	  debug_information[unit].ranges_base = DEBUG_INFO_UNAVAILABLE;
 	}
 
-      if (!do_loc && dwarf_start_die == 0)
+      if (!(do_flags & DO_LOC) && dwarf_start_die == 0)
 	{
 	  printf (_("  Compilation Unit @ offset %#" PRIx64 ":\n"),
 		  cu_offset);
@@ -4068,7 +4077,7 @@  process_debug_info (struct dwarf_section * section,
 	  printf (_("   Abbrev Offset: %#" PRIx64 "\n"),
 		  compunit.cu_abbrev_offset);
 	  printf (_("   Pointer Size:  %d\n"), compunit.cu_pointer_size);
-	  if (do_types)
+	  if (do_flags & DO_TYPES)
 	    {
 	      printf (_("   Signature:     %#" PRIx64 "\n"), signature);
 	      printf (_("   Type Offset:   %#" PRIx64 "\n"), type_offset);
@@ -4151,7 +4160,7 @@  process_debug_info (struct dwarf_section * section,
 		    break;
 		}
 
-	      if (!do_loc && die_offset >= dwarf_start_die
+	      if (!(do_flags & DO_LOC) && die_offset >= dwarf_start_die
 		  && (dwarf_cutoff_level == -1
 		      || level < dwarf_cutoff_level))
 		printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
@@ -4180,7 +4189,7 @@  process_debug_info (struct dwarf_section * section,
 	      continue;
 	    }
 
-	  if (!do_loc)
+	  if (!(do_flags & DO_LOC))
 	    {
 	      if (dwarf_start_die != 0 && die_offset < dwarf_start_die)
 		do_printing = 0;
@@ -4210,7 +4219,7 @@  process_debug_info (struct dwarf_section * section,
 
 	  if (entry == NULL)
 	    {
-	      if (!do_loc && do_printing)
+	      if (!(do_flags & DO_LOC) && do_printing)
 		{
 		  printf ("\n");
 		  fflush (stdout);
@@ -4222,7 +4231,7 @@  process_debug_info (struct dwarf_section * section,
 	      return false;
 	    }
 
-	  if (!do_loc && do_printing)
+	  if (!(do_flags & DO_LOC) && do_printing)
 	    printf (" (%s)\n", get_TAG_name (entry->tag));
 
 	  switch (entry->tag)
@@ -4233,7 +4242,7 @@  process_debug_info (struct dwarf_section * section,
 	    case DW_TAG_compile_unit:
 	    case DW_TAG_skeleton_unit:
 	      need_base_address = 1;
-	      need_dwo_info = do_loc;
+	      need_dwo_info = do_flags & DO_LOC;
 	      break;
 	    case DW_TAG_entry_point:
 	      need_base_address = 0;
@@ -4289,7 +4298,7 @@  process_debug_info (struct dwarf_section * section,
 	       attr && attr->attribute;
 	       attr = attr->next)
 	    {
-	      if (! do_loc && do_printing)
+	      if (! (do_flags & DO_LOC) && do_printing)
 		/* Show the offset from where the tag was extracted.  */
 		printf ("    <%tx>", tags - section_begin);
 	      tags = read_and_display_attr (attr->attribute,
@@ -4303,7 +4312,8 @@  process_debug_info (struct dwarf_section * section,
 					    offset_size,
 					    compunit.cu_version,
 					    debug_info_p,
-					    do_loc || ! do_printing,
+					    (do_flags & DO_LOC)
+					    || ! do_printing,
 					    section,
 					    this_set,
 					    level);
@@ -4343,9 +4353,9 @@  process_debug_info (struct dwarf_section * section,
 
   /* Set num_debug_info_entries here so that it can be used to check if
      we need to process .debug_loc and .debug_ranges sections.  */
-  if ((do_loc || do_debug_loc || do_debug_ranges || do_debug_info)
+  if (((do_flags & DO_LOC) || do_debug_loc || do_debug_ranges || do_debug_info)
       && num_debug_info_entries == 0
-      && ! do_types)
+      && ! (do_flags & DO_TYPES))
     {
       if (num_units > alloc_num_debug_info_entries)
 	num_debug_info_entries = alloc_num_debug_info_entries;
@@ -4353,7 +4363,7 @@  process_debug_info (struct dwarf_section * section,
 	num_debug_info_entries = num_units;
     }
 
-  if (!do_loc)
+  if (!(do_flags & DO_LOC))
     printf ("\n");
 
   return true;
@@ -4381,12 +4391,13 @@  load_debug_info (void * file)
   (void) load_cu_tu_indexes (file);
 
   if (load_debug_section_with_follow (info, file)
-      && process_debug_info (&debug_displays [info].section, file, abbrev, true, false))
+      && process_debug_info (&debug_displays [info].section, file,
+			     abbrev, DO_LOC))
     return num_debug_info_entries;
 
   if (load_debug_section_with_follow (info_dwo, file)
       && process_debug_info (&debug_displays [info_dwo].section, file,
-			     abbrev_dwo, true, false))
+			     abbrev_dwo, DO_LOC))
     return num_debug_info_entries;
 
   num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
@@ -7675,19 +7686,19 @@  display_debug_str (struct dwarf_section *section,
 static int
 display_debug_info (struct dwarf_section *section, void *file)
 {
-  return process_debug_info (section, file, section->abbrev_sec, false, false);
+  return process_debug_info (section, file, section->abbrev_sec, 0);
 }
 
 static int
 display_debug_types (struct dwarf_section *section, void *file)
 {
-  return process_debug_info (section, file, section->abbrev_sec, false, true);
+  return process_debug_info (section, file, section->abbrev_sec, DO_TYPES);
 }
 
 static int
 display_trace_info (struct dwarf_section *section, void *file)
 {
-  return process_debug_info (section, file, section->abbrev_sec, false, true);
+  return process_debug_info (section, file, section->abbrev_sec, DO_TYPES);
 }
 
 static int
@@ -12559,7 +12570,7 @@  load_separate_debug_files (void * file, const char * filename)
       free_dwo_info ();
 
       if (process_debug_info (& debug_displays[info].section, file, abbrev,
-			      true, false))
+			      DO_LOC))
 	{
 	  bool introduced = false;
 	  dwo_info *dwinfo;