diff options
-rw-r--r-- | binutils/budbg.h | 2 | ||||
-rw-r--r-- | binutils/debug.c | 3 | ||||
-rw-r--r-- | binutils/debug.h | 2 | ||||
-rw-r--r-- | binutils/rddbg.c | 27 | ||||
-rw-r--r-- | binutils/stabs.c | 25 |
5 files changed, 36 insertions, 23 deletions
diff --git a/binutils/budbg.h b/binutils/budbg.h index a507ff9..4a93b4e 100644 --- a/binutils/budbg.h +++ b/binutils/budbg.h @@ -39,7 +39,7 @@ extern void *start_stab (void *, bfd *, bool, asymbol **, long); extern bool finish_stab (void *, void *); extern bool parse_stab - (void *, void *, int, int, bfd_vma, const char *); + (void *, void *, int, int, bfd_vma, const char *, bool *); extern bool write_stabs_in_sections_debugging_info (bfd *, void *, bfd_byte **, bfd_size_type *, bfd_byte **, bfd_size_type *); diff --git a/binutils/debug.c b/binutils/debug.c index ccd708f..fd9a98a 100644 --- a/binutils/debug.c +++ b/binutils/debug.c @@ -713,7 +713,7 @@ debug_set_filename (void *handle, const char *name) include files in a single compilation unit. */ bool -debug_start_source (void *handle, const char *name) +debug_start_source (void *handle, const char *name, bool *name_used) { struct debug_handle *info = (struct debug_handle *) handle; struct debug_file *f, **pf; @@ -740,6 +740,7 @@ debug_start_source (void *handle, const char *name) memset (f, 0, sizeof *f); f->filename = name; + *name_used = true; for (pf = &info->current_file->next; *pf != NULL; diff --git a/binutils/debug.h b/binutils/debug.h index 7dcb087..fd19c8b 100644 --- a/binutils/debug.h +++ b/binutils/debug.h @@ -435,7 +435,7 @@ extern bool debug_set_filename (void *, const char *); /* Change source files to the given file name. This is used for include files in a single compilation unit. */ -extern bool debug_start_source (void *, const char *); +extern bool debug_start_source (void *, const char *, bool *); /* Record a function definition. This implicitly starts a function block. The debug_type argument is the type of the return value. diff --git a/binutils/rddbg.c b/binutils/rddbg.c index 15081c3..fb59f52 100644 --- a/binutils/rddbg.c +++ b/binutils/rddbg.c @@ -194,6 +194,7 @@ read_section_stabs_debugging_info (bfd *abfd, asymbol **syms, long symcount, { size_t len; char *f, *s; + bool f_used; if (stroff + strx >= strsize) { @@ -238,10 +239,13 @@ read_section_stabs_debugging_info (bfd *abfd, asymbol **syms, long symcount, free (f); f = s; } + if (!f) + f = xstrdup (s); save_stab (type, desc, value, s); - if (! parse_stab (dhandle, shandle, type, desc, value, s)) + if (! parse_stab (dhandle, shandle, type, desc, value, + f, &f_used)) { stab_context (); free_saved_stabs (); @@ -252,18 +256,14 @@ read_section_stabs_debugging_info (bfd *abfd, asymbol **syms, long symcount, return false; } - /* Don't free f, since I think the stabs code - expects strings to hang around. This should be - straightened out. FIXME. */ + if (!f_used) + free (f); } } free_saved_stabs (); free (stabs); - - /* Don't free strings, since I think the stabs code expects - the strings to hang around. This should be straightened - out. FIXME. */ + free (strings); } } @@ -297,6 +297,7 @@ read_symbol_stabs_debugging_info (bfd *abfd, asymbol **syms, long symcount, { const char *s; char *f; + bool f_used; if (shandle == NULL) { @@ -327,20 +328,22 @@ read_symbol_stabs_debugging_info (bfd *abfd, asymbol **syms, long symcount, f = n; s = n; } + if (!f) + f = xstrdup (s); save_stab (i.stab_type, i.stab_desc, i.value, s); if (! parse_stab (dhandle, shandle, i.stab_type, i.stab_desc, - i.value, s)) + i.value, f, &f_used)) { stab_context (); + free (f); free_saved_stabs (); return false; } - /* Don't free f, since I think the stabs code expects - strings to hang around. This should be straightened out. - FIXME. */ + if (!f_used) + free (f); } } diff --git a/binutils/stabs.c b/binutils/stabs.c index 85eebeb..f5a76dd 100644 --- a/binutils/stabs.c +++ b/binutils/stabs.c @@ -422,11 +422,12 @@ finish_stab (void *dhandle, void *handle) bool parse_stab (void *dhandle, void *handle, int type, int desc, bfd_vma value, - const char *string) + const char *string, bool *string_used) { const char * string_end; struct stab_handle *info = (struct stab_handle *) handle; + *string_used = false; /* gcc will emit two N_SO strings per compilation unit, one for the directory name and one for the file name. We just collect N_SO strings as we see them, and start the new compilation unit when @@ -447,11 +448,11 @@ parse_stab (void *dhandle, void *handle, int type, int desc, bfd_vma value, info->file_start_offset = info->so_value; /* We need to reset the mapping from type numbers to types. We - can't free the old mapping, because of the use of - debug_make_indirect_type. */ + can only free the file_types array, not the stab_types + list entries due to the use of debug_make_indirect_type. */ info->files = 1; info->file_types = ((struct stab_types **) - xmalloc (sizeof *info->file_types)); + xrealloc (info->file_types, sizeof *info->file_types)); info->file_types[0] = NULL; info->so_string = NULL; @@ -566,21 +567,29 @@ parse_stab (void *dhandle, void *handle, int type, int desc, bfd_vma value, case N_SOL: /* Start an include file. */ - if (! debug_start_source (dhandle, string)) + if (! debug_start_source (dhandle, string, string_used)) return false; break; case N_BINCL: /* Start an include file which may be replaced. */ + *string_used = true; push_bincl (info, string, value); - if (! debug_start_source (dhandle, string)) + if (! debug_start_source (dhandle, string, string_used)) return false; break; case N_EINCL: /* End an N_BINCL include. */ - if (! debug_start_source (dhandle, pop_bincl (info))) - return false; + string = pop_bincl (info); + if (! debug_start_source (dhandle, string, string_used)) + { + free ((char *) string); + return false; + } + if (!*string_used) + free ((char *) string); + *string_used = false; break; case N_EXCL: |