]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
libdw: save startp/endp boundaries in Dwarf_CU
authorJosh Stone <jistone@redhat.com>
Thu, 11 Dec 2014 02:41:43 +0000 (18:41 -0800)
committerJosh Stone <jistone@redhat.com>
Thu, 11 Dec 2014 19:23:26 +0000 (11:23 -0800)
Rather than looking up section data every time, we can simply save the
range of each CU as pointers in Dwarf_CU.

Signed-off-by: Josh Stone <jistone@redhat.com>
libdw/ChangeLog
libdw/dwarf_child.c
libdw/dwarf_cuoffset.c
libdw/dwarf_dieoffset.c
libdw/dwarf_siblingof.c
libdw/libdwP.h
libdw/libdw_findcu.c

index 90c080926c414126032cd6465778cf0710680342..69592a71df89101b883179c60a05a25a00f269d0 100644 (file)
@@ -1,3 +1,12 @@
+2014-12-10  Josh Stone  <jistone@redhat.com>
+
+       * libdwP.h (Dwarf_CU): Add startp and endp boundaries.
+       * libdw_findcu.c (__libdw_intern_next_unit): Set startp and endp.
+       * dwarf_child.c (dwarf_child): Use cu->endp.
+       * dwarf_cuoffset.c (dwarf_cuoffset): Use cu->startp.
+       * dwarf_dieoffset.c (dwarf_dieoffset): Use cu->startp.
+       * dwarf_siblingof.c (dwarf_siblingof): Use both.
+
 2014-12-10  Josh Stone  <jistone@redhat.com>
 
        * dwarf_hasattr.c (dwarf_hasattr): Just walk abbrev for presence.
index daf4c26564723e07921baf414f4bb4d05283f820..2a5d379d8ab1a25ade3daedbff152c030ab7b005 100644 (file)
@@ -147,13 +147,12 @@ dwarf_child (die, result)
 
   /* RESULT can be the same as DIE.  So preserve what we need.  */
   struct Dwarf_CU *cu = die->cu;
-  Elf_Data *cu_sec = cu_data (cu);
 
   /* It's kosher (just suboptimal) to have a null entry first thing (7.5.3).
      So if this starts with ULEB128 of 0 (even with silly encoding of 0),
      it is a kosher null entry and we do not really have any children.  */
   const unsigned char *code = addr;
-  const unsigned char *endp = (cu_sec->d_buf + cu_sec->d_size);
+  const unsigned char *endp = cu->endp;
   while (1)
     {
       if (unlikely (code >= endp)) /* Truncated section.  */
index 7aea3f91f088c7844aa4bb7220140220623f5000..3ceffdb0b29a85b993c18f1bc0a2093dd2b80555 100644 (file)
@@ -1,5 +1,5 @@
 /* Return offset of DIE in CU.
-   Copyright (C) 2003-2010 Red Hat, Inc.
+   Copyright (C) 2003-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2003.
 
@@ -41,5 +41,5 @@ dwarf_cuoffset (die)
 {
   return (die == NULL
          ? (Dwarf_Off) -1l
-         : (die->addr - cu_data (die->cu)->d_buf - die->cu->start));
+         : (Dwarf_Off) (die->addr - die->cu->startp));
 }
index c92123ce5842b796f3fba38b144141efc05d14b4..965b2c8dc76fd7b3cf27de65732d71025f6e7349 100644 (file)
@@ -1,5 +1,5 @@
 /* Return offset of DIE.
-   Copyright (C) 2003-2010 Red Hat, Inc.
+   Copyright (C) 2003-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2003.
 
@@ -41,6 +41,6 @@ dwarf_dieoffset (die)
 {
   return (die == NULL
          ? ~0ul
-         : (Dwarf_Off) (die->addr - cu_data (die->cu)->d_buf));
+         : (Dwarf_Off) (die->addr - die->cu->startp + die->cu->start));
 }
 INTDEF(dwarf_dieoffset)
index f2dc46888e9148042f83af278058228da90dbc3e..27830ea450d4eb3dea6dfa5e7419c629c502bcb5 100644 (file)
@@ -62,8 +62,7 @@ dwarf_siblingof (die, result)
   /* That's the address we start looking.  */
   unsigned char *addr = this_die.addr;
   /* End of the buffer.  */
-  unsigned char *endp
-    = ((unsigned char *) cu_data (sibattr.cu)->d_buf + sibattr.cu->end);
+  unsigned char *endp = sibattr.cu->endp;
 
   /* Search for the beginning of the next die on this level.  We
      must not return the dies for children of the given die.  */
@@ -81,8 +80,7 @@ dwarf_siblingof (die, result)
            return -1;
 
          /* Compute the next address.  */
-         addr = ((unsigned char *) cu_data (sibattr.cu)->d_buf
-                 + sibattr.cu->start + offset);
+         addr = sibattr.cu->startp + offset;
        }
       else if (unlikely (addr == NULL)
               || unlikely (this_die.abbrev == DWARF_END_ABBREV))
index 0633853966d44fca6aeb7d4661e60390390f7c66..edceb59a091df556fd35bfd8b8e684c004f4bc03 100644 (file)
@@ -310,6 +310,10 @@ struct Dwarf_CU
 
   /* Known location lists.  */
   void *locs;
+
+  /* Memory boundaries of this CU.  */
+  void *startp;
+  void *endp;
 };
 
 /* Compute the offset of a CU's first DIE from its offset.  This
index c0bff2af2a690f3bc0c82cbe3f0e35a1e6adb4d2..3c9633e2b863ea2f3f35eb7afe497f8378d90939 100644 (file)
@@ -1,5 +1,5 @@
 /* Find CU for given offset.
-   Copyright (C) 2003-2010 Red Hat, Inc.
+   Copyright (C) 2003-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2003.
 
@@ -113,6 +113,10 @@ __libdw_intern_next_unit (dbg, debug_types)
   if (debug_types)
     Dwarf_Sig8_Hash_insert (&dbg->sig8_hash, type_sig8, newp);
 
+  void *buf = cu_data (newp)->d_buf;
+  newp->startp = buf + newp->start;
+  newp->endp = buf + newp->end;
+
   /* Add the new entry to the search tree.  */
   if (tsearch (newp, tree, findcu_cb) == NULL)
     {