diff options
-rw-r--r-- | libdw/ChangeLog | 11 | ||||
-rw-r--r-- | libdw/Makefile.am | 6 | ||||
-rw-r--r-- | libdw/dwarf_entry_breakpoints.c | 200 | ||||
-rw-r--r-- | libdw/dwarf_entrypc.c | 35 | ||||
-rw-r--r-- | libdw/libdw.h | 10 | ||||
-rw-r--r-- | libdw/libdwP.h | 1 |
6 files changed, 3 insertions, 260 deletions
diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 006da6d6..db069c94 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,14 +1,3 @@ -2005-09-07 Roland McGrath <roland@redhat.com> - - * dwarf_entry_breakpoints.c: New file. - * Makefile.am (libdw_a_SOURCES): Add it. - * libdw.h: Declare dwarf_entry_breakpoints. - - * dwarf_entrypc.c: New file. - * Makefile.am (libdw_a_SOURCES): Add it. - * libdw.h: Declare dwarf_entrypc. - * libdwP.h: Add INTDECL. - 2005-08-28 Ulrich Drepper <drepper@redhat.com> * Makefile.am: Use $(LINK) not $(CC) when creating DSO. diff --git a/libdw/Makefile.am b/libdw/Makefile.am index 4121b0f7..a35f5dcc 100644 --- a/libdw/Makefile.am +++ b/libdw/Makefile.am @@ -42,7 +42,7 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \ dwarf_attr_integrate.c dwarf_hasattr_integrate.c \ dwarf_child.c dwarf_haschildren.c dwarf_formaddr.c \ dwarf_formudata.c dwarf_formsdata.c dwarf_lowpc.c \ - dwarf_entrypc.c dwarf_haspc.c dwarf_highpc.c \ + dwarf_haspc.c dwarf_highpc.c \ dwarf_formref.c dwarf_formref_die.c dwarf_siblingof.c \ dwarf_dieoffset.c dwarf_cuoffset.c dwarf_hasattr.c \ dwarf_hasform.c dwarf_whatform.c dwarf_whatattr.c \ @@ -68,8 +68,8 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \ dwarf_func_line.c dwarf_func_col.c dwarf_func_die.c \ dwarf_func_inline.c dwarf_getsrc_file.c \ libdw_findcu.c libdw_form.c libdw_alloc.c memory-access.c \ - libdw_visit_scopes.c \ - dwarf_entry_breakpoints.c + libdw_visit_scopes.c + if !MUDFLAP libdw_pic_a_SOURCES = diff --git a/libdw/dwarf_entry_breakpoints.c b/libdw/dwarf_entry_breakpoints.c deleted file mode 100644 index a8fb294d..00000000 --- a/libdw/dwarf_entry_breakpoints.c +++ /dev/null @@ -1,200 +0,0 @@ -/* Find entry breakpoint locations for a function. - Copyright (C) 2005 Red Hat, Inc. - - This program is Open Source software; you can redistribute it and/or - modify it under the terms of the Open Software License version 1.0 as - published by the Open Source Initiative. - - You should have received a copy of the Open Software License along - with this program; if not, you may obtain a copy of the Open Software - License version 1.0 from http://www.opensource.org/licenses/osl.php or - by writing the Open Source Initiative c/o Lawrence Rosen, Esq., - 3001 King Ranch Road, Ukiah, CA 95482. */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif -#include "libdwP.h" -#include <dwarf.h> -#include <stdlib.h> - - -int -dwarf_entry_breakpoints (die, bkpts) - Dwarf_Die *die; - Dwarf_Addr **bkpts; -{ - int nbkpts = 0; - *bkpts = NULL; - - /* Add one breakpoint location to the result vector. */ - inline int add_bkpt (Dwarf_Addr pc) - { - Dwarf_Addr *newlist = realloc (*bkpts, ++nbkpts * sizeof newlist[0]); - if (newlist == NULL) - { - free (*bkpts); - *bkpts = NULL; - __libdw_seterrno (DWARF_E_NOMEM); - return -1; - } - newlist[nbkpts - 1] = pc; - *bkpts = newlist; - return nbkpts; - } - - /* Fallback result, break at the entrypc/lowpc value. */ - inline int entrypc_bkpt (void) - { - Dwarf_Addr pc; - return INTUSE(dwarf_entrypc) (die, &pc) < 0 ? -1 : add_bkpt (pc); - } - - /* Fetch the CU's line records to look for this DIE's addresses. */ - Dwarf_Die cudie = - { - .cu = die->cu, - .addr = ((char *) die->cu->dbg->sectiondata[IDX_debug_info]->d_buf - + die->cu->start + 3 * die->cu->offset_size - 4 + 3), - }; - Dwarf_Lines *lines; - size_t nlines; - if (INTUSE(dwarf_getsrclines) (&cudie, &lines, &nlines) < 0) - { - int error = INTUSE (dwarf_errno) (); - if (error == DWARF_E_NO_DEBUG_LINE) - return entrypc_bkpt (); - __libdw_seterrno (error); - return -1; - } - - /* Search a contiguous PC range for prologue-end markers. - If DWARF, look for proper markers. - Failing that, if ADHOC, look for the ad hoc convention. */ - inline int search_range (Dwarf_Addr low, Dwarf_Addr high, - bool dwarf, bool adhoc) - { - size_t l = 0, u = nlines; - while (l < u) - { - size_t idx = (l + u) / 2; - if (low < lines->info[idx].addr) - u = idx; - else - { - l = idx; - if (low > lines->info[idx].addr) - { - if (lines->info[idx].addr < high) - break; - ++l; - } - else - break; - } - } - if (l < u) - { - if (dwarf) - while (l < u && lines->info[l].addr < high) - if (lines->info[l].prologue_end - && add_bkpt (lines->info[l].addr) < 0) - return -1; - if (adhoc && nbkpts == 0 - && l + 1 < nlines - && lines->info[l + 1].line == lines->info[l].line - && lines->info[l + 1].file == lines->info[l].file - && lines->info[l + 1].column == lines->info[l].column) - return add_bkpt (lines->info[l + 1].addr); - return nbkpts; - } - __libdw_seterrno (DWARF_E_INVALID_DWARF); - return -1; - } - - /* Most often there is a single contiguous PC range for the DIE. */ - Dwarf_Addr lowpc; - Dwarf_Addr highpc; - if (INTUSE(dwarf_lowpc) (die, &lowpc) == 0) - return (INTUSE(dwarf_highpc) (die, &highpc) - ?: search_range (lowpc, highpc, true, true)); - - - /* We have to look for a noncontiguous range. */ - Dwarf_Attribute attr_mem; - Dwarf_Attribute *attr = INTUSE(dwarf_attr) (die, DW_AT_ranges, &attr_mem); - if (attr == NULL) - return -1; - - /* Must have the form data4 or data8 which act as an offset. */ - Dwarf_Word offset; - if (INTUSE(dwarf_formudata) (attr, &offset) != 0) - return -1; - - const Elf_Data *d = die->cu->dbg->sectiondata[IDX_debug_ranges]; - if (d == NULL) - { - __libdw_seterrno (DWARF_E_NO_DEBUG_RANGES); - return -1; - } - - /* Fetch the CU's base address. */ - Dwarf_Addr base; - if (INTUSE(dwarf_lowpc) (&cudie, &base) != 0) - return -1; - - /* Search each contiguous address range for DWARF prologue_end markers. */ - unsigned char *readp = d->d_buf + offset; - Dwarf_Addr begin; - Dwarf_Addr end; - lowpc = highpc = (Dwarf_Addr) -1l; - do - { - next: - if ((unsigned char *) d->d_buf + d->d_size - readp - < die->cu->address_size * 2) - { - __libdw_seterrno (DWARF_E_INVALID_DWARF); - free (*bkpts); - *bkpts = NULL; - return -1; - } - - if (die->cu->address_size == 8) - { - begin = read_8ubyte_unaligned_inc (die->cu->dbg, readp); - end = read_8ubyte_unaligned_inc (die->cu->dbg, readp); - } - else - { - begin = (Dwarf_Sword) read_4sbyte_unaligned_inc (die->cu->dbg, - readp); - end = read_4ubyte_unaligned_inc (die->cu->dbg, readp); - } - - if (begin == (Dwarf_Addr) -1l) /* Base address entry. */ - { - base = end; - goto next; - } - - if (begin == 0 && end == 0) /* End of list entry. */ - break; - - /* We have an address range entry. */ - if (begin < lowpc) - { - lowpc = begin; - highpc = end; - } - } - while (search_range (begin, end, true, false) >= 0); - - /* If we didn't find any proper DWARF markers, then look in the - lowest-addressed range for an ad hoc marker. Failing that, - fall back to just using the entrypc value. */ - return (nbkpts - ?: (lowpc == (Dwarf_Addr) -1l ? 0 - : search_range (lowpc, highpc, false, true)) - ?: entrypc_bkpt ()); -} diff --git a/libdw/dwarf_entrypc.c b/libdw/dwarf_entrypc.c deleted file mode 100644 index 61a1d4be..00000000 --- a/libdw/dwarf_entrypc.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Return entry PC attribute of DIE. - Copyright (C) 2003, 2005 Red Hat, Inc. - - This program is Open Source software; you can redistribute it and/or - modify it under the terms of the Open Software License version 1.0 as - published by the Open Source Initiative. - - You should have received a copy of the Open Software License along - with this program; if not, you may obtain a copy of the Open Software - License version 1.0 from http://www.opensource.org/licenses/osl.php or - by writing the Open Source Initiative c/o Lawrence Rosen, Esq., - 3001 King Ranch Road, Ukiah, CA 95482. */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <dwarf.h> -#include "libdwP.h" - - -int -dwarf_entrypc (die, return_addr) - Dwarf_Die *die; - Dwarf_Addr *return_addr; -{ - Dwarf_Attribute attr_mem; - - return INTUSE(dwarf_formaddr) (INTUSE(dwarf_attr) (die, DW_AT_entry_pc, - &attr_mem) - ?: INTUSE(dwarf_attr) (die, DW_AT_low_pc, - &attr_mem), - return_addr); -} -INTDEF(dwarf_entrypc) diff --git a/libdw/libdw.h b/libdw/libdw.h index b76d4327..350aa440 100644 --- a/libdw/libdw.h +++ b/libdw/libdw.h @@ -292,10 +292,6 @@ extern int dwarf_highpc (Dwarf_Die *die, Dwarf_Addr *return_addr) extern int dwarf_lowpc (Dwarf_Die *die, Dwarf_Addr *return_addr) __nonnull_attribute__ (2); -/* Return entry_pc or low_pc attribute of DIE. */ -extern int dwarf_entrypc (Dwarf_Die *die, Dwarf_Addr *return_addr) - __nonnull_attribute__ (2); - /* Return 1 if DIE's lowpc/highpc or ranges attributes match the PC address, 0 if not, or -1 for errors. */ extern int dwarf_haspc (Dwarf_Die *die, Dwarf_Addr pc); @@ -534,12 +530,6 @@ extern int dwarf_func_inline_instances (Dwarf_Func *func, void *arg); -/* Find the appropriate PC location or locations for function entry - breakpoints for the given DW_TAG_subprogram DIE. Returns -1 for errors. - On success, returns the number of breakpoint locations (never zero) - and sets *BKPTS to a malloc'd vector of addresses. */ -extern int dwarf_entry_breakpoints (Dwarf_Die *die, Dwarf_Addr **bkpts); - /* Call callback function for each of the macro information entry for the CU. */ diff --git a/libdw/libdwP.h b/libdw/libdwP.h index d7ae776e..37f28721 100644 --- a/libdw/libdwP.h +++ b/libdw/libdwP.h @@ -373,7 +373,6 @@ INTDECL (dwarf_child) INTDECL (dwarf_dieoffset) INTDECL (dwarf_diename) INTDECL (dwarf_end) -INTDECL (dwarf_entrypc) INTDECL (dwarf_errmsg) INTDECL (dwarf_formaddr) INTDECL (dwarf_formblock) |