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));
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
{
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);
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
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:
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;
}