* 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> 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 * pe-dll.c (pe_dll_fill_sections): Correct type of "relax" param
passed to lang_size_sections. passed to lang_size_sections.
(pe_exe_fill_sections): Likewise. (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_after_parse PARAMS((void));
static void hppaelf_create_output_section_statements 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 static asection *hppaelf_add_stub_section
PARAMS ((const char *, asection *)); PARAMS ((const char *, asection *));
static void hppaelf_layaout_sections_again PARAMS ((void)); static void hppaelf_layaout_sections_again PARAMS ((void));
@ -88,63 +86,6 @@ hppaelf_create_output_section_statements ()
ldlang_add_file (stub_file); 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 struct hook_stub_info
{ {
@ -281,9 +222,6 @@ hppaelf_layaout_sections_again ()
to recalculate all the section offsets. This may mean we need to to recalculate all the section offsets. This may mean we need to
add even more stubs. */ add even more stubs. */
/* Delete all the padding statements, they're no longer valid. */
hppaelf_delete_padding_statements (stat_ptr);
/* Resize the sections. */ /* Resize the sections. */
lang_size_sections (stat_ptr->head, abs_output_section, lang_size_sections (stat_ptr->head, abs_output_section,
&stat_ptr->head, 0, (bfd_vma) 0, false); &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; bfd_vma dot;
{ {
lang_statement_union_type *pad; lang_statement_union_type *pad;
size_t ptr_off;
/* ptr_off is zero, but let's not be too fast and loose with pad = ((lang_statement_union_type *)
pointers. */ ((char *) ptr - offsetof (lang_statement_union_type *, header.next)));
ptr_off = ((char *) &((lang_statement_union_type *) 0)->header.next
- (char *) 0);
if (ptr != &statement_list.head if (ptr != &statement_list.head
&& ((pad = (lang_statement_union_type *) ((char *) ptr - ptr_off)) && pad->header.type == lang_padding_statement_enum)
->header.type == lang_padding_statement_enum)
&& pad->padding_statement.output_section == output_section) && pad->padding_statement.output_section == output_section)
{ {
/* Use the existing pad statement. The above test on output /* 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; break;
case lang_padding_statement_enum: case lang_padding_statement_enum:
if (relax) /* If this is the first time lang_size_sections is called,
{ we won't have any padding statements. If this is the
/* If we are relaxing, and this is not the first pass, second or later passes when relaxing, we should allow
we need to allow padding to shrink. If padding is padding to shrink. If padding is needed on this pass, it
needed on this pass, it will be added back in. */ will be added back in. */
s->padding_statement.size = 0; s->padding_statement.size = 0;
break;
}
dot += s->padding_statement.size / opb;
output_section_statement->bfd_section->_raw_size +=
s->padding_statement.size;
break; break;
case lang_group_statement_enum: case lang_group_statement_enum:
@ -3188,8 +3178,7 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
FAIL (); FAIL ();
break; 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: case lang_address_statement_enum:
break; break;
} }