* ldlang.c (insert_pad): Use offsetof macro.

(lang_size_sections): Always neuter padding statements.
	* emultempl/hppaelf.em (hppaelf_delete_padding_statements): Delete.
This commit is contained in:
Alan Modra 2001-08-20 01:21:08 +00:00
parent ae7fb08f1a
commit c0c330a70f
3 changed files with 14 additions and 83 deletions

View file

@ -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.

View file

@ -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);

View file

@ -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;
}