Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Michal Ludvig <mludvig@suse.cz>
To: GDB Patches <gdb-patches@sources.redhat.com>
Subject: [RFA] Dwarf2CFI fix
Date: Wed, 26 Feb 2003 17:14:00 -0000	[thread overview]
Message-ID: <3E5CF5F5.10300@suse.cz> (raw)

[-- Attachment #1: Type: text/plain, Size: 475 bytes --]

Hi all,
my code in dwarf2cfi.c assumed that CIE and FDE entries in .eh_frame are 
always in the chain CIE, FDE, FDE, ..., CIE, FDE, ...
where every FDE refers to the precedent CIE. Unfortunately this is not 
alway the case. Linker (?) sometimes optimizes things in a way that the 
assumption isn't true anymore. This patch addresses the problem.

OK to commit? Head and 5.3?

Michal Ludvig
-- 
* SuSE CR, s.r.o     * mludvig@suse.cz
* (+420) 296.545.373 * http://www.suse.cz

[-- Attachment #2: cfi-ciefdeorder-2-export.diff --]
[-- Type: text/plain, Size: 2587 bytes --]

2003-02-26  Michal Ludvig  <mludvig@suse.cz>

	* dwarf2cfi.c (parse_frame_info): It's not true that FDEs 
	always refer to the last CIE. We must deal with such a
	situation.
	* dwarf2cfi.h (

diff -upr gdb-upto-08/dwarf2cfi.c gdb/dwarf2cfi.c
--- gdb-upto-08/dwarf2cfi.c	2003-02-26 10:20:02.000000000 +0100
+++ gdb/dwarf2cfi.c	2003-02-26 17:17:30.000000000 +0100
@@ -50,6 +50,10 @@ struct cie_unit
   char *data;
   unsigned int data_length;
 
+  /* This field is 1 for CIE from .eh_frame
+     and 0 for one from .debug_frame. */
+  int eh_frame;
+
   struct objfile *objfile;
 
   /* Next in chain.  */
@@ -1502,6 +1502,7 @@ parse_frame_info (struct objfile *objfil
 	      char *aug;
 
 	      cie->objfile = objfile;
+	      cie->eh_frame = (eh_frame > 0);
 	      cie->next = cie_chunks;
 	      cie_chunks = cie;
 
@@ -1586,26 +1587,31 @@ parse_frame_info (struct objfile *objfil
 
 	      /* We assume that debug_frame is in order 
 	         CIE,FDE,CIE,FDE,FDE,...  and thus the CIE for this FDE
-	         should be stored in last_cie pointer. If not, we'll 
-	         try to find it by the older way.  */
-	      if (last_cie)
+	         should be stored in last_cie pointer. 
+		 However this assumption is not always true, because
+		 the linker does some magic and adds ghost CIEs under
+		 some circumstances. Thus we need to do some safety
+		 checks.  If last_cie isn't valid, we'll try to find
+		 the correct one using the older way.  */
+	      if (last_cie && last_cie->objfile == objfile &&
+		  last_cie->eh_frame == (eh_frame > 0) &&
+		  ((eh_frame &&
+		    last_cie->offset == (unit_offset + bytes_read - cie_id)) ||
+		   (!eh_frame && (cie->offset == cie_id))))
 		cie = last_cie;
 	      else
 		{
-		  warning ("CFI: last_cie == NULL. "
-			   "Perhaps a malformed %s section in '%s'...?\n",
-			   curr_section_name, objfile->name);
-
 		  cie = cie_chunks;
 		  while (cie)
 		    {
 		      if (cie->objfile == objfile)
 			{
-			  if (eh_frame &&
-			      (cie->offset ==
-			       (unit_offset + bytes_read - cie_id)))
+			  if (eh_frame && cie->eh_frame &&
+			      cie->offset ==
+			       (unit_offset + bytes_read - cie_id))
 			    break;
-			  if (!eh_frame && (cie->offset == cie_id))
+			  if (!eh_frame && !cie->eh_frame && 
+			      cie->offset == cie_id)
 			    break;
 			}
 
@@ -1614,6 +1620,7 @@ parse_frame_info (struct objfile *objfil
 		  if (!cie)
 		    error ("CFI: can't find CIE pointer [in module %s]", 
 				    bfd_get_filename (abfd));
+		  last_cie = cie;
 		}
 
 	      init_loc = read_encoded_pointer (abfd, &start,

             reply	other threads:[~2003-02-26 17:14 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-02-26 17:14 Michal Ludvig [this message]
2003-02-26 17:26 ` Daniel Jacobowitz
2003-02-26 22:07   ` Michal Ludvig
2003-02-26 22:15     ` Daniel Jacobowitz
2003-02-27  8:29       ` Michal Ludvig
2003-02-27 17:09         ` Elena Zannoni
2003-02-27 17:18           ` Andreas Jaeger
2003-02-28  7:14           ` Michal Ludvig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3E5CF5F5.10300@suse.cz \
    --to=mludvig@suse.cz \
    --cc=gdb-patches@sources.redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox