aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2004-05-02 14:36:25 +0000
committerH.J. Lu <hjl.tools@gmail.com>2004-05-02 14:36:25 +0000
commitfafe6678a56d703ba0d3bfc32ff12f99b979f339 (patch)
tree7eff8f48c45bf21a28b8b12c78358aa92d9d1255
parenteb4556d736ee14965782a320db1496fb070e54c3 (diff)
downloadgdb-fafe6678a56d703ba0d3bfc32ff12f99b979f339.zip
gdb-fafe6678a56d703ba0d3bfc32ff12f99b979f339.tar.gz
gdb-fafe6678a56d703ba0d3bfc32ff12f99b979f339.tar.bz2
bfd/
2004-05-02 H.J. Lu <hongjiu.lu@intel.com> * section.c (bfd_get_section_by_name_if): New. * bfd-in2.h: Regenerated. gas/ 2004-05-02 H.J. Lu <hongjiu.lu@intel.com> * config/obj-elf.c (get_section): Return bfd_boolean. (obj_elf_change_section): Call bfd_get_section_by_name_if instead of bfd_map_over_sections.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/bfd-in2.h6
-rw-r--r--bfd/section.c51
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/config/obj-elf.c52
5 files changed, 84 insertions, 36 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 875fcd2..b5e5523 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2004-05-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * section.c (bfd_get_section_by_name_if): New.
+ * bfd-in2.h: Regenerated.
+
2004-05-02 Alan Modra <amodra@bigpond.net.au>
* som.c (som_bfd_is_group_section): Define.
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 5843a19..c246356 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -1433,6 +1433,12 @@ void bfd_section_list_clear (bfd *);
asection *bfd_get_section_by_name (bfd *abfd, const char *name);
+asection *bfd_get_section_by_name_if
+ (bfd *abfd,
+ const char *name,
+ bfd_boolean (*func) (bfd *abfd, asection *sect, void *obj),
+ void *obj);
+
char *bfd_get_unique_section_name
(bfd *abfd, const char *templat, int *count);
diff --git a/bfd/section.c b/bfd/section.c
index 58508a2..7f5365b 100644
--- a/bfd/section.c
+++ b/bfd/section.c
@@ -801,6 +801,57 @@ bfd_get_section_by_name (bfd *abfd, const char *name)
/*
FUNCTION
+ bfd_get_section_by_name_if
+
+SYNOPSIS
+ asection *bfd_get_section_by_name_if
+ (bfd *abfd,
+ const char *name,
+ bfd_boolean (*func) (bfd *abfd, asection *sect, void *obj),
+ void *obj);
+
+DESCRIPTION
+ Call the provided function @var{func} for each section
+ attached to the BFD @var{abfd} whose name matches @var{name},
+ passing @var{obj} as an argument. The function will be called
+ as if by
+
+| func (abfd, the_section, obj);
+
+ It returns the first section for which @var{func} returns true,
+ otherwise <<NULL>>.
+
+*/
+
+asection *
+bfd_get_section_by_name_if (bfd *abfd, const char *name,
+ bfd_boolean (*operation) (bfd *,
+ asection *,
+ void *),
+ void *user_storage)
+{
+ struct section_hash_entry *sh;
+ unsigned long hash;
+
+ sh = section_hash_lookup (&abfd->section_htab, name, FALSE, FALSE);
+ if (sh == NULL)
+ return NULL;
+
+ hash = sh->root.hash;
+ do
+ {
+ if ((*operation) (abfd, &sh->section, user_storage))
+ return &sh->section;
+ sh = (struct section_hash_entry *) sh->root.next;
+ }
+ while (sh != NULL && sh->root.hash == hash
+ && strcmp (sh->root.string, name) == 0);
+
+ return NULL;
+}
+
+/*
+FUNCTION
bfd_get_unique_section_name
SYNOPSIS
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 0d1b4ec..484ed24 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,9 @@
+2004-05-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ * config/obj-elf.c (get_section): Return bfd_boolean.
+ (obj_elf_change_section): Call bfd_get_section_by_name_if
+ instead of bfd_map_over_sections.
+
2004-04-30 H.J. Lu <hongjiu.lu@intel.com>
* config/obj-elf.c (get_section): New function.
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index 3c7f011..7bd62d7 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -469,32 +469,16 @@ struct section_stack
static struct section_stack *section_stack;
-struct section_group
-{
- const char *name;
- const char *group_name;
- asection *section;
-};
-
-static void
+static bfd_boolean
get_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
{
- struct section_group *group = inf;
+ const char *gname = inf;
const char *group_name = elf_group_name (sec);
- /* Check if we have found the section we are looking for. */
- if (group->section)
- return;
-
- if ((sec->name == group->name
- || (sec->name != NULL
- && group->name != NULL
- && strcmp (sec->name, group->name) == 0))
- && (group_name == group->group_name
+ return (group_name == gname
|| (group_name != NULL
- && group->group_name != NULL
- && strcmp (group_name, group->group_name) == 0)))
- group->section = sec;
+ && gname != NULL
+ && strcmp (group_name, gname) == 0));
}
/* Handle the .section pseudo-op. This code supports two different
@@ -524,10 +508,10 @@ obj_elf_change_section (const char *name,
int linkonce,
int push)
{
+ asection *old_sec;
segT sec;
flagword flags;
const struct bfd_elf_special_section *ssect;
- struct section_group group;
#ifdef md_flush_pending_output
md_flush_pending_output ();
@@ -548,14 +532,11 @@ obj_elf_change_section (const char *name,
previous_section = now_seg;
previous_subsection = now_subseg;
- group.name = name;
- group.group_name = group_name;
- group.section = NULL;
- bfd_map_over_sections (stdoutput, get_section, &group);
-
- if (group.section)
+ old_sec = bfd_get_section_by_name_if (stdoutput, name, get_section,
+ (void *) group_name);
+ if (old_sec)
{
- sec = group.section;
+ sec = old_sec;
subseg_set (sec, 0);
}
else
@@ -571,7 +552,7 @@ obj_elf_change_section (const char *name,
type = ssect->type;
else if (type != ssect->type)
{
- if (group.section == NULL
+ if (old_sec == NULL
/* FIXME: gcc, as of 2002-10-22, will emit
.section .init_array,"aw",@progbits
@@ -595,7 +576,7 @@ obj_elf_change_section (const char *name,
}
}
- if (group.section == NULL && (attr & ~ssect->attr) != 0)
+ if (old_sec == NULL && (attr & ~ssect->attr) != 0)
{
/* As a GNU extension, we permit a .note section to be
allocatable. If the linker sees an allocatable .note
@@ -627,7 +608,7 @@ obj_elf_change_section (const char *name,
override = TRUE;
}
}
- if (!override && group.section == NULL)
+ if (!override && old_sec == NULL)
attr |= ssect->attr;
}
@@ -652,7 +633,7 @@ obj_elf_change_section (const char *name,
if (linkonce)
flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
- if (group.section == NULL)
+ if (old_sec == NULL)
{
symbolS *secsym;
@@ -677,14 +658,13 @@ obj_elf_change_section (const char *name,
/* If section attributes are specified the second time we see a
particular section, then check that they are the same as we
saw the first time. */
- if (((group.section->flags ^ flags)
+ if (((old_sec->flags ^ flags)
& (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
| SEC_EXCLUDE | SEC_SORT_ENTRIES | SEC_MERGE | SEC_STRINGS
| SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
| SEC_THREAD_LOCAL)))
as_warn (_("ignoring changed section attributes for %s"), name);
- if ((flags & SEC_MERGE)
- && group.section->entsize != (unsigned) entsize)
+ if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize)
as_warn (_("ignoring changed section entity size for %s"), name);
}