 cabdbc632e
			
		
	
	cabdbc632e
	
	
	
		
			
			Add the patches with real changes from the binutils 2.39 stable branch. I am not aware that we ran into any of these problems, but I think it is better to take the existing stable patches. They were exported like this: git format-patch binutils-2_39...origin/binutils-2_39-branch I removed the patches changing the version numbers only. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
		
			
				
	
	
		
			91 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From e8cf73215187b0c08679d726a5cc7c019fa3ea2e Mon Sep 17 00:00:00 2001
 | |
| From: Jan Beulich <jbeulich@suse.com>
 | |
| Date: Wed, 10 Aug 2022 10:34:22 +0200
 | |
| Subject: [PATCH 008/160] gas/Dwarf: properly skip zero-size functions
 | |
| 
 | |
| PR gas/29451
 | |
| 
 | |
| While out_debug_abbrev() properly skips such functions, out_debug_info()
 | |
| mistakenly didn't. It needs to calculate the high_pc expression ahead of
 | |
| time, in order to skip emitting any data for the function if the value
 | |
| is zero.
 | |
| 
 | |
| The one case which would still leave a zero-size entry is when
 | |
| symbol_get_obj(symp)->size ends up evaluating to zero. I hope we can
 | |
| expect that to not be the case, otherwise we'd need to have a way to
 | |
| post-process .debug_info contents between resolving expressions and
 | |
| actually writing the data out to the file. Even then it wouldn't be
 | |
| entirely obvious in which way to alter the data.
 | |
| 
 | |
| (cherry picked from commit d7abcbcea5ddd40a3bf28758b62f35933c59f996)
 | |
| ---
 | |
|  gas/dwarf2dbg.c | 39 ++++++++++++++++++++-------------------
 | |
|  1 file changed, 20 insertions(+), 19 deletions(-)
 | |
| 
 | |
| --- a/gas/dwarf2dbg.c
 | |
| +++ b/gas/dwarf2dbg.c
 | |
| @@ -2882,6 +2882,7 @@ out_debug_info (segT info_seg, segT abbr
 | |
|  	{
 | |
|  	  const char *name;
 | |
|  	  size_t len;
 | |
| +	  expressionS size = { .X_op = O_constant };
 | |
|  
 | |
|  	  /* Skip warning constructs (see above).  */
 | |
|  	  if (symbol_get_bfdsym (symp)->flags & BSF_WARNING)
 | |
| @@ -2895,6 +2896,18 @@ out_debug_info (segT info_seg, segT abbr
 | |
|  	  if (!S_IS_DEFINED (symp) || !S_IS_FUNCTION (symp))
 | |
|  	    continue;
 | |
|  
 | |
| +#if defined (OBJ_ELF) /* || defined (OBJ_MAYBE_ELF) */
 | |
| +	  size.X_add_number = S_GET_SIZE (symp);
 | |
| +	  if (size.X_add_number == 0 && IS_ELF
 | |
| +	      && symbol_get_obj (symp)->size != NULL)
 | |
| +	    {
 | |
| +	      size.X_op = O_add;
 | |
| +	      size.X_op_symbol = make_expr_symbol (symbol_get_obj (symp)->size);
 | |
| +	    }
 | |
| +#endif
 | |
| +	  if (size.X_op == O_constant && size.X_add_number == 0)
 | |
| +	    continue;
 | |
| +
 | |
|  	  subseg_set (str_seg, 0);
 | |
|  	  name_sym = symbol_temp_new_now_octets ();
 | |
|  	  name = S_GET_NAME (symp);
 | |
| @@ -2920,29 +2933,17 @@ out_debug_info (segT info_seg, segT abbr
 | |
|  	  emit_expr (&exp, sizeof_address);
 | |
|  
 | |
|  	  /* DW_AT_high_pc */
 | |
| -	  exp.X_op = O_constant;
 | |
| -#if defined (OBJ_ELF) /* || defined (OBJ_MAYBE_ELF) */
 | |
| -	  exp.X_add_number = S_GET_SIZE (symp);
 | |
| -	  if (exp.X_add_number == 0 && IS_ELF
 | |
| -	      && symbol_get_obj (symp)->size != NULL)
 | |
| -	    {
 | |
| -	      exp.X_op = O_add;
 | |
| -	      exp.X_op_symbol = make_expr_symbol (symbol_get_obj (symp)->size);
 | |
| -	    }
 | |
| -#else
 | |
| -	  exp.X_add_number = 0;
 | |
| -#endif
 | |
|  	  if (DWARF2_VERSION < 4)
 | |
|  	    {
 | |
| -	      if (exp.X_op == O_constant)
 | |
| -		exp.X_op = O_symbol;
 | |
| -	      exp.X_add_symbol = symp;
 | |
| -	      emit_expr (&exp, sizeof_address);
 | |
| +	      if (size.X_op == O_constant)
 | |
| +		size.X_op = O_symbol;
 | |
| +	      size.X_add_symbol = symp;
 | |
| +	      emit_expr (&size, sizeof_address);
 | |
|  	    }
 | |
| -	  else if (exp.X_op == O_constant)
 | |
| -	    out_uleb128 (exp.X_add_number);
 | |
| +	  else if (size.X_op == O_constant)
 | |
| +	    out_uleb128 (size.X_add_number);
 | |
|  	  else
 | |
| -	    emit_leb128_expr (symbol_get_value_expression (exp.X_op_symbol), 0);
 | |
| +	    emit_leb128_expr (symbol_get_value_expression (size.X_op_symbol), 0);
 | |
|  	}
 | |
|  
 | |
|        /* End of children.  */
 |