This is the mail archive of the binutils@sourceware.org mailing list for the binutils 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]

gas/dw2gencfi.c (output_cie): cleanup


Hello!

I was confused by this code: why should cie->per_encoding data or
cie->lsda_encoding data ever be emitted if (in the block just before)
their lengths are taken into account only for eh_frame == TRUE?  It so
happens that in that case that output_cie is called with eh_frame ==
FALSE (only by select_cie_for_fde; in turn only by cfi_finish), then
fde->per_encoding as well as fde->lsda_encoding will always be set to
DW_EH_PE_omit.  Yet, this could be made more explicit in output_cie.


gas/
2010-01-25  Thomas Schwinge  <thomas@codesourcery.com>

	* dw2gencfi.c (output_cie): Make it more explicit which code paths
	belong to .eh_frame only.

There are two possible patches: The first one's diff is shorter, the
second one's resulting code looks more coherent (IMO, anyway) ;-).  Pick
the one you prefer.

Index: dw2gencfi.c
===================================================================
RCS file: /cvs/src/src/gas/dw2gencfi.c,v
retrieving revision 1.45
diff -u -p -r1.45 dw2gencfi.c
--- dw2gencfi.c	4 Nov 2009 09:52:00 -0000	1.45
+++ dw2gencfi.c	15 Jan 2010 11:27:58 -0000
@@ -1320,7 +1320,8 @@ output_cie (struct cie_entry *cie, bfd_b
 	augmentation_size += 1 + encoding_size (cie->per_encoding);
       out_uleb128 (augmentation_size);		/* Augmentation size.  */
     }
-  if (cie->per_encoding != DW_EH_PE_omit)
+  if (eh_frame
+      && cie->per_encoding != DW_EH_PE_omit)
     {
       offsetT size = encoding_size (cie->per_encoding);
       out_one (cie->per_encoding);
@@ -1340,7 +1341,8 @@ output_cie (struct cie_entry *cie, bfd_b
       else
 	emit_expr (&exp, size);
     }
-  if (cie->lsda_encoding != DW_EH_PE_omit)
+  if (eh_frame
+      && cie->lsda_encoding != DW_EH_PE_omit)
     out_one (cie->lsda_encoding);
 
   switch (DWARF2_FDE_RELOC_SIZE)

Index: dw2gencfi.c
===================================================================
RCS file: /cvs/src/src/gas/dw2gencfi.c,v
retrieving revision 1.45
diff -u -p -r1.45 dw2gencfi.c
--- dw2gencfi.c	4 Nov 2009 09:52:00 -0000	1.45
+++ dw2gencfi.c	25 Jan 2010 10:51:12 -0000
@@ -1319,29 +1319,31 @@ output_cie (struct cie_entry *cie, bfd_b
       if (cie->per_encoding != DW_EH_PE_omit)
 	augmentation_size += 1 + encoding_size (cie->per_encoding);
       out_uleb128 (augmentation_size);		/* Augmentation size.  */
-    }
-  if (cie->per_encoding != DW_EH_PE_omit)
-    {
-      offsetT size = encoding_size (cie->per_encoding);
-      out_one (cie->per_encoding);
-      exp = cie->personality;
-      if ((cie->per_encoding & 0x70) == DW_EH_PE_pcrel)
+
+      if (cie->per_encoding != DW_EH_PE_omit)
 	{
+	  offsetT size = encoding_size (cie->per_encoding);
+	  out_one (cie->per_encoding);
+	  exp = cie->personality;
+	  if ((cie->per_encoding & 0x70) == DW_EH_PE_pcrel)
+	    {
 #if CFI_DIFF_EXPR_OK
-	  exp.X_op = O_subtract;
-	  exp.X_op_symbol = symbol_temp_new_now ();
-	  emit_expr (&exp, size);
+	      exp.X_op = O_subtract;
+	      exp.X_op_symbol = symbol_temp_new_now ();
+	      emit_expr (&exp, size);
 #elif defined (tc_cfi_emit_pcrel_expr)
-	  tc_cfi_emit_pcrel_expr (&exp, size);
+	      tc_cfi_emit_pcrel_expr (&exp, size);
 #else
-	  abort ();
+	      abort ();
 #endif
+	    }
+	  else
+	    emit_expr (&exp, size);
 	}
-      else
-	emit_expr (&exp, size);
+
+      if (cie->lsda_encoding != DW_EH_PE_omit)
+	out_one (cie->lsda_encoding);
     }
-  if (cie->lsda_encoding != DW_EH_PE_omit)
-    out_one (cie->lsda_encoding);
 
   switch (DWARF2_FDE_RELOC_SIZE)
     {


Regards,
 Thomas

Attachment: pgp00000.pgp
Description: PGP signature


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