diff options
author | Alan Modra <amodra@gmail.com> | 2025-01-11 16:05:06 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2025-01-17 08:35:12 +1030 |
commit | df1514851801d49a2122e3d775b2122529673598 (patch) | |
tree | 6a53e598f7ee9db9aaa94c12715fcd51ccb10daa | |
parent | 566c131c6687b5c70398bda016c8f070ba172595 (diff) | |
download | gdb-df1514851801d49a2122e3d775b2122529673598.zip gdb-df1514851801d49a2122e3d775b2122529673598.tar.gz gdb-df1514851801d49a2122e3d775b2122529673598.tar.bz2 |
free ldfile search paths
* ldfile.c (ldfile_remap_input_free): Make static, call from..
(ldfile_free): ..here. New function.
(ldfile_library_path_free, ldfile_script_free),
( ldfile_arch_free): New functions.
(ldfile_find_command_file): Free script_dir. Move
script_search to file scope.
(ldfile_open_command_file_1): Delete FIXME comment.
* ldfile.h (ldfile_remap_input_free): Delete.
(ldfile_free): Declare.
* ldlang.c (lang_finish): Update.
-rw-r--r-- | ld/ldfile.c | 57 | ||||
-rw-r--r-- | ld/ldfile.h | 2 | ||||
-rw-r--r-- | ld/ldlang.c | 2 |
3 files changed, 54 insertions, 7 deletions
diff --git a/ld/ldfile.c b/ld/ldfile.c index 5a4c7c2..1255150 100644 --- a/ld/ldfile.c +++ b/ld/ldfile.c @@ -63,6 +63,7 @@ typedef struct search_arch } search_arch_type; static search_dirs_type **search_tail_ptr = &search_head; +static search_dirs_type *script_search; static search_arch_type *search_arch_head; static search_arch_type **search_arch_tail_ptr = &search_arch_head; @@ -109,7 +110,7 @@ ldfile_add_remap (const char * pattern, const char * renamed) } } -void +static void ldfile_remap_input_free (void) { while (input_remaps != NULL) @@ -329,6 +330,18 @@ ldfile_add_library_path (const char *name, bool cmdline) new_dirs->name = xstrdup (name); } +static void +ldfile_library_path_free (search_dirs_type **root) +{ + search_dirs_type *ent; + while ((ent = *root) != NULL) + { + *root = ent->next; + free ((void *) ent->name); + free (ent); + } +} + /* Try to open a BFD for a lang_input_statement. */ bool @@ -835,7 +848,6 @@ ldfile_find_command_file (const char *name, search_dirs_type *search; FILE *result = NULL; char *path; - static search_dirs_type *script_search; if (!default_only) { @@ -854,6 +866,7 @@ ldfile_find_command_file (const char *name, search_tail_ptr = &script_search; ldfile_add_library_path (script_dir, true); search_tail_ptr = save_tail_ptr; + free (script_dir); } } @@ -903,9 +916,6 @@ ldfile_open_command_file_1 (const char *name, enum script_open_style open_how) } } - /* FIXME: This memory is never freed, but that should not really matter. - It will be released when the linker exits, and it is unlikely to ever - be more than a few tens of bytes. */ len = strlen (name); script = xmalloc (sizeof (*script) + len); script->next = processed_scripts; @@ -930,6 +940,17 @@ ldfile_open_command_file_1 (const char *name, enum script_open_style open_how) saved_script_handle = ldlex_input_stack; } +static void +ldfile_script_free (struct script_name_list **root) +{ + struct script_name_list *ent; + while ((ent = *root) != NULL) + { + *root = ent->next; + free (ent); + } +} + /* Open command file NAME in the current directory, -L directories, the default script location, in that order. */ @@ -974,6 +995,18 @@ ldfile_add_arch (const char *in_name) } +static void +ldfile_arch_free (search_arch_type **root) +{ + search_arch_type *ent; + while ((ent = *root) != NULL) + { + *root = ent->next; + free (ent->name); + free (ent); + } +} + /* Set the output architecture. */ void @@ -992,3 +1025,17 @@ ldfile_set_output_arch (const char *string, enum bfd_architecture defarch) else einfo (_("%F%P: cannot represent machine `%s'\n"), string); } + +/* Tidy up memory. */ + +void +ldfile_free (void) +{ + ldfile_remap_input_free (); + ldfile_library_path_free (&script_search); + search_tail_ptr = &search_head; + ldfile_library_path_free (&search_head); + search_arch_tail_ptr = &search_arch_head; + ldfile_arch_free (&search_arch_head); + ldfile_script_free (&processed_scripts); +} diff --git a/ld/ldfile.h b/ld/ldfile.h index 4ee14fc..813dca5 100644 --- a/ld/ldfile.h +++ b/ld/ldfile.h @@ -81,7 +81,7 @@ extern void ldfile_add_remap (const char *, const char *); extern bool ldfile_add_remap_file (const char *); -extern void ldfile_remap_input_free +extern void ldfile_free (void); extern const char * ldfile_possibly_remap_input (const char *); diff --git a/ld/ldlang.c b/ld/ldlang.c index 634a684..b59a079 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -1398,7 +1398,7 @@ void lang_finish (void) { output_section_statement_table_free (); - ldfile_remap_input_free (); + ldfile_free (); } /*---------------------------------------------------------------------- |