summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdw/ChangeLog8
-rw-r--r--libdw/dwarf_child.c8
-rw-r--r--libdw/dwarf_getattrs.c8
-rw-r--r--libdw/dwarf_getpubnames.c20
-rw-r--r--libdw/dwarf_siblingof.c2
-rw-r--r--libdw/dwarf_tag.c2
6 files changed, 26 insertions, 22 deletions
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 0e092136..d344baef 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,11 @@
+2008-01-21 Ulrich Drepper <drepper@redhat.com>
+
+ * dwarf_child.c: Minor optimizations.
+ * dwarf_getattrs.c: Likewise.
+ * dwarf_getpubnames.c: Likewise.
+ * dwarf_siblingof.c: Likewise.
+ * dwarf_tag.c: Likewise.
+
2008-01-18 Ulrich Drepper <drepper@redhat.com>
* dwarf_getsrclines.c (dwarf_getsrclines): Don't require exact match
diff --git a/libdw/dwarf_child.c b/libdw/dwarf_child.c
index 121cd191..0080cf9d 100644
--- a/libdw/dwarf_child.c
+++ b/libdw/dwarf_child.c
@@ -81,6 +81,7 @@ __libdw_find_attr (Dwarf_Die *die, unsigned int search_name,
}
if (unlikely (die->abbrev == DWARF_END_ABBREV))
{
+ invalid_dwarf:
__libdw_seterrno (DWARF_E_INVALID_DWARF);
return NULL;
}
@@ -95,10 +96,7 @@ __libdw_find_attr (Dwarf_Die *die, unsigned int search_name,
{
/* Are we still in bounds? This test needs to be refined. */
if (unlikely (attrp + 1 >= endp))
- {
- __libdw_seterrno (DWARF_E_INVALID_DWARF);
- return NULL;
- }
+ goto invalid_dwarf;
/* Get attribute name and form.
@@ -166,7 +164,7 @@ dwarf_child (die, result)
if (die->abbrev != DWARF_END_ABBREV
&& (die->abbrev == NULL || die->abbrev->has_children))
addr = __libdw_find_attr (die, INVALID, NULL, NULL);
- if (die->abbrev == (Dwarf_Abbrev *) -1l)
+ if (unlikely (die->abbrev == (Dwarf_Abbrev *) -1l))
return -1;
/* Make sure the DIE really has children. */
diff --git a/libdw/dwarf_getattrs.c b/libdw/dwarf_getattrs.c
index 932c5cc1..42f25ca0 100644
--- a/libdw/dwarf_getattrs.c
+++ b/libdw/dwarf_getattrs.c
@@ -72,8 +72,9 @@ dwarf_getattrs (Dwarf_Die *die, int (*callback) (Dwarf_Attribute *, void *),
/* Find the abbreviation. */
die->abbrev = __libdw_findabbrev (die->cu, u128);
- if (die->abbrev == DWARF_END_ABBREV)
+ if (unlikely (die->abbrev == DWARF_END_ABBREV))
{
+ invalid_dwarf:
__libdw_seterrno (DWARF_E_INVALID_DWARF);
return -1l;
}
@@ -89,10 +90,7 @@ dwarf_getattrs (Dwarf_Die *die, int (*callback) (Dwarf_Attribute *, void *),
if (unlikely (attrp
>= ((unsigned char *) dbg->sectiondata[IDX_debug_abbrev]->d_buf
+ dbg->sectiondata[IDX_debug_abbrev]->d_size)))
- {
- __libdw_seterrno (DWARF_E_INVALID_DWARF);
- return -1;
- }
+ goto invalid_dwarf;
/* Get attribute name and form. */
Dwarf_Attribute attr;
diff --git a/libdw/dwarf_getpubnames.c b/libdw/dwarf_getpubnames.c
index fcf6eca4..1b054e26 100644
--- a/libdw/dwarf_getpubnames.c
+++ b/libdw/dwarf_getpubnames.c
@@ -102,6 +102,7 @@ get_offsets (Dwarf *dbg)
else if (unlikely (len >= DWARF3_LENGTH_MIN_ESCAPE_CODE
&& len <= DWARF3_LENGTH_MAX_ESCAPE_CODE))
{
+ invalid_dwarf:
__libdw_seterrno (DWARF_E_INVALID_DWARF);
goto err_return;
}
@@ -116,7 +117,7 @@ get_offsets (Dwarf *dbg)
/* Read the version. It better be two for now. */
uint16_t version = read_2ubyte_unaligned (dbg, readp);
- if (version != 2)
+ if (unlikely (version != 2))
{
__libdw_seterrno (DWARF_E_INVALID_VERSION);
goto err_return;
@@ -129,13 +130,12 @@ get_offsets (Dwarf *dbg)
mem[cnt].cu_offset = read_8ubyte_unaligned (dbg, readp + 2);
/* Determine the size of the CU header. */
- if (dbg->sectiondata[IDX_debug_info] == NULL
- || dbg->sectiondata[IDX_debug_info]->d_buf == NULL
- || mem[cnt].cu_offset + 3 >= dbg->sectiondata[IDX_debug_info]->d_size)
- {
- __libdw_seterrno (DWARF_E_INVALID_DWARF);
- goto err_return;
- }
+ if (unlikely (dbg->sectiondata[IDX_debug_info] == NULL
+ || dbg->sectiondata[IDX_debug_info]->d_buf == NULL
+ || (mem[cnt].cu_offset + 3
+ >= dbg->sectiondata[IDX_debug_info]->d_size)))
+ goto invalid_dwarf;
+
unsigned char *infop
= ((unsigned char *) dbg->sectiondata[IDX_debug_info]->d_buf
+ mem[cnt].cu_offset);
@@ -173,7 +173,7 @@ dwarf_getpubnames (dbg, callback, arg, offset)
if (dbg == NULL)
return -1l;
- if (offset < 0)
+ if (unlikely (offset < 0))
{
__libdw_seterrno (DWARF_E_INVALID_OFFSET);
return -1l;
@@ -187,7 +187,7 @@ dwarf_getpubnames (dbg, callback, arg, offset)
return 0;
/* If necessary read the set information. */
- if (dbg->pubnames_nsets == 0 && get_offsets (dbg) != 0)
+ if (dbg->pubnames_nsets == 0 && unlikely (get_offsets (dbg) != 0))
return -1l;
/* Find the place where to start. */
diff --git a/libdw/dwarf_siblingof.c b/libdw/dwarf_siblingof.c
index 7347013f..0d427175 100644
--- a/libdw/dwarf_siblingof.c
+++ b/libdw/dwarf_siblingof.c
@@ -98,7 +98,7 @@ dwarf_siblingof (die, result)
{
Dwarf_Off offset;
sibattr.valp = addr;
- if (__libdw_formref (&sibattr, &offset) != 0)
+ if (unlikely (__libdw_formref (&sibattr, &offset) != 0))
/* Something went wrong. */
return -1;
diff --git a/libdw/dwarf_tag.c b/libdw/dwarf_tag.c
index 5280ab24..15183d2d 100644
--- a/libdw/dwarf_tag.c
+++ b/libdw/dwarf_tag.c
@@ -106,7 +106,7 @@ dwarf_tag (die)
die->abbrev = __libdw_findabbrev (die->cu, u128);
}
- if (die->abbrev == DWARF_END_ABBREV)
+ if (unlikely (die->abbrev == DWARF_END_ABBREV))
{
__libdw_seterrno (DWARF_E_INVALID_DWARF);
return DW_TAG_invalid;