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.  */
 |