summaryrefslogtreecommitdiffstats
path: root/libdw/dwarf_formref_die.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdw/dwarf_formref_die.c')
-rw-r--r--libdw/dwarf_formref_die.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/libdw/dwarf_formref_die.c b/libdw/dwarf_formref_die.c
index 90a4b2d3..6926c1a8 100644
--- a/libdw/dwarf_formref_die.c
+++ b/libdw/dwarf_formref_die.c
@@ -56,13 +56,15 @@
Dwarf_Die *
-dwarf_formref_die (attr, die_mem)
+__libdw_formref_die_rdlock (attr, die_mem)
Dwarf_Attribute *attr;
Dwarf_Die *die_mem;
{
if (attr == NULL)
return NULL;
+ Dwarf *dbg = attr->cu->dbg;
+
Dwarf_Off offset;
if (attr->form == DW_FORM_ref_addr)
{
@@ -73,18 +75,33 @@ dwarf_formref_die (attr, die_mem)
: attr->cu->offset_size);
if (ref_size == 8)
- offset = read_8ubyte_unaligned (attr->cu->dbg, attr->valp);
+ offset = read_8ubyte_unaligned (dbg, attr->valp);
else
- offset = read_4ubyte_unaligned (attr->cu->dbg, attr->valp);
+ offset = read_4ubyte_unaligned (dbg, attr->valp);
}
else
{
/* Other forms produce an offset from the CU. */
- if (unlikely (__libdw_formref (attr, &offset) != 0))
+ if (unlikely (__libdw_formref_rdlock (attr, &offset) != 0))
return NULL;
offset += attr->cu->start;
}
- return INTUSE(dwarf_offdie) (attr->cu->dbg, offset, die_mem);
+ return __libdw_offdie_rdlock (dbg, offset, die_mem);
+}
+
+Dwarf_Die *
+dwarf_formref_die (attr, die_mem)
+ Dwarf_Attribute *attr;
+ Dwarf_Die *die_mem;
+{
+ if (attr == NULL)
+ return NULL;
+
+ rwlock_rdlock (attr->cu->dbg->lock);
+ Dwarf_Die *retval = __libdw_formref_die_rdlock (attr, die_mem);
+ rwlock_unlock (attr->cu->dbg->lock);
+
+ return retval;
}
INTDEF (dwarf_formref_die)