aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2001-08-20 01:21:08 +0000
committerAlan Modra <amodra@gmail.com>2001-08-20 01:21:08 +0000
commitc0c330a70f2a352d6bfe279336c8337c3d670dba (patch)
tree504785be07213f4c231c805f13188afca1919e68
parentae7fb08f1a002acd930c38897b9993b780d8798c (diff)
downloadgdb-c0c330a70f2a352d6bfe279336c8337c3d670dba.zip
gdb-c0c330a70f2a352d6bfe279336c8337c3d670dba.tar.gz
gdb-c0c330a70f2a352d6bfe279336c8337c3d670dba.tar.bz2
* ldlang.c (insert_pad): Use offsetof macro.
(lang_size_sections): Always neuter padding statements. * emultempl/hppaelf.em (hppaelf_delete_padding_statements): Delete.
-rw-r--r--ld/ChangeLog4
-rw-r--r--ld/emultempl/hppaelf.em62
-rw-r--r--ld/ldlang.c31
3 files changed, 14 insertions, 83 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index e9bb45d..3c53837 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,9 @@
2001-08-20 Alan Modra <amodra@bigpond.net.au>
+ * ldlang.c (insert_pad): Use offsetof macro.
+ (lang_size_sections): Always neuter padding statements.
+ * emultempl/hppaelf.em (hppaelf_delete_padding_statements): Delete.
+
* pe-dll.c (pe_dll_fill_sections): Correct type of "relax" param
passed to lang_size_sections.
(pe_exe_fill_sections): Likewise.
diff --git a/ld/emultempl/hppaelf.em b/ld/emultempl/hppaelf.em
index 93e847d..f367673 100644
--- a/ld/emultempl/hppaelf.em
+++ b/ld/emultempl/hppaelf.em
@@ -29,8 +29,6 @@ cat >>e${EMULATION_NAME}.c <<EOF
static void hppaelf_after_parse PARAMS((void));
static void hppaelf_create_output_section_statements PARAMS ((void));
-static void hppaelf_delete_padding_statements
- PARAMS ((lang_statement_list_type *));
static asection *hppaelf_add_stub_section
PARAMS ((const char *, asection *));
static void hppaelf_layaout_sections_again PARAMS ((void));
@@ -88,63 +86,6 @@ hppaelf_create_output_section_statements ()
ldlang_add_file (stub_file);
}
-/* Walk all the lang statements splicing out any padding statements from
- the list. */
-
-static void
-hppaelf_delete_padding_statements (list)
- lang_statement_list_type *list;
-{
- lang_statement_union_type *s;
- lang_statement_union_type **ps;
- for (ps = &list->head; (s = *ps) != NULL; ps = &s->next)
- {
- switch (s->header.type)
- {
-
- /* We want to recursively walk these sections. */
- case lang_constructors_statement_enum:
- hppaelf_delete_padding_statements (&constructor_list);
- break;
-
- case lang_output_section_statement_enum:
- hppaelf_delete_padding_statements (&s->output_section_statement.children);
- break;
-
- case lang_group_statement_enum:
- hppaelf_delete_padding_statements (&s->group_statement.children);
- break;
-
- case lang_wild_statement_enum:
- hppaelf_delete_padding_statements (&s->wild_statement.children);
- break;
-
- /* Here's what we are really looking for. Splice these out of
- the list. */
- case lang_padding_statement_enum:
- *ps = s->next;
- if (*ps == NULL)
- list->tail = ps;
- break;
-
- /* We don't care about these cases. */
- case lang_data_statement_enum:
- case lang_object_symbols_statement_enum:
- case lang_output_statement_enum:
- case lang_target_statement_enum:
- case lang_input_section_enum:
- case lang_input_statement_enum:
- case lang_assignment_statement_enum:
- case lang_address_statement_enum:
- break;
-
- default:
- abort ();
- break;
- }
- }
-}
-
struct hook_stub_info
{
@@ -281,9 +222,6 @@ hppaelf_layaout_sections_again ()
to recalculate all the section offsets. This may mean we need to
add even more stubs. */
- /* Delete all the padding statements, they're no longer valid. */
- hppaelf_delete_padding_statements (stat_ptr);
-
/* Resize the sections. */
lang_size_sections (stat_ptr->head, abs_output_section,
&stat_ptr->head, 0, (bfd_vma) 0, false);
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 905d08c..4b0a57e 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -2635,15 +2635,11 @@ insert_pad (ptr, fill, alignment_needed, output_section, dot)
bfd_vma dot;
{
lang_statement_union_type *pad;
- size_t ptr_off;
- /* ptr_off is zero, but let's not be too fast and loose with
- pointers. */
- ptr_off = ((char *) &((lang_statement_union_type *) 0)->header.next
- - (char *) 0);
+ pad = ((lang_statement_union_type *)
+ ((char *) ptr - offsetof (lang_statement_union_type *, header.next)));
if (ptr != &statement_list.head
- && ((pad = (lang_statement_union_type *) ((char *) ptr - ptr_off))
- ->header.type == lang_padding_statement_enum)
+ && pad->header.type == lang_padding_statement_enum)
&& pad->padding_statement.output_section == output_section)
{
/* Use the existing pad statement. The above test on output
@@ -3163,18 +3159,12 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
break;
case lang_padding_statement_enum:
- if (relax)
- {
- /* If we are relaxing, and this is not the first pass,
- we need to allow padding to shrink. If padding is
- needed on this pass, it will be added back in. */
- s->padding_statement.size = 0;
- break;
- }
-
- dot += s->padding_statement.size / opb;
- output_section_statement->bfd_section->_raw_size +=
- s->padding_statement.size;
+ /* If this is the first time lang_size_sections is called,
+ we won't have any padding statements. If this is the
+ second or later passes when relaxing, we should allow
+ padding to shrink. If padding is needed on this pass, it
+ will be added back in. */
+ s->padding_statement.size = 0;
break;
case lang_group_statement_enum:
@@ -3188,8 +3178,7 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
FAIL ();
break;
- /* This can only get here when relaxing is turned on. */
-
+ /* We can only get here when relaxing is turned on. */
case lang_address_statement_enum:
break;
}