[RFA] Remove target_section.bfd

Doug Evans
2013-07-15T22:42:44Z

Hi.
While reviewing the remove-symbol-file patchset I came across
target_section.bfd.
Unnecessarily storing copies of things can lead to confusion and bugs.
This patch isn't intended to be a space savings, simply a cleanup.

We already liberally reference bfd_section.owner, so I have no problem
with adding more references here.
[Ideally bfd would provide accessor functions/macros for struct
bfd_section, but none exist at all, and I'm not inclined to add all of
them just for this patch.]

Regression tested on amd64-linux.

Ok to check in?

2013-07-15 Doug Evans <dje@google.com>

* target.h (struct target_section): Delete member bfd.
All users updated to use the_bfd_section->owner instead.
* exec.c (add_to_section_table): Assert bfd is expected value.
Remove initialization of target_section.bfd.
(remove_target_sections): Update.
(section_table_available_memory): Update.
(section_table_xfer_memory_partial): Update.
(print_section_info): Update.
(exec_set_section_address): Update.
* record-full.c (record_full_core_xfer_partial): Update.
* solib-svr4.c (svr4_relocate_section_addresses): Update.
* solib-target.c (solib_target_relocate_section_addresses): Update.
* symfile.c (build_section_addr_info_from_section_table): Update.
* target.c (memory_xfer_live_readonly_partial): Update.
(memory_xfer_partial_1): Update.

Index: target.h
===================================================================
RCS file: /cvs/src/src/gdb/target.h,v
retrieving revision 1.264
diff -u -p -r1.264 target.h
--- target.h 27 Jun 2013 19:52:41 -0000 1.264
+++ target.h 15 Jul 2013 22:30:09 -0000
@@ -1898,8 +1898,6 @@ struct target_section
just some convenient pointer that can be used to differentiate
the BFDs. These are managed only by convention. */
void *key;
-
- bfd *bfd; /* BFD file pointer */
};

/* Holds an array of target sections. Defined by [SECTIONS..SECTIONS_END[. */
Index: exec.c
===================================================================
RCS file: /cvs/src/src/gdb/exec.c,v
retrieving revision 1.125
diff -u -p -r1.125 exec.c
--- exec.c 6 May 2013 14:15:49 -0000 1.125
+++ exec.c 15 Jul 2013 22:30:08 -0000
@@ -328,6 +328,8 @@ add_to_section_table (bfd *abfd, struct
struct target_section **table_pp = (struct target_section **) table_pp_char;
flagword aflag;

+ gdb_assert (abfd == asect->owner);
+
/* Check the section flags, but do not discard zero-length sections, since
some symbols may still be attached to this section. For instance, we
encountered on sparc-solaris 2.10 a shared library with an empty .bss
@@ -338,7 +340,6 @@ add_to_section_table (bfd *abfd, struct
return;

(*table_pp)->key = NULL;
- (*table_pp)->bfd = abfd;
(*table_pp)->the_bfd_section = asect;
(*table_pp)->addr = bfd_section_vma (abfd, asect);
(*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect);
@@ -436,7 +437,7 @@ remove_target_sections (void *key, bfd *

dest = table->sections;
for (src = table->sections; src < table->sections_end; src++)
- if (src->key != key || src->bfd != abfd)
+ if (src->key != key || src->the_bfd_section->owner != abfd)
{
/* Keep this section. */
if (dest < src)
@@ -479,7 +480,8 @@ section_table_available_memory (VEC(mem_

for (p = sections; p < sections_end; p++)
{
- if ((bfd_get_section_flags (p->bfd, p->the_bfd_section)
+ if ((bfd_get_section_flags (p->the_bfd_section->owner,
+ p->the_bfd_section)
& SEC_READONLY) == 0)
continue;

@@ -523,7 +525,10 @@ section_table_xfer_memory_partial (gdb_b

for (p = sections; p < sections_end; p++)
{
- if (section_name && strcmp (section_name, p->the_bfd_section->name) != 0)
+ struct bfd_section *asect = p->the_bfd_section;
+ bfd *abfd = asect->owner;
+
+ if (section_name && strcmp (section_name, asect->name) != 0)
continue; /* not the section we need. */
if (memaddr >= p->addr)
{
@@ -531,11 +536,11 @@ section_table_xfer_memory_partial (gdb_b
{
/* Entire transfer is within this section. */
if (writebuf)
- res = bfd_set_section_contents (p->bfd, p->the_bfd_section,
+ res = bfd_set_section_contents (abfd, asect,
writebuf, memaddr - p->addr,
len);
else
- res = bfd_get_section_contents (p->bfd, p->the_bfd_section,
+ res = bfd_get_section_contents (abfd, asect,
readbuf, memaddr - p->addr,
len);
return (res != 0) ? len : 0;
@@ -550,11 +555,11 @@ section_table_xfer_memory_partial (gdb_b
/* This section overlaps the transfer. Just do half. */
len = p->endaddr - memaddr;
if (writebuf)
- res = bfd_set_section_contents (p->bfd, p->the_bfd_section,
+ res = bfd_set_section_contents (abfd, asect,
writebuf, memaddr - p->addr,
len);
else
- res = bfd_get_section_contents (p->bfd, p->the_bfd_section,
+ res = bfd_get_section_contents (abfd, asect,
readbuf, memaddr - p->addr,
len);
return (res != 0) ? len : 0;
@@ -610,17 +615,18 @@ print_section_info (struct target_sectio

for (p = t->sections; p < t->sections_end; p++)
{
- asection *asect = p->the_bfd_section;
+ struct bfd_section *psect = p->the_bfd_section;
+ bfd *pbfd = psect->owner;

- if ((bfd_get_section_flags (abfd, asect) & (SEC_ALLOC | SEC_LOAD))
+ if ((bfd_get_section_flags (pbfd, psect) & (SEC_ALLOC | SEC_LOAD))
!= (SEC_ALLOC | SEC_LOAD))
continue;

- if (bfd_get_section_vma (abfd, asect) <= abfd->start_address
- && abfd->start_address < (bfd_get_section_vma (abfd, asect)
- + bfd_get_section_size (asect)))
+ if (bfd_get_section_vma (pbfd, psect) <= abfd->start_address
+ && abfd->start_address < (bfd_get_section_vma (pbfd, psect)
+ + bfd_get_section_size (psect)))
{
- displacement = p->addr - bfd_get_section_vma (abfd, asect);
+ displacement = p->addr - bfd_get_section_vma (pbfd, psect);
break;
}
}
@@ -636,6 +642,9 @@ print_section_info (struct target_sectio
}
for (p = t->sections; p < t->sections_end; p++)
{
+ struct bfd_section *psect = p->the_bfd_section;
+ bfd *pbfd = psect->owner;
+
printf_filtered ("\t%s", hex_string_custom (p->addr, wid));
printf_filtered (" - %s", hex_string_custom (p->endaddr, wid));

@@ -647,11 +656,10 @@ print_section_info (struct target_sectio
/* FIXME: i18n: Need to rewrite this sentence. */
if (info_verbose)
printf_filtered (" @ %s",
- hex_string_custom (p->the_bfd_section->filepos, 8));
- printf_filtered (" is %s", bfd_section_name (p->bfd,
- p->the_bfd_section));
- if (p->bfd != abfd)
- printf_filtered (" in %s", bfd_get_filename (p->bfd));
+ hex_string_custom (psect->filepos, 8));
+ printf_filtered (" is %s", bfd_section_name (pbfd, psect));
+ if (pbfd != abfd)
+ printf_filtered (" in %s", bfd_get_filename (pbfd));
printf_filtered ("\n");
}
}
@@ -720,7 +728,7 @@ exec_set_section_address (const char *fi
table = current_target_sections;
for (p = table->sections; p < table->sections_end; p++)
{
- if (filename_cmp (filename, p->bfd->filename) == 0
+ if (filename_cmp (filename, p->the_bfd_section->owner->filename) == 0
&& index == p->the_bfd_section->index)
{
p->endaddr += address - p->addr;
Index: record-full.c
===================================================================
RCS file: /cvs/src/src/gdb/record-full.c,v
retrieving revision 1.9
diff -u -p -r1.9 record-full.c
--- record-full.c 14 May 2013 20:30:48 -0000 1.9
+++ record-full.c 15 Jul 2013 22:30:08 -0000
@@ -2219,9 +2219,10 @@ record_full_core_xfer_partial (struct ta
xmalloc
(sizeof (struct record_full_core_buf_entry));
entry->p = p;
- if (!bfd_malloc_and_get_section (p->bfd,
- p->the_bfd_section,
- &entry->buf))
+ if (!bfd_malloc_and_get_section
+ (p->the_bfd_section->owner,
+ p->the_bfd_section,
+ &entry->buf))
{
xfree (entry);
return 0;
Index: solib-svr4.c
===================================================================
RCS file: /cvs/src/src/gdb/solib-svr4.c,v
retrieving revision 1.180
diff -u -p -r1.180 solib-svr4.c
--- solib-svr4.c 24 Jun 2013 22:18:32 -0000 1.180
+++ solib-svr4.c 15 Jul 2013 22:30:09 -0000
@@ -2907,10 +2907,10 @@ static void
svr4_relocate_section_addresses (struct so_list *so,
struct target_section *sec)
{
- sec->addr = svr4_truncate_ptr (sec->addr + lm_addr_check (so,
- sec->bfd));
- sec->endaddr = svr4_truncate_ptr (sec->endaddr + lm_addr_check (so,
- sec->bfd));
+ bfd *abfd = sec->the_bfd_section->owner;
+
+ sec->addr = svr4_truncate_ptr (sec->addr + lm_addr_check (so, abfd));
+ sec->endaddr = svr4_truncate_ptr (sec->endaddr + lm_addr_check (so, abfd));
}
\f

Index: solib-target.c
===================================================================
RCS file: /cvs/src/src/gdb/solib-target.c,v
retrieving revision 1.30
diff -u -p -r1.30 solib-target.c
--- solib-target.c 24 Jun 2013 22:18:32 -0000 1.30
+++ solib-target.c 15 Jul 2013 22:30:09 -0000
@@ -456,8 +456,9 @@ Could not relocate shared library \"%s\"
}
}

- offset = so->lm_info->offsets->offsets[gdb_bfd_section_index (sec->bfd,
- sec->the_bfd_section)];
+ offset = so->lm_info->offsets->offsets[gdb_bfd_section_index
+ (sec->the_bfd_section->owner,
+ sec->the_bfd_section)];
sec->addr += offset;
sec->endaddr += offset;
}
Index: symfile.c
===================================================================
RCS file: /cvs/src/src/gdb/symfile.c,v
retrieving revision 1.380
diff -u -p -r1.380 symfile.c
--- symfile.c 19 Jun 2013 22:20:58 -0000 1.380
+++ symfile.c 15 Jul 2013 22:30:09 -0000
@@ -229,15 +229,15 @@ build_section_addr_info_from_section_tab

for (stp = start, oidx = 0; stp != end; stp++)
{
- if (bfd_get_section_flags (stp->bfd,
- stp->the_bfd_section) & (SEC_ALLOC | SEC_LOAD)
+ struct bfd_section *asect = stp->the_bfd_section;
+ bfd *abfd = asect->owner;
+
+ if (bfd_get_section_flags (abfd, asect) & (SEC_ALLOC | SEC_LOAD)
&& oidx < end - start)
{
sap->other[oidx].addr = stp->addr;
- sap->other[oidx].name
- = xstrdup (bfd_section_name (stp->bfd, stp->the_bfd_section));
- sap->other[oidx].sectindex
- = gdb_bfd_section_index (stp->bfd, stp->the_bfd_section);
+ sap->other[oidx].name = xstrdup (bfd_section_name (abfd, asect));
+ sap->other[oidx].sectindex = gdb_bfd_section_index (abfd, asect);
oidx++;
}
}
Index: target.c
===================================================================
RCS file: /cvs/src/src/gdb/target.c,v
retrieving revision 1.338
diff -u -p -r1.338 target.c
--- target.c 27 Jun 2013 19:52:41 -0000 1.338
+++ target.c 15 Jul 2013 22:30:09 -0000
@@ -1396,7 +1396,8 @@ memory_xfer_live_readonly_partial (struc

secp = target_section_by_addr (ops, memaddr);
if (secp != NULL
- && (bfd_get_section_flags (secp->bfd, secp->the_bfd_section)
+ && (bfd_get_section_flags (secp->the_bfd_section->owner,
+ secp->the_bfd_section)
& SEC_READONLY))
{
struct target_section *p;
@@ -1475,7 +1476,8 @@ memory_xfer_partial_1 (struct target_ops

secp = target_section_by_addr (ops, memaddr);
if (secp != NULL
- && (bfd_get_section_flags (secp->bfd, secp->the_bfd_section)
+ && (bfd_get_section_flags (secp->the_bfd_section->owner,
+ secp->the_bfd_section)
& SEC_READONLY))
{
table = target_get_section_table (ops);