From e9ee469ad1c502f57a1cf4dfbfbfe3b401b2643d Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 9 Jun 2005 02:05:47 +0000 Subject: * ld.h (lang_phase_type): Move to.. * ldexp.h: ..here. Add lang_mark_phase_enum. (node_type): Remove etree_undef and etree_unspec. (exp_data_seg): Delete. (struct ldexp_control, expld): New. (invalid, exp_mark_used_section): Delete. (exp_fold_tree, exp_get_vma, exp_get_value_int, exp_get_fill, exp_get_abs_int): Update prototypes. * ldexp.c (assigning_to_dot): Delete. (expld): Define. (make_abs): Operate directly on expld.result. Update all callers. (new_abs): Likewise. Return void. (new_rel_from_abs): Rename from new_rel_from_section. (new_rel, new_rel_from_abs): Operate on expld.result and return void. Update all callers. (fold_unary): Operate on expld.result and return void. Remove "current_section", "allocation_done", "dot", "dotp" and "mark_used" params. Update all callers. (fold_binary, fold_trinary, fold_name, exp_fold_tree_1): Likewise. (fold_unary ): Ensure alignment is absolute. (fold_unary ): Use make_abs. (fold_unary ): Evaluate mark_phase as for allocating_phase. (fold_binary ): Ditto. (fold_binary <'%','/'>): Don't error if marking. (fold_name ): Don't call bfd_sizeof_headers when marking. (fold_name ): Remove FIXME; -R is handled correctly. Don't error when marking. (fold_name ): Don't set SEC_KEEP. (exp_fold_tree_1): Don't error when marking. (exp_fold_tree_1 ): Evaluate in all phases except first. (exp_fold_tree_1 ): Don't check for NULL current section, instead check for NULL dotp. (exp_fold_tree_1 ): Don't evaluate the assignment source unless the symbol is referenced and undefined. (exp_fold_tree): Remove "allocation_done" and "dot" params. Save params to expld. (exp_fold_tree_no_dot): Remove "current_section", "allocation_done and "mark_used" params. Save params to expld. Update all callers. (exp_assop): Do without temp var. (exp_print_tree ): Delete code. (exp_get_vma): Remove "allocation_done" param. Correct error return. (exp_get_fill, exp_get_abs_int): Likewise. (exp_get_value_int): Remove "allocation_done" param. (exp_mark_used_section): Delete. * ldgram.y (fill_exp): Update exp_get_fill call. (origin_spec, length_spec): Update exp_get_vma call. * ldlang.c (lang_init): Don't bother clearing lang_statement_iteration. (lang_mark_used_section_1, lang_mark_used_section): Delete. (strip_excluded_output_sections): Call one_lang_size_sections_pass in marking mode. Merge old lang_mark_used_section code. Correct handling of output sections with excluded input sections and data statements. Don't drop non-zero sized sections. Don't zap os->bfd_section. Do set SEC_EXCLUDE when appropriate. (print_output_section_statement): Update for changed ldexp.c interface. (print_assignment, lang_size_sections_1): Likewise. (lang_do_assignments_1, lang_enter_output_section_statement): Likewise. (lang_new_phdr, lang_record_phdrs): Likewise. (lang_size_sections): Likewise. (insert_pad): Use following statement if it is a pad, rather than creating a new one. (lang_size_sections_1 ): Do process ignored output section to set vma and lma, but don't update dot for these sections. Don't error if marking. (lang_size_sections_1 ): Don't update dot for ignored sections. (lang_size_sections_1 ): Don't mark absolute section with SEC_ALLOC. (one_lang_size_sections_pass): New function. (lang_size_sections): Remove first five params. Set expld.phase on entry and exit. Use one_lang_size_sections_pass. (lang_do_assignments): Remove all params. Update all callers. (lang_reset_memory_regions): Clear os->processed for all output section statements. * ldlang.h (lang_do_assignments): Update prototype. (lang_size_sections): Likewise. (one_lang_size_sections_pass): Declare. * pe-dll.c (pe_dll_fill_sections, pe_exe_fill_sections): Update lang_size_sections and lang_do_assignments calls. * emultempl/elf32.em (layout_sections_again): Likewise. * emultempl/ppc64elf.em (ppc_before_allocation): Use one_lang_size_sections_pass. --- ld/ldexp.h | 67 +++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 23 deletions(-) (limited to 'ld/ldexp.h') diff --git a/ld/ldexp.h b/ld/ldexp.h index ae6b874..7cf8ea7 100644 --- a/ld/ldexp.h +++ b/ld/ldexp.h @@ -40,8 +40,6 @@ typedef struct { etree_assign, etree_provide, etree_provided, - etree_undef, - etree_unspec, etree_value, etree_assert, etree_rel @@ -91,17 +89,44 @@ typedef union etree_union { } assert_s; } etree_type; -extern struct exp_data_seg { - enum { - exp_dataseg_none, - exp_dataseg_align_seen, - exp_dataseg_relro_seen, - exp_dataseg_end_seen, - exp_dataseg_relro_adjust, - exp_dataseg_adjust - } phase; - bfd_vma base, min_base, relro_end, end, pagesize, maxpagesize; -} exp_data_seg; +typedef enum { + lang_first_phase_enum, + lang_mark_phase_enum, + lang_allocating_phase_enum, + lang_final_phase_enum +} lang_phase_type; + +struct ldexp_control { + /* Modify expression evaluation depending on this. */ + lang_phase_type phase; + + /* Principally used for diagnostics. */ + bfd_boolean assigning_to_dot; + + /* Working results. */ + etree_value_type result; + bfd_vma dot; + + /* Current dot and section passed to ldexp folder. */ + bfd_vma *dotp; + asection *section; + + /* State machine and results for DATASEG. */ + struct { + enum { + exp_dataseg_none, + exp_dataseg_align_seen, + exp_dataseg_relro_seen, + exp_dataseg_end_seen, + exp_dataseg_relro_adjust, + exp_dataseg_adjust + } phase; + + bfd_vma base, min_base, relro_end, end, pagesize, maxpagesize; + } dataseg; +}; + +extern struct ldexp_control expld; /* A maps from a segment name to a base address. */ typedef struct segment_struct { @@ -127,10 +152,8 @@ etree_type *exp_bigintop (bfd_vma, char *); etree_type *exp_relop (asection *, bfd_vma); -etree_value_type invalid - (void); -etree_value_type exp_fold_tree - (etree_type *, asection *, lang_phase_type, bfd_vma, bfd_vma *); +void exp_fold_tree + (etree_type *, asection *, bfd_vma *); etree_type *exp_binop (int, etree_type *, etree_type *); etree_type *exp_trinop @@ -148,14 +171,12 @@ etree_type *exp_assert void exp_print_tree (etree_type *); bfd_vma exp_get_vma - (etree_type *, bfd_vma, char *, lang_phase_type); + (etree_type *, bfd_vma, char *); int exp_get_value_int - (etree_type *, int, char *, lang_phase_type); + (etree_type *, int, char *); fill_type *exp_get_fill - (etree_type *, fill_type *, char *, lang_phase_type); + (etree_type *, fill_type *, char *); bfd_vma exp_get_abs_int - (etree_type *, int, char *, lang_phase_type); -void exp_mark_used_section - (etree_type *, asection *); + (etree_type *, int, char *); #endif -- cgit v1.1