* 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:
parent
ae7fb08f1a
commit
c0c330a70f
3 changed files with 14 additions and 83 deletions
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
31
ld/ldlang.c
31
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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue