diff options
author | Alan Modra <amodra@gmail.com> | 2018-10-29 16:37:24 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2018-10-29 18:20:48 +1030 |
commit | 8d1015a887c18c363d9bd707b13348daf4e5f556 (patch) | |
tree | 175c0d6aeaa6c53e718e0bf0bd5cadf8285660d7 | |
parent | c2e863866d9b206c387d8fdc0f1bfa9f246e4355 (diff) | |
download | fsf-binutils-gdb-8d1015a887c18c363d9bd707b13348daf4e5f556.zip fsf-binutils-gdb-8d1015a887c18c363d9bd707b13348daf4e5f556.tar.gz fsf-binutils-gdb-8d1015a887c18c363d9bd707b13348daf4e5f556.tar.bz2 |
Move struc-symbol.h to symbols.c
This file was never supposed to be widely used. The fact that it has
found its way into many gas files led to bugs, typically when code
expecting a symbolS* to point at a struct symbol is presented with a
struct local_symbol. Also, commit 158184ac9e changed these structs in
2012 but didn't catch all places where symbol bsym was being used to
test for a local_symbol.
* Makefile.am (HFILES): Delete struc-symbol.h.
* doc/internals.texi: Delete struc-symbol.h reference and out
of date local symbol description.
* struc-symbol.h: Delete. Move contents to..
* symbols.c: ..here.
(symbol_on_chain, symbol_symbolS): New functions.
* symbols.h (symbol_on_chain, symbol_symbolS): Declare.
* cgen.c: Don't #include struc-symbol.h.
(gas_cgen_parse_operand): Don't test for local_symbol using
bsym, instead call symbol_symbolS. Use symbol_get_bfdsym.
(weak_operand_overflow_check, make_right_shifted_expr): Use
symbol accessors.
* config/obj-coff.c: Don't #include struc-symbol.h.
(GET_FILENAME_STRING): Delete.
* config/obj-elf.c: Don't #include struc-symbol.h.
(elf_file_symbol): Use symbol accessors.
(elf_adjust_symtab): Call symbol_on_chain.
* config/obj-evax.c: Don't #include struc-symbol.h.
* config/tc-nds32.c: Likewise.
* config/tc-rl78.c: Likewise.
* config/tc-rx.c: Likewise.
* config/tc-alpha.c: Likewise.
(add_to_link_pool, s_alpha_comm): Use symbol accessors.
* config/tc-arc.c: Don't #include struc-symbol.h.
(arc_check_relocs): Use symbol accessors, testing gas symbol
section rather than bfd symbol section.
* config/tc-avr.c: Don't #include struc-symbol.h.
(avr_patch_gccisr_frag): Use symbol accessors.
* config/tc-bfin.c: Don't #include struc-symbol.h.
(bfin_loop_beginend): Use symbol accessors.
* config/tc-csky.c: Don't #include struc-symbol.h.
(v2_work_movih, v2_work_ori): Use symbol accessors. Check for
absolute symbol as well as O_constant.
* config/tc-riscv.c: Don't #include struc-symbol.h.
(riscv_pre_output_hook): Use symbol accessors.
* config/tc-s390.c: Don't #include struc-symbol.h.
(s390_literals): Use symbol accessors.
* config/tc-score.c (s3_build_la_pic, s3_build_lwst_pic): Use
symbol accessors.
(s3_relax_branch_inst16, s3_relax_cmpbranch_inst32): Don't
test symbol bsym.
* config/tc-score7.c: Don't #include struc-symbol.h.
(s7_build_la_pic, s7_build_lwst_pic): Use symbol accessors.
(s7_b32_relax_to_b16): Don't test symbol bsym.
* config/tc-sh.c: Don't #include struc-symbol.h.
(insert_loop_bounds): Use symbol accessors.
(sh_frob_section): Remove bogus symbol canonicalization.
* config/tc-tic54x.c: Don't #include struc-symbol.h.
(tic54x_bss): Use symbol accessors.
* config/tc-tilegx.c: Don't #include struc-symbol.h.
(emit_tilegx_instruction, tilegx_parse_name): Use symbol accessors.
* config/tc-tilepro.c: Don't #include struc-symbol.h.
(emit_tilepro_instruction, tilepro_parse_name): Use accessors.
* config/tc-xtensa.c: Don't #include struc-symbol.h.
(xg_assemble_vliw_tokens): Use symbol accessors.
(xg_order_trampoline_chain): Likewise.
* ehopt.c: Don't #include struc-symbol.h.
(check_eh_frame): Correct local symbol test. Use symbol accessors.
* write.c: Don't #include struc-symbol.h.
(create_note_reloc, maybe_generate_build_notes): Use symbol accessors.
* Makefile.in: Regenerate.
* po/POTFILES.in: Regenerate.
-rw-r--r-- | gas/ChangeLog | 65 | ||||
-rw-r--r-- | gas/Makefile.am | 1 | ||||
-rw-r--r-- | gas/Makefile.in | 1 | ||||
-rw-r--r-- | gas/cgen.c | 36 | ||||
-rw-r--r-- | gas/config/obj-coff.c | 4 | ||||
-rw-r--r-- | gas/config/obj-elf.c | 17 | ||||
-rw-r--r-- | gas/config/obj-evax.c | 1 | ||||
-rw-r--r-- | gas/config/tc-alpha.c | 7 | ||||
-rw-r--r-- | gas/config/tc-arc.c | 3 | ||||
-rw-r--r-- | gas/config/tc-avr.c | 4 | ||||
-rw-r--r-- | gas/config/tc-bfin.c | 3 | ||||
-rw-r--r-- | gas/config/tc-csky.c | 11 | ||||
-rw-r--r-- | gas/config/tc-nds32.c | 1 | ||||
-rw-r--r-- | gas/config/tc-riscv.c | 10 | ||||
-rw-r--r-- | gas/config/tc-rl78.c | 1 | ||||
-rw-r--r-- | gas/config/tc-rx.c | 1 | ||||
-rw-r--r-- | gas/config/tc-s390.c | 5 | ||||
-rw-r--r-- | gas/config/tc-score.c | 31 | ||||
-rw-r--r-- | gas/config/tc-score7.c | 25 | ||||
-rw-r--r-- | gas/config/tc-sh.c | 22 | ||||
-rw-r--r-- | gas/config/tc-tic54x.c | 3 | ||||
-rw-r--r-- | gas/config/tc-tilegx.c | 11 | ||||
-rw-r--r-- | gas/config/tc-tilepro.c | 11 | ||||
-rw-r--r-- | gas/config/tc-xtensa.c | 20 | ||||
-rw-r--r-- | gas/doc/internals.texi | 11 | ||||
-rw-r--r-- | gas/ehopt.c | 34 | ||||
-rw-r--r-- | gas/po/POTFILES.in | 1 | ||||
-rw-r--r-- | gas/struc-symbol.h | 158 | ||||
-rw-r--r-- | gas/symbols.c | 161 | ||||
-rw-r--r-- | gas/symbols.h | 3 | ||||
-rw-r--r-- | gas/write.c | 17 |
31 files changed, 353 insertions, 326 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 334b6ab..bbf6918 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,68 @@ +2018-10-29 Alan Modra <amodra@gmail.com> + + * Makefile.am (HFILES): Delete struc-symbol.h. + * doc/internals.texi: Delete struc-symbol.h reference and out + of date local symbol description. + * struc-symbol.h: Delete. Move contents to.. + * symbols.c: ..here. + (symbol_on_chain, symbol_symbolS): New functions. + * symbols.h (symbol_on_chain, symbol_symbolS): Declare. + * cgen.c: Don't #include struc-symbol.h. + (gas_cgen_parse_operand): Don't test for local_symbol using + bsym, instead call symbol_symbolS. Use symbol_get_bfdsym. + (weak_operand_overflow_check, make_right_shifted_expr): Use + symbol accessors. + * config/obj-coff.c: Don't #include struc-symbol.h. + (GET_FILENAME_STRING): Delete. + * config/obj-elf.c: Don't #include struc-symbol.h. + (elf_file_symbol): Use symbol accessors. + (elf_adjust_symtab): Call symbol_on_chain. + * config/obj-evax.c: Don't #include struc-symbol.h. + * config/tc-nds32.c: Likewise. + * config/tc-rl78.c: Likewise. + * config/tc-rx.c: Likewise. + * config/tc-alpha.c: Likewise. + (add_to_link_pool, s_alpha_comm): Use symbol accessors. + * config/tc-arc.c: Don't #include struc-symbol.h. + (arc_check_relocs): Use symbol accessors, testing gas symbol + section rather than bfd symbol section. + * config/tc-avr.c: Don't #include struc-symbol.h. + (avr_patch_gccisr_frag): Use symbol accessors. + * config/tc-bfin.c: Don't #include struc-symbol.h. + (bfin_loop_beginend): Use symbol accessors. + * config/tc-csky.c: Don't #include struc-symbol.h. + (v2_work_movih, v2_work_ori): Use symbol accessors. Check for + absolute symbol as well as O_constant. + * config/tc-riscv.c: Don't #include struc-symbol.h. + (riscv_pre_output_hook): Use symbol accessors. + * config/tc-s390.c: Don't #include struc-symbol.h. + (s390_literals): Use symbol accessors. + * config/tc-score.c (s3_build_la_pic, s3_build_lwst_pic): Use + symbol accessors. + (s3_relax_branch_inst16, s3_relax_cmpbranch_inst32): Don't + test symbol bsym. + * config/tc-score7.c: Don't #include struc-symbol.h. + (s7_build_la_pic, s7_build_lwst_pic): Use symbol accessors. + (s7_b32_relax_to_b16): Don't test symbol bsym. + * config/tc-sh.c: Don't #include struc-symbol.h. + (insert_loop_bounds): Use symbol accessors. + (sh_frob_section): Remove bogus symbol canonicalization. + * config/tc-tic54x.c: Don't #include struc-symbol.h. + (tic54x_bss): Use symbol accessors. + * config/tc-tilegx.c: Don't #include struc-symbol.h. + (emit_tilegx_instruction, tilegx_parse_name): Use symbol accessors. + * config/tc-tilepro.c: Don't #include struc-symbol.h. + (emit_tilepro_instruction, tilepro_parse_name): Use accessors. + * config/tc-xtensa.c: Don't #include struc-symbol.h. + (xg_assemble_vliw_tokens): Use symbol accessors. + (xg_order_trampoline_chain): Likewise. + * ehopt.c: Don't #include struc-symbol.h. + (check_eh_frame): Correct local symbol test. Use symbol accessors. + * write.c: Don't #include struc-symbol.h. + (create_note_reloc, maybe_generate_build_notes): Use symbol accessors. + * Makefile.in: Regenerate. + * po/POTFILES.in: Regenerate. + 2018-10-28 Alan Modra <amodra@gmail.com> PR 23837 diff --git a/gas/Makefile.am b/gas/Makefile.am index e9d6a06..df13f38 100644 --- a/gas/Makefile.am +++ b/gas/Makefile.am @@ -120,7 +120,6 @@ HFILES = \ output-file.h \ read.h \ sb.h \ - struc-symbol.h \ subsegs.h \ symbols.h \ tc.h \ diff --git a/gas/Makefile.in b/gas/Makefile.in index 21d6d8b..a558df7 100644 --- a/gas/Makefile.in +++ b/gas/Makefile.in @@ -509,7 +509,6 @@ HFILES = \ output-file.h \ read.h \ sb.h \ - struc-symbol.h \ subsegs.h \ symbols.h \ tc.h \ @@ -26,7 +26,6 @@ #include "dwarf2dbg.h" #include "symbols.h" -#include "struc-symbol.h" #ifdef OBJ_COMPLEX_RELC static expressionS * make_right_shifted_expr @@ -416,6 +415,8 @@ gas_cgen_parse_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, if (! errmsg) { + asymbol *bsym; + /* Fragment the expression as necessary, and queue a reloc. */ memset (& dummy_fixup, 0, sizeof (fixS)); @@ -423,11 +424,12 @@ gas_cgen_parse_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, if (exp.X_op == O_symbol && reloc_type == BFD_RELOC_RELC - && exp.X_add_symbol->sy_value.X_op == O_constant - && (!exp.X_add_symbol->bsym - || (exp.X_add_symbol->bsym->section != expr_section - && exp.X_add_symbol->bsym->section != absolute_section - && exp.X_add_symbol->bsym->section != undefined_section))) + && symbol_constant_p (exp.X_add_symbol) + && (!symbol_symbolS (exp.X_add_symbol) + || (bsym = symbol_get_bfdsym (exp.X_add_symbol)) == NULL + || (bsym->section != expr_section + && bsym->section != absolute_section + && bsym->section != undefined_section))) { /* Local labels will have been (eagerly) turned into constants by now, due to the inappropriately deep insight of the @@ -455,13 +457,15 @@ gas_cgen_parse_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, if (operand && (operand->hw_type == HW_H_SINT)) signed_p = 1; - if (stmp->bsym && (stmp->bsym->section == expr_section) + if (symbol_symbolS (stmp) + && (bsym = symbol_get_bfdsym (stmp)) != NULL + && bsym->section == expr_section && ! S_IS_LOCAL (stmp)) { if (signed_p) - stmp->bsym->flags |= BSF_SRELC; + bsym->flags |= BSF_SRELC; else - stmp->bsym->flags |= BSF_RELC; + bsym->flags |= BSF_RELC; } /* Now package it all up for the fixup emitter. */ @@ -771,12 +775,12 @@ weak_operand_overflow_check (const expressionS * exp, mask = exp->X_add_number; if (exp->X_add_symbol - && exp->X_add_symbol->sy_value.X_op == O_constant) - mask |= exp->X_add_symbol->sy_value.X_add_number; + && symbol_constant_p (exp->X_add_symbol)) + mask |= *symbol_X_add_number (exp->X_add_symbol); if (exp->X_op_symbol - && exp->X_op_symbol->sy_value.X_op == O_constant) - mask |= exp->X_op_symbol->sy_value.X_add_number; + && symbol_constant_p (exp->X_op_symbol)) + mask |= *symbol_X_add_number (exp->X_op_symbol); /* Want to know if mask covers more bits than opmask. this is the same as asking if mask has any bits not in opmask, @@ -800,15 +804,17 @@ make_right_shifted_expr (expressionS * exp, { symbolS * stmp = 0; expressionS * new_exp; + asymbol *bsym; stmp = expr_build_binary (O_right_shift, make_expr_symbol (exp), expr_build_uconstant (amount)); + bsym = symbol_get_bfdsym (stmp); if (signed_p) - stmp->bsym->flags |= BSF_SRELC; + bsym->flags |= BSF_SRELC; else - stmp->bsym->flags |= BSF_RELC; + bsym->flags |= BSF_RELC; /* Then wrap that in a "symbol expr" for good measure. */ new_exp = XNEW (expressionS); diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c index e459324..945b4ec 100644 --- a/gas/config/obj-coff.c +++ b/gas/config/obj-coff.c @@ -23,7 +23,6 @@ #include "as.h" #include "safe-ctype.h" #include "subsegs.h" -#include "struc-symbol.h" #ifdef TE_PE #include "coff/pe.h" @@ -236,9 +235,6 @@ obj_coff_comm (int ignore ATTRIBUTE_UNUSED) } #endif /* TE_PE */ -#define GET_FILENAME_STRING(X) \ - ((char *) (&((X)->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1]) - /* @@ Ick. */ static segT fetch_coff_debug_section (void) diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index 3a7e39e..a674c1b 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -23,7 +23,6 @@ #include "safe-ctype.h" #include "subsegs.h" #include "obstack.h" -#include "struc-symbol.h" #include "dwarf2dbg.h" #ifndef ECOFF_DEBUGGING @@ -261,10 +260,12 @@ elf_sec_sym_ok_for_reloc (asection *sec) void elf_file_symbol (const char *s, int appfile) { + asymbol *bsym; + if (!appfile || symbol_rootP == NULL - || symbol_rootP->bsym == NULL - || (symbol_rootP->bsym->flags & BSF_FILE) == 0) + || (bsym = symbol_get_bfdsym (symbol_rootP)) == NULL + || (bsym->flags & BSF_FILE) == 0) { symbolS *sym; size_t name_length; @@ -284,8 +285,8 @@ elf_file_symbol (const char *s, int appfile) symbol_get_bfdsym (sym)->flags |= BSF_FILE; if (symbol_rootP != sym - && (symbol_rootP->bsym == NULL - || !(symbol_rootP->bsym->flags & BSF_FILE))) + && ((bsym = symbol_get_bfdsym (symbol_rootP)) == NULL + || (bsym->flags & BSF_FILE) == 0)) { symbol_remove (sym, &symbol_rootP, &symbol_lastP); symbol_insert (sym, symbol_rootP, &symbol_rootP, &symbol_lastP); @@ -2469,11 +2470,7 @@ elf_adjust_symtab (void) /* Make sure that the signature symbol for the group has the name of the group. */ sy = symbol_find_exact (group_name); - if (!sy - || (sy != symbol_lastP - && (sy->sy_flags.sy_local_symbol - || sy->sy_next == NULL - || sy->sy_next->sy_previous != sy))) + if (!sy || !symbol_on_chain (sy, symbol_rootP, symbol_lastP)) { /* Create the symbol now. */ sy = symbol_new (group_name, now_seg, (valueT) 0, frag_now); diff --git a/gas/config/obj-evax.c b/gas/config/obj-evax.c index 07a7067..f30db8c 100644 --- a/gas/config/obj-evax.c +++ b/gas/config/obj-evax.c @@ -27,7 +27,6 @@ #include "bfd.h" #include "vms.h" #include "subsegs.h" -#include "struc-symbol.h" #include "safe-ctype.h" static void s_evax_weak (int); diff --git a/gas/config/tc-alpha.c b/gas/config/tc-alpha.c index 7791811..25ba86a 100644 --- a/gas/config/tc-alpha.c +++ b/gas/config/tc-alpha.c @@ -49,7 +49,6 @@ #include "as.h" #include "subsegs.h" -#include "struc-symbol.h" #include "ecoff.h" #include "opcode/alpha.h" @@ -3400,7 +3399,9 @@ add_to_link_pool (symbolS *sym, offsetT addend) && fixp->fx_offset == (valueT)addend && fixp->tc_fix_data.info && fixp->tc_fix_data.info->sym - && fixp->tc_fix_data.info->sym->sy_value.X_op_symbol == basesym) + && symbol_symbolS (fixp->tc_fix_data.info->sym) + && (symbol_get_value_expression (fixp->tc_fix_data.info->sym) + ->X_op_symbol == basesym)) return fixp->tc_fix_data.info->sym; } @@ -3628,7 +3629,7 @@ s_alpha_comm (int ignore ATTRIBUTE_UNUSED) } #ifndef OBJ_EVAX - know (symbolP->sy_frag == &zero_address_frag); + know (symbol_get_frag (symbolP) == &zero_address_frag); #endif demand_empty_rest_of_line (); } diff --git a/gas/config/tc-arc.c b/gas/config/tc-arc.c index a9b3f1a..fa5fa93 100644 --- a/gas/config/tc-arc.c +++ b/gas/config/tc-arc.c @@ -22,7 +22,6 @@ #include "as.h" #include "subsegs.h" -#include "struc-symbol.h" #include "dwarf2dbg.h" #include "dw2gencfi.h" #include "safe-ctype.h" @@ -4211,7 +4210,7 @@ arc_check_reloc (expressionS *exp, if (*r_type_p == BFD_RELOC_32 && exp->X_op == O_subtract && exp->X_op_symbol != NULL - && exp->X_op_symbol->bsym->section == now_seg) + && S_GET_SEGMENT (exp->X_op_symbol) == now_seg) *r_type_p = BFD_RELOC_ARC_32_PCREL; } diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c index d628c95..e3dc31a 100644 --- a/gas/config/tc-avr.c +++ b/gas/config/tc-avr.c @@ -23,7 +23,6 @@ #include "as.h" #include "safe-ctype.h" #include "subsegs.h" -#include "struc-symbol.h" #include "dwarf2dbg.h" #include "dw2gencfi.h" #include "elf/avr.h" @@ -2628,8 +2627,7 @@ avr_patch_gccisr_frag (fragS *fr, int reg) symbolS *sy = avr_isr.sym_n_pushed; /* Turn magic `__gcc_isr.n_pushed' into its now known value. */ - sy->sy_value.X_op = O_constant; - sy->sy_value.X_add_number = n_pushed; + S_SET_VALUE (sy, n_pushed); S_SET_SEGMENT (sy, expr_section); avr_isr.sym_n_pushed = NULL; } diff --git a/gas/config/tc-bfin.c b/gas/config/tc-bfin.c index 56de14f..e6cb663 100644 --- a/gas/config/tc-bfin.c +++ b/gas/config/tc-bfin.c @@ -19,7 +19,6 @@ 02110-1301, USA. */ #include "as.h" -#include "struc-symbol.h" #include "bfin-defs.h" #include "obstack.h" #include "safe-ctype.h" @@ -1930,7 +1929,7 @@ bfin_loop_beginend (Expr_Node *exp, int begin) /* LOOP_END follows the last instruction in the loop. Adjust label address. */ if (!begin) - ((struct local_symbol *) linelabel)->lsy_value -= last_insn_size; + *symbol_X_add_number (linelabel) -= last_insn_size; } bfd_boolean diff --git a/gas/config/tc-csky.c b/gas/config/tc-csky.c index 1c4b44b..3ef9860 100644 --- a/gas/config/tc-csky.c +++ b/gas/config/tc-csky.c @@ -29,7 +29,6 @@ #include "subsegs.h" #include "obstack.h" #include "libiberty.h" -#include "struc-symbol.h" #ifdef OBJ_ELF #include "elf/csky.h" @@ -6783,8 +6782,9 @@ v2_work_movih (void) || (csky_insn.e1.X_op == O_symbol && insn_reloc != BFD_RELOC_NONE)) { if (csky_insn.e1.X_op_symbol != 0 - && csky_insn.e1.X_op_symbol->sy_value.X_op == O_constant - && 16 == csky_insn.e1.X_op_symbol->sy_value.X_add_number) + && symbol_constant_p (csky_insn.e1.X_op_symbol) + && S_GET_SEGMENT (csky_insn.e1.X_op_symbol) == absolute_section + && 16 == S_GET_VALUE (csky_insn.e1.X_op_symbol)) { csky_insn.e1.X_op = O_symbol; if (insn_reloc == BFD_RELOC_CKCORE_GOT32) @@ -6833,8 +6833,9 @@ v2_work_ori (void) } else if (csky_insn.e1.X_op == O_bit_and) { - if (csky_insn.e1.X_op_symbol->sy_value.X_op == O_constant - && 0xffff == csky_insn.e1.X_op_symbol->sy_value.X_add_number) + if (symbol_constant_p (csky_insn.e1.X_op_symbol) + && S_GET_SEGMENT (csky_insn.e1.X_op_symbol) == absolute_section + && 0xffff == S_GET_VALUE (csky_insn.e1.X_op_symbol)) { csky_insn.e1.X_op = O_symbol; if (insn_reloc == BFD_RELOC_CKCORE_GOT32) diff --git a/gas/config/tc-nds32.c b/gas/config/tc-nds32.c index 24dc390..e85316d 100644 --- a/gas/config/tc-nds32.c +++ b/gas/config/tc-nds32.c @@ -31,7 +31,6 @@ #include "hash.h" #include "sb.h" #include "macro.h" -#include "struc-symbol.h" #include "opcode/nds32.h" #include <stdio.h> diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 91b82ed..987377a 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -28,7 +28,6 @@ #include "itbl-ops.h" #include "dwarf2dbg.h" #include "dw2gencfi.h" -#include "struc-symbol.h" #include "elf/riscv.h" #include "opcode/riscv.h" @@ -2620,14 +2619,13 @@ riscv_pre_output_hook (void) if (frag->fr_type == rs_cfa) { expressionS exp; + expressionS *symval; - symbolS *add_symbol = frag->fr_symbol->sy_value.X_add_symbol; - symbolS *op_symbol = frag->fr_symbol->sy_value.X_op_symbol; - + symval = symbol_get_value_expression (frag->fr_symbol); exp.X_op = O_subtract; - exp.X_add_symbol = add_symbol; + exp.X_add_symbol = symval->X_add_symbol; exp.X_add_number = 0; - exp.X_op_symbol = op_symbol; + exp.X_op_symbol = symval->X_op_symbol; fix_new_exp (frag, (int) frag->fr_offset, 1, &exp, 0, BFD_RELOC_RISCV_CFA); diff --git a/gas/config/tc-rl78.c b/gas/config/tc-rl78.c index 4e1c335..c8de931 100644 --- a/gas/config/tc-rl78.c +++ b/gas/config/tc-rl78.c @@ -19,7 +19,6 @@ 02110-1301, USA. */ #include "as.h" -#include "struc-symbol.h" #include "safe-ctype.h" #include "dwarf2dbg.h" #include "elf/common.h" diff --git a/gas/config/tc-rx.c b/gas/config/tc-rx.c index 6c8befe..942fd35 100644 --- a/gas/config/tc-rx.c +++ b/gas/config/tc-rx.c @@ -19,7 +19,6 @@ 02110-1301, USA. */ #include "as.h" -#include "struc-symbol.h" #include "safe-ctype.h" #include "dwarf2dbg.h" #include "elf/common.h" diff --git a/gas/config/tc-s390.c b/gas/config/tc-s390.c index 5a485e0..6b58c4c 100644 --- a/gas/config/tc-s390.c +++ b/gas/config/tc-s390.c @@ -22,7 +22,6 @@ #include "as.h" #include "safe-ctype.h" #include "subsegs.h" -#include "struc-symbol.h" #include "dwarf2dbg.h" #include "dw2gencfi.h" @@ -1858,7 +1857,7 @@ s390_literals (int ignore ATTRIBUTE_UNUSED) /* Emit symbol for start of literal pool. */ S_SET_SEGMENT (lp_sym, now_seg); S_SET_VALUE (lp_sym, (valueT) frag_now_fix ()); - lp_sym->sy_frag = frag_now; + symbol_set_frag (lp_sym, frag_now); while (lpe_list) { @@ -1866,7 +1865,7 @@ s390_literals (int ignore ATTRIBUTE_UNUSED) lpe_list = lpe_list->next; S_SET_SEGMENT (lpe->sym, now_seg); S_SET_VALUE (lpe->sym, (valueT) frag_now_fix ()); - lpe->sym->sy_frag = frag_now; + symbol_set_frag (lpe->sym, frag_now); /* Emit literal pool entry. */ if (lpe->reloc != BFD_RELOC_UNUSED) diff --git a/gas/config/tc-score.c b/gas/config/tc-score.c index c4e5ed9..fb066e3 100644 --- a/gas/config/tc-score.c +++ b/gas/config/tc-score.c @@ -4096,7 +4096,7 @@ s3_build_la_pic (int reg_rd, expressionS exp) /* Fix part For an external symbol: lw rD, <sym>($gp) (BFD_RELOC_SCORE_GOT15 or BFD_RELOC_SCORE_CALL15) */ - sprintf (tmp, "lw_pic r%d, %s", reg_rd, add_symbol->bsym->name); + sprintf (tmp, "lw_pic r%d, %s", reg_rd, S_GET_NAME (add_symbol)); if (s3_append_insn (tmp, FALSE) == (int) s3_FAIL) return; @@ -4110,7 +4110,7 @@ s3_build_la_pic (int reg_rd, expressionS exp) addi rD, <sym> (BFD_RELOC_GOT_LO16) */ s3_inst.reloc.type = BFD_RELOC_SCORE_GOT15; memcpy (&var_insts[0], &s3_inst, sizeof (struct s3_score_it)); - sprintf (tmp, "addi_s_pic r%d, %s", reg_rd, add_symbol->bsym->name); + sprintf (tmp, "addi_s_pic r%d, %s", reg_rd, S_GET_NAME (add_symbol)); if (s3_append_insn (tmp, FALSE) == (int) s3_FAIL) return; @@ -4120,7 +4120,7 @@ s3_build_la_pic (int reg_rd, expressionS exp) else if (add_number >= -0x8000 && add_number <= 0x7fff) { /* Insn 1: lw rD, <sym>($gp) (BFD_RELOC_SCORE_GOT15) */ - sprintf (tmp, "lw_pic r%d, %s", reg_rd, add_symbol->bsym->name); + sprintf (tmp, "lw_pic r%d, %s", reg_rd, S_GET_NAME (add_symbol)); if (s3_append_insn (tmp, TRUE) == (int) s3_FAIL) return; @@ -4137,7 +4137,8 @@ s3_build_la_pic (int reg_rd, expressionS exp) /* Var part For a local symbol: addi rD, <sym>+<constant> (BFD_RELOC_GOT_LO16) */ - sprintf (tmp, "addi_s_pic r%d, %s + %d", reg_rd, add_symbol->bsym->name, (int)add_number); + sprintf (tmp, "addi_s_pic r%d, %s + %d", reg_rd, + S_GET_NAME (add_symbol), (int) add_number); if (s3_append_insn (tmp, FALSE) == (int) s3_FAIL) return; @@ -4150,7 +4151,7 @@ s3_build_la_pic (int reg_rd, expressionS exp) int lo = add_number & 0x0000FFFF; /* Insn 1: lw rD, <sym>($gp) (BFD_RELOC_SCORE_GOT15) */ - sprintf (tmp, "lw_pic r%d, %s", reg_rd, add_symbol->bsym->name); + sprintf (tmp, "lw_pic r%d, %s", reg_rd, S_GET_NAME (add_symbol)); if (s3_append_insn (tmp, TRUE) == (int) s3_FAIL) return; @@ -4192,7 +4193,7 @@ s3_build_la_pic (int reg_rd, expressionS exp) /* Var part For a local symbol: addi r1, <sym>+LO%<constant> (BFD_RELOC_GOT_LO16) */ - sprintf (tmp, "addi_u_pic r1, %s + %d", add_symbol->bsym->name, lo); + sprintf (tmp, "addi_u_pic r1, %s + %d", S_GET_NAME (add_symbol), lo); if (s3_append_insn (tmp, FALSE) == (int) s3_FAIL) return; @@ -4860,7 +4861,7 @@ s3_build_lwst_pic (int reg_rd, expressionS exp, const char *insn_name) /* Fix part For an external symbol: lw rD, <sym>($gp) (BFD_RELOC_SCORE_GOT15) */ - sprintf (tmp, "lw_pic r1, %s", add_symbol->bsym->name); + sprintf (tmp, "lw_pic r1, %s", S_GET_NAME (add_symbol)); if (s3_append_insn (tmp, FALSE) == (int) s3_FAIL) return; @@ -4872,7 +4873,7 @@ s3_build_lwst_pic (int reg_rd, expressionS exp, const char *insn_name) addi rD, <sym> (BFD_RELOC_GOT_LO16) */ s3_inst.reloc.type = BFD_RELOC_SCORE_GOT15; memcpy (&var_insts[0], &s3_inst, sizeof (struct s3_score_it)); - sprintf (tmp, "addi_s_pic r1, %s", add_symbol->bsym->name); + sprintf (tmp, "addi_s_pic r1, %s", S_GET_NAME (add_symbol)); if (s3_append_insn (tmp, FALSE) == (int) s3_FAIL) return; @@ -6847,10 +6848,7 @@ s3_relax_branch_inst16 (fragS * fragp) if (s == NULL) frag_addr = 0; else - { - if (s->bsym != NULL) - symbol_address = (addressT) symbol_get_frag (s)->fr_address; - } + symbol_address = (addressT) symbol_get_frag (s)->fr_address; inst_value = s3_md_chars_to_number (fragp->fr_literal, s3_INSN16_SIZE); offset = (inst_value & 0x1ff) << 1; @@ -6862,7 +6860,6 @@ s3_relax_branch_inst16 (fragS * fragp) if (relaxable_p && (!((value & 0xfffffe00) == 0 || (value & 0xfffffe00) == 0xfffffe00)) && fragp->fr_fix == 2 - && (s->bsym != NULL) && (S_IS_DEFINED (s) && !S_IS_COMMON (s) && !S_IS_EXTERNAL (s))) @@ -6894,10 +6891,7 @@ s3_relax_cmpbranch_inst32 (fragS * fragp) if (s == NULL) frag_addr = 0; else - { - if (s->bsym != NULL) - symbol_address = (addressT) symbol_get_frag (s)->fr_address; - } + symbol_address = (addressT) symbol_get_frag (s)->fr_address; inst_value = s3_md_chars_to_number (fragp->fr_literal, s3_INSN_SIZE); offset = (inst_value & 0x1) @@ -6921,8 +6915,7 @@ s3_relax_cmpbranch_inst32 (fragS * fragp) /* need to translate when extern or not defined or common symbol */ else if ((relaxable_p && (!((value & 0xfffffe00) == 0 || (value & 0xfffffe00) == 0xfffffe00)) - && fragp->fr_fix == 4 - && (s->bsym != NULL)) + && fragp->fr_fix == 4) || !S_IS_DEFINED (s) ||S_IS_COMMON (s) ||S_IS_EXTERNAL (s)) diff --git a/gas/config/tc-score7.c b/gas/config/tc-score7.c index 12271a3..367d09c 100644 --- a/gas/config/tc-score7.c +++ b/gas/config/tc-score7.c @@ -27,7 +27,6 @@ #include "subsegs.h" #include "safe-ctype.h" #include "opcode/score-inst.h" -#include "struc-symbol.h" #include "libiberty.h" #ifdef OBJ_ELF @@ -4200,7 +4199,7 @@ s7_build_la_pic (int reg_rd, expressionS exp) /* Fix part For an external symbol: lw rD, <sym>($gp) (BFD_RELOC_SCORE_GOT15 or BFD_RELOC_SCORE_CALL15) */ - sprintf (tmp, "lw_pic r%d, %s", reg_rd, add_symbol->bsym->name); + sprintf (tmp, "lw_pic r%d, %s", reg_rd, S_GET_NAME (add_symbol)); if (s7_append_insn (tmp, FALSE) == (int) s7_FAIL) return; @@ -4214,7 +4213,7 @@ s7_build_la_pic (int reg_rd, expressionS exp) addi rD, <sym> (BFD_RELOC_GOT_LO16) */ s7_inst.reloc.type = BFD_RELOC_SCORE_GOT15; memcpy (&var_insts[0], &s7_inst, sizeof (struct s7_score_it)); - sprintf (tmp, "addi_s_pic r%d, %s", reg_rd, add_symbol->bsym->name); + sprintf (tmp, "addi_s_pic r%d, %s", reg_rd, S_GET_NAME (add_symbol)); if (s7_append_insn (tmp, FALSE) == (int) s7_FAIL) return; @@ -4224,7 +4223,7 @@ s7_build_la_pic (int reg_rd, expressionS exp) else if (add_number >= -0x8000 && add_number <= 0x7fff) { /* Insn 1: lw rD, <sym>($gp) (BFD_RELOC_SCORE_GOT15) */ - sprintf (tmp, "lw_pic r%d, %s", reg_rd, add_symbol->bsym->name); + sprintf (tmp, "lw_pic r%d, %s", reg_rd, S_GET_NAME (add_symbol)); if (s7_append_insn (tmp, TRUE) == (int) s7_FAIL) return; @@ -4241,7 +4240,8 @@ s7_build_la_pic (int reg_rd, expressionS exp) /* Var part For a local symbol: addi rD, <sym>+<constant> (BFD_RELOC_GOT_LO16) */ - sprintf (tmp, "addi_s_pic r%d, %s + %d", reg_rd, add_symbol->bsym->name, (int) add_number); + sprintf (tmp, "addi_s_pic r%d, %s + %d", reg_rd, + S_GET_NAME (add_symbol), (int) add_number); if (s7_append_insn (tmp, FALSE) == (int) s7_FAIL) return; @@ -4254,7 +4254,7 @@ s7_build_la_pic (int reg_rd, expressionS exp) int lo = add_number & 0x0000FFFF; /* Insn 1: lw rD, <sym>($gp) (BFD_RELOC_SCORE_GOT15) */ - sprintf (tmp, "lw_pic r%d, %s", reg_rd, add_symbol->bsym->name); + sprintf (tmp, "lw_pic r%d, %s", reg_rd, S_GET_NAME (add_symbol)); if (s7_append_insn (tmp, TRUE) == (int) s7_FAIL) return; @@ -4296,7 +4296,7 @@ s7_build_la_pic (int reg_rd, expressionS exp) /* Var part For a local symbol: addi r1, <sym>+LO%<constant> (BFD_RELOC_GOT_LO16) */ - sprintf (tmp, "addi_u_pic r1, %s + %d", add_symbol->bsym->name, lo); + sprintf (tmp, "addi_u_pic r1, %s + %d", S_GET_NAME (add_symbol), lo); if (s7_append_insn (tmp, FALSE) == (int) s7_FAIL) return; @@ -4661,7 +4661,7 @@ s7_build_lwst_pic (int reg_rd, expressionS exp, const char *insn_name) /* Fix part For an external symbol: lw rD, <sym>($gp) (BFD_RELOC_SCORE_GOT15) */ - sprintf (tmp, "lw_pic r1, %s", add_symbol->bsym->name); + sprintf (tmp, "lw_pic r1, %s", S_GET_NAME (add_symbol)); if (s7_append_insn (tmp, FALSE) == (int) s7_FAIL) return; @@ -4673,7 +4673,7 @@ s7_build_lwst_pic (int reg_rd, expressionS exp, const char *insn_name) addi rD, <sym> (BFD_RELOC_GOT_LO16) */ s7_inst.reloc.type = BFD_RELOC_SCORE_GOT15; memcpy (&var_insts[0], &s7_inst, sizeof (struct s7_score_it)); - sprintf (tmp, "addi_s_pic r1, %s", add_symbol->bsym->name); + sprintf (tmp, "addi_s_pic r1, %s", S_GET_NAME (add_symbol)); if (s7_append_insn (tmp, FALSE) == (int) s7_FAIL) return; @@ -5263,10 +5263,7 @@ s7_b32_relax_to_b16 (fragS * fragp) if (s == NULL) frag_addr = 0; else - { - if (s->bsym != NULL) - symbol_address = (addressT) symbol_get_frag (s)->fr_address; - } + symbol_address = (addressT) symbol_get_frag (s)->fr_address; value = s7_md_chars_to_number (fragp->fr_literal, s7_INSN_SIZE); @@ -5280,7 +5277,7 @@ s7_b32_relax_to_b16 (fragS * fragp) abs_value = 0xffffffff - abs_value + 1; /* Relax branch 32 to branch 16. */ - if (relaxable_p && (s->bsym != NULL) && ((abs_value & 0xffffff00) == 0) + if (relaxable_p && ((abs_value & 0xffffff00) == 0) && (S_IS_DEFINED (s) && !S_IS_COMMON (s) && !S_IS_EXTERNAL (s))) { /* do nothing. */ diff --git a/gas/config/tc-sh.c b/gas/config/tc-sh.c index 9b58db3..ca8fb5d 100644 --- a/gas/config/tc-sh.c +++ b/gas/config/tc-sh.c @@ -25,7 +25,6 @@ #define DEFINE_TABLE #include "opcodes/sh-opc.h" #include "safe-ctype.h" -#include "struc-symbol.h" #ifdef OBJ_ELF #include "elf/sh.h" @@ -1911,6 +1910,7 @@ insert_loop_bounds (char *output, sh_operand_info *operand) { static int count = 0; char name[11]; + expressionS *symval; /* If the last loop insn is a two-byte-insn, it is in danger of being swapped with the insn after it. To prevent this, create a new @@ -1926,8 +1926,9 @@ insert_loop_bounds (char *output, sh_operand_info *operand) SF_SET_LOCAL (end_sym); #endif /* OBJ_COFF */ symbol_table_insert (end_sym); - end_sym->sy_value = operand[1].immediate; - end_sym->sy_value.X_add_number += 2; + symval = symbol_get_value_expression (end_sym); + *symval = operand[1].immediate; + symval->X_add_number += 2; fix_new (frag_now, frag_now_fix (), 2, end_sym, 0, 1, BFD_RELOC_SH_LABEL); } @@ -2926,21 +2927,6 @@ sh_frob_section (bfd *abfd ATTRIBUTE_UNUSED, segT sec, for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next) { symbolS *sym; - - sym = fix->fx_addsy; - /* Check for a local_symbol. */ - if (sym && sym->bsym == NULL) - { - struct local_symbol *ls = (struct local_symbol *)sym; - /* See if it's been converted. If so, canonicalize. */ - if (local_symbol_converted_p (ls)) - fix->fx_addsy = local_symbol_get_real_symbol (ls); - } - } - - for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next) - { - symbolS *sym; bfd_vma val; fixS *fscan; struct sh_count_relocs info; diff --git a/gas/config/tc-tic54x.c b/gas/config/tc-tic54x.c index 49a163d..0e2b811 100644 --- a/gas/config/tc-tic54x.c +++ b/gas/config/tc-tic54x.c @@ -50,7 +50,6 @@ #include "sb.h" #include "macro.h" #include "subsegs.h" -#include "struc-symbol.h" #include "opcode/tic54x.h" #include "obj-coff.h" #include <math.h> @@ -506,7 +505,7 @@ tic54x_bss (int x ATTRIBUTE_UNUSED) symbolP = symbol_find_or_make (name); if (S_GET_SEGMENT (symbolP) == bss_section) - symbolP->sy_frag->fr_symbol = (symbolS *) NULL; + symbol_get_frag (symbolP)->fr_symbol = (symbolS *) NULL; symbol_set_frag (symbolP, frag_now); p = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, diff --git a/gas/config/tc-tilegx.c b/gas/config/tc-tilegx.c index 8ee95e7..49e05b1 100644 --- a/gas/config/tc-tilegx.c +++ b/gas/config/tc-tilegx.c @@ -19,7 +19,6 @@ MA 02110-1301, USA. */ #include "as.h" -#include "struc-symbol.h" #include "subsegs.h" #include "elf/tilegx.h" @@ -737,16 +736,18 @@ emit_tilegx_instruction (tilegx_bundle_bits bits, } else if (use_subexp) { + expressionS *sval = NULL; /* Now that we've changed the reloc, change ha16(x) into x, etc. */ - if (!operand_exp->X_add_symbol->sy_flags.sy_local_symbol - && operand_exp->X_add_symbol->sy_value.X_md) + if (symbol_symbolS (operand_exp->X_add_symbol)) + sval = symbol_get_value_expression (operand_exp->X_add_symbol); + if (sval && sval->X_md) { /* HACK: We used X_md to mark this symbol as a fake wrapper around a real expression. To unwrap it, we just grab its value here. */ - operand_exp = &operand_exp->X_add_symbol->sy_value; + operand_exp = sval; if (require_symbol) { @@ -1067,7 +1068,7 @@ tilegx_parse_name (char *name, expressionS *e, char *nextcharP) /* HACK: mark this symbol as a temporary wrapper around a proper expression, so we can unwrap it later once we have communicated the relocation type. */ - sym->sy_value.X_md = 1; + symbol_get_value_expression (sym)->X_md = 1; } memset (e, 0, sizeof *e); diff --git a/gas/config/tc-tilepro.c b/gas/config/tc-tilepro.c index 12bde37..7f1c905 100644 --- a/gas/config/tc-tilepro.c +++ b/gas/config/tc-tilepro.c @@ -19,7 +19,6 @@ MA 02110-1301, USA. */ #include "as.h" -#include "struc-symbol.h" #include "subsegs.h" #include "elf/tilepro.h" @@ -628,16 +627,18 @@ emit_tilepro_instruction (tilepro_bundle_bits bits, } else if (use_subexp) { + expressionS *sval = NULL; /* Now that we've changed the reloc, change ha16(x) into x, etc. */ - if (!operand_exp->X_add_symbol->sy_flags.sy_local_symbol - && operand_exp->X_add_symbol->sy_value.X_md) + if (symbol_symbolS (operand_exp->X_add_symbol)) + sval = symbol_get_value_expression (operand_exp->X_add_symbol); + if (sval && sval->X_md) { /* HACK: We used X_md to mark this symbol as a fake wrapper around a real expression. To unwrap it, we just grab its value here. */ - operand_exp = &operand_exp->X_add_symbol->sy_value; + operand_exp = sval; if (require_symbol) { @@ -958,7 +959,7 @@ tilepro_parse_name (char *name, expressionS *e, char *nextcharP) /* HACK: mark this symbol as a temporary wrapper around a proper expression, so we can unwrap it later once we have communicated the relocation type. */ - sym->sy_value.X_md = 1; + symbol_get_value_expression (sym)->X_md = 1; } memset (e, 0, sizeof *e); diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index d3a2f8e..b74fb68 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -27,7 +27,6 @@ #include "xtensa-relax.h" #include "dwarf2dbg.h" #include "xtensa-istack.h" -#include "struc-symbol.h" #include "xtensa-config.h" #include "elf/xtensa.h" @@ -7215,10 +7214,8 @@ xg_assemble_vliw_tokens (vliw_insn *vinsn) frag_now->tc_frag_data.slot_offsets[slot] = tinsn->offset; frag_now->tc_frag_data.literal_frags[slot] = tinsn->literal_frag; if (tinsn->opcode == xtensa_l32r_opcode) - { - frag_now->tc_frag_data.literal_frags[slot] = - tinsn->tok[1].X_add_symbol->sy_frag; - } + frag_now->tc_frag_data.literal_frags[slot] + = symbol_get_frag (tinsn->tok[1].X_add_symbol); if (tinsn->literal_space != 0) xg_assemble_literal_space (tinsn->literal_space, slot); frag_now->tc_frag_data.free_reg[slot] = tinsn->extra_arg; @@ -7683,14 +7680,15 @@ static int xg_order_trampoline_chain (const void *a, const void *b) const struct trampoline_chain_entry *pb = &_pb->target; symbolS *s1 = pa->sym; symbolS *s2 = pb->sym; + symbolS *tmp; - if (s1->sy_flags.sy_local_symbol - && local_symbol_converted_p ((struct local_symbol *) s1)) - s1 = local_symbol_get_real_symbol ((struct local_symbol *) s1); + tmp = symbol_symbolS (s1); + if (tmp) + s1 = tmp; - if (s2->sy_flags.sy_local_symbol - && local_symbol_converted_p ((struct local_symbol *) s2)) - s2 = local_symbol_get_real_symbol ((struct local_symbol *) s2); + tmp = symbol_symbolS (s2); + if (tmp) + s2 = tmp; if (s1 == s2) if (pa->offset == pb->offset) diff --git a/gas/doc/internals.texi b/gas/doc/internals.texi index f58ae8b..76ed7b4 100644 --- a/gas/doc/internals.texi +++ b/gas/doc/internals.texi @@ -41,11 +41,10 @@ This section describes some fundamental GAS data types. @cindex symbolS structure The definition for the symbol structure, @code{symbolS}, is located in -@file{struc-symbol.h}. +@file{symbols.c}. -In general, the fields of this structure may not be referred to directly. +The fields of this structure may not be referred to directly. Instead, you must use one of the accessor functions defined in @file{symbol.h}. -These accessor functions should work for any GAS version. Symbol structures contain the following fields: @@ -398,12 +397,6 @@ deal with local symbols. @code{struct local_symbol} is much smaller than @code{symbolS} (which also automatically creates a bfd @code{asymbol} structure), so this saves space when assembling large files. -The first field of @code{symbolS} is @code{bsym}, the pointer to the BFD -symbol. The first field of @code{struct local_symbol} is a pointer which is -always set to NULL. This is how the symbol accessor functions can distinguish -local symbols from ordinary symbols. The symbol accessor functions -automatically convert a local symbol into an ordinary symbol when necessary. - @node Expressions @subsection Expressions @cindex internals, expressions diff --git a/gas/ehopt.c b/gas/ehopt.c index 033b22a..6e34640 100644 --- a/gas/ehopt.c +++ b/gas/ehopt.c @@ -21,7 +21,6 @@ #include "as.h" #include "subsegs.h" -#include "struc-symbol.h" /* We include this ELF file, even though we may not be assembling for ELF, since the exception frame information is always in a format @@ -434,23 +433,28 @@ check_eh_frame (expressionS *exp, unsigned int *pnbytes) || exp->X_op == O_right_shift) && d->cie_info.code_alignment > 1) { - if (exp->X_add_symbol->bsym - && exp->X_op_symbol->bsym - && exp->X_add_symbol->sy_value.X_op == O_subtract - && exp->X_op_symbol->sy_value.X_op == O_constant + if (symbol_symbolS (exp->X_add_symbol) + && symbol_constant_p (exp->X_op_symbol) + && S_GET_SEGMENT (exp->X_op_symbol) == absolute_section && ((exp->X_op == O_divide - ? exp->X_op_symbol->sy_value.X_add_number - : (offsetT) 1 << exp->X_op_symbol->sy_value.X_add_number) + ? *symbol_X_add_number (exp->X_op_symbol) + : (offsetT) 1 << *symbol_X_add_number (exp->X_op_symbol)) == (offsetT) d->cie_info.code_alignment)) { - /* This is a case we can optimize as well. The expression was - not reduced, so we can not finish the optimization until the - end of the assembly. We set up a variant frag which we - handle later. */ - frag_var (rs_cfa, 4, 0, d->cie_info.code_alignment << 3, - make_expr_symbol (&exp->X_add_symbol->sy_value), - d->loc4_fix, (char *) d->loc4_frag); - return 1; + expressionS *symval; + + symval = symbol_get_value_expression (exp->X_add_symbol); + if (symval->X_op == O_subtract) + { + /* This is a case we can optimize as well. The + expression was not reduced, so we can not finish + the optimization until the end of the assembly. + We set up a variant frag which we handle later. */ + frag_var (rs_cfa, 4, 0, d->cie_info.code_alignment << 3, + make_expr_symbol (symval), + d->loc4_fix, (char *) d->loc4_frag); + return 1; + } } } break; diff --git a/gas/po/POTFILES.in b/gas/po/POTFILES.in index 8fbb58f..2c92192 100644 --- a/gas/po/POTFILES.in +++ b/gas/po/POTFILES.in @@ -254,7 +254,6 @@ remap.c sb.c sb.h stabs.c -struc-symbol.h subsegs.c subsegs.h symbols.c diff --git a/gas/struc-symbol.h b/gas/struc-symbol.h deleted file mode 100644 index c016848..0000000 --- a/gas/struc-symbol.h +++ /dev/null @@ -1,158 +0,0 @@ -/* struct_symbol.h - Internal symbol structure - Copyright (C) 1987-2018 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#ifndef __struc_symbol_h__ -#define __struc_symbol_h__ - -struct symbol_flags -{ - /* Whether the symbol is a local_symbol. */ - unsigned int sy_local_symbol : 1; - - /* Weather symbol has been written. */ - unsigned int sy_written : 1; - - /* Whether symbol value has been completely resolved (used during - final pass over symbol table). */ - unsigned int sy_resolved : 1; - - /* Whether the symbol value is currently being resolved (used to - detect loops in symbol dependencies). */ - unsigned int sy_resolving : 1; - - /* Whether the symbol value is used in a reloc. This is used to - ensure that symbols used in relocs are written out, even if they - are local and would otherwise not be. */ - unsigned int sy_used_in_reloc : 1; - - /* Whether the symbol is used as an operand or in an expression. - NOTE: Not all the backends keep this information accurate; - backends which use this bit are responsible for setting it when - a symbol is used in backend routines. */ - unsigned int sy_used : 1; - - /* Whether the symbol can be re-defined. */ - unsigned int sy_volatile : 1; - - /* Whether the symbol is a forward reference. */ - unsigned int sy_forward_ref : 1; - - /* This is set if the symbol is defined in an MRI common section. - We handle such sections as single common symbols, so symbols - defined within them must be treated specially by the relocation - routines. */ - unsigned int sy_mri_common : 1; - - /* This is set if the symbol is set with a .weakref directive. */ - unsigned int sy_weakrefr : 1; - - /* This is set when the symbol is referenced as part of a .weakref - directive, but only if the symbol was not in the symbol table - before. It is cleared as soon as any direct reference to the - symbol is present. */ - unsigned int sy_weakrefd : 1; -}; - -/* The information we keep for a symbol. Note that the symbol table - holds pointers both to this and to local_symbol structures. See - below. */ - -struct symbol -{ - /* Symbol flags. */ - struct symbol_flags sy_flags; - - /* BFD symbol */ - asymbol *bsym; - - /* The value of the symbol. */ - expressionS sy_value; - - /* Forwards and (optionally) backwards chain pointers. */ - struct symbol *sy_next; - struct symbol *sy_previous; - - /* Pointer to the frag this symbol is attached to, if any. - Otherwise, NULL. */ - struct frag *sy_frag; - -#ifdef OBJ_SYMFIELD_TYPE - OBJ_SYMFIELD_TYPE sy_obj; -#endif - -#ifdef TC_SYMFIELD_TYPE - TC_SYMFIELD_TYPE sy_tc; -#endif - -#ifdef TARGET_SYMBOL_FIELDS - TARGET_SYMBOL_FIELDS -#endif -}; - -/* A pointer in the symbol may point to either a complete symbol - (struct symbol above) or to a local symbol (struct local_symbol - defined here). The symbol code can detect the case by examining - the first field. It is always NULL for a local symbol. - - We do this because we ordinarily only need a small amount of - information for a local symbol. The symbol table takes up a lot of - space, and storing less information for a local symbol can make a - big difference in assembler memory usage when assembling a large - file. */ - -struct local_symbol -{ - /* Symbol flags. Only sy_local_symbol and sy_resolved are relevant. */ - struct symbol_flags lsy_flags; - - /* The symbol section. This also serves as a flag. If this is - reg_section, then this symbol has been converted into a regular - symbol, and lsy_sym points to it. */ - segT lsy_section; - - /* The symbol name. */ - const char *lsy_name; - - /* The symbol frag or the real symbol, depending upon the value in - lsy_section. */ - union - { - fragS *lsy_frag; - symbolS *lsy_sym; - } u; - - /* The value of the symbol. */ - valueT lsy_value; - -#ifdef TC_LOCAL_SYMFIELD_TYPE - TC_LOCAL_SYMFIELD_TYPE lsy_tc; -#endif -}; - -#define local_symbol_converted_p(l) ((l)->lsy_section == reg_section) -#define local_symbol_mark_converted(l) ((l)->lsy_section = reg_section) -#define local_symbol_resolved_p(l) ((l)->lsy_flags.sy_resolved) -#define local_symbol_mark_resolved(l) ((l)->lsy_flags.sy_resolved = 1) -#define local_symbol_get_frag(l) ((l)->u.lsy_frag) -#define local_symbol_set_frag(l, f) ((l)->u.lsy_frag = (f)) -#define local_symbol_get_real_symbol(l) ((l)->u.lsy_sym) -#define local_symbol_set_real_symbol(l, s) ((l)->u.lsy_sym = (s)) - -#endif /* __struc_symbol_h__ */ diff --git a/gas/symbols.c b/gas/symbols.c index 2056981..1b9a257 100644 --- a/gas/symbols.c +++ b/gas/symbols.c @@ -24,9 +24,142 @@ #include "safe-ctype.h" #include "obstack.h" /* For "symbols.h" */ #include "subsegs.h" -#include "struc-symbol.h" #include "write.h" +struct symbol_flags +{ + /* Whether the symbol is a local_symbol. */ + unsigned int sy_local_symbol : 1; + + /* Weather symbol has been written. */ + unsigned int sy_written : 1; + + /* Whether symbol value has been completely resolved (used during + final pass over symbol table). */ + unsigned int sy_resolved : 1; + + /* Whether the symbol value is currently being resolved (used to + detect loops in symbol dependencies). */ + unsigned int sy_resolving : 1; + + /* Whether the symbol value is used in a reloc. This is used to + ensure that symbols used in relocs are written out, even if they + are local and would otherwise not be. */ + unsigned int sy_used_in_reloc : 1; + + /* Whether the symbol is used as an operand or in an expression. + NOTE: Not all the backends keep this information accurate; + backends which use this bit are responsible for setting it when + a symbol is used in backend routines. */ + unsigned int sy_used : 1; + + /* Whether the symbol can be re-defined. */ + unsigned int sy_volatile : 1; + + /* Whether the symbol is a forward reference. */ + unsigned int sy_forward_ref : 1; + + /* This is set if the symbol is defined in an MRI common section. + We handle such sections as single common symbols, so symbols + defined within them must be treated specially by the relocation + routines. */ + unsigned int sy_mri_common : 1; + + /* This is set if the symbol is set with a .weakref directive. */ + unsigned int sy_weakrefr : 1; + + /* This is set when the symbol is referenced as part of a .weakref + directive, but only if the symbol was not in the symbol table + before. It is cleared as soon as any direct reference to the + symbol is present. */ + unsigned int sy_weakrefd : 1; +}; + +/* The information we keep for a symbol. Note that the symbol table + holds pointers both to this and to local_symbol structures. See + below. */ + +struct symbol +{ + /* Symbol flags. */ + struct symbol_flags sy_flags; + + /* BFD symbol */ + asymbol *bsym; + + /* The value of the symbol. */ + expressionS sy_value; + + /* Forwards and (optionally) backwards chain pointers. */ + struct symbol *sy_next; + struct symbol *sy_previous; + + /* Pointer to the frag this symbol is attached to, if any. + Otherwise, NULL. */ + struct frag *sy_frag; + +#ifdef OBJ_SYMFIELD_TYPE + OBJ_SYMFIELD_TYPE sy_obj; +#endif + +#ifdef TC_SYMFIELD_TYPE + TC_SYMFIELD_TYPE sy_tc; +#endif + +#ifdef TARGET_SYMBOL_FIELDS + TARGET_SYMBOL_FIELDS +#endif +}; + +/* A pointer in the symbol may point to either a complete symbol + (struct symbol above) or to a local symbol (struct local_symbol + defined here). The symbol code can detect the case by examining + the first field. It is always NULL for a local symbol. + + We do this because we ordinarily only need a small amount of + information for a local symbol. The symbol table takes up a lot of + space, and storing less information for a local symbol can make a + big difference in assembler memory usage when assembling a large + file. */ + +struct local_symbol +{ + /* Symbol flags. Only sy_local_symbol and sy_resolved are relevant. */ + struct symbol_flags lsy_flags; + + /* The symbol section. This also serves as a flag. If this is + reg_section, then this symbol has been converted into a regular + symbol, and lsy_sym points to it. */ + segT lsy_section; + + /* The symbol name. */ + const char *lsy_name; + + /* The symbol frag or the real symbol, depending upon the value in + lsy_section. */ + union + { + fragS *lsy_frag; + symbolS *lsy_sym; + } u; + + /* The value of the symbol. */ + valueT lsy_value; + +#ifdef TC_LOCAL_SYMFIELD_TYPE + TC_LOCAL_SYMFIELD_TYPE lsy_tc; +#endif +}; + +#define local_symbol_converted_p(l) ((l)->lsy_section == reg_section) +#define local_symbol_mark_converted(l) ((l)->lsy_section = reg_section) +#define local_symbol_resolved_p(l) ((l)->lsy_flags.sy_resolved) +#define local_symbol_mark_resolved(l) ((l)->lsy_flags.sy_resolved = 1) +#define local_symbol_get_frag(l) ((l)->u.lsy_frag) +#define local_symbol_set_frag(l, f) ((l)->u.lsy_frag = (f)) +#define local_symbol_get_real_symbol(l) ((l)->u.lsy_sym) +#define local_symbol_set_real_symbol(l, s) ((l)->u.lsy_sym = (s)) + /* This is non-zero if symbols are case sensitive, which is the default. */ int symbols_case_sensitive = 1; @@ -928,6 +1061,20 @@ verify_symbol_chain (symbolS *rootP, symbolS *lastP) gas_assert (lastP == symbolP); } +int +symbol_on_chain (symbolS *s, symbolS *rootPP, symbolS *lastPP) +{ + return (!LOCAL_SYMBOL_CHECK (s) + && ((s->sy_next != s + && s->sy_next != NULL + && s->sy_next->sy_previous == s) + || s == lastPP) + && ((s->sy_previous != s + && s->sy_previous != NULL + && s->sy_previous->sy_next == s) + || s == rootPP)); +} + #ifdef OBJ_COMPLEX_RELC static int @@ -2733,6 +2880,18 @@ symbol_shadow_p (symbolS *s) return s->sy_next == s; } +/* If S was created as a struct symbol, return S, otherwise if S is a + converted local_symbol return the converted symbol, otherwise + return NULL. */ + +symbolS * +symbol_symbolS (symbolS *s) +{ + if (LOCAL_SYMBOL_CHECK (s)) + return NULL; + return s; +} + /* Return the BFD symbol for a symbol. */ asymbol * diff --git a/gas/symbols.h b/gas/symbols.h index cb316b5..7c36da1 100644 --- a/gas/symbols.h +++ b/gas/symbols.h @@ -168,6 +168,8 @@ void symbol_remove (symbolS * symbolP, symbolS ** rootP, extern symbolS *symbol_previous (symbolS *); +extern int symbol_on_chain (symbolS *s, symbolS *rootPP, symbolS *lastPP); + void verify_symbol_chain (symbolS * rootP, symbolS * lastP); void symbol_append (symbolS * addme, symbolS * target, @@ -200,6 +202,7 @@ extern int symbol_equated_p (symbolS *); extern int symbol_equated_reloc_p (symbolS *); extern int symbol_constant_p (symbolS *); extern int symbol_shadow_p (symbolS *); +extern symbolS *symbol_symbolS (symbolS *); extern asymbol *symbol_get_bfdsym (symbolS *); extern void symbol_set_bfdsym (symbolS *, asymbol *); extern int symbol_same_p (symbolS *, symbolS *); diff --git a/gas/write.c b/gas/write.c index 1c0ee38..62b3942 100644 --- a/gas/write.c +++ b/gas/write.c @@ -1886,8 +1886,6 @@ create_obj_attrs_section (void) size_seg (stdoutput, s, NULL); } -#include "struc-symbol.h" - /* Create a relocation against an entry in a GNU Build attribute section. */ static void @@ -1904,7 +1902,7 @@ create_note_reloc (segT sec, /* We create a .b type reloc as resolve_reloc_expr_symbols() has already been called. */ reloc->u.b.sec = sec; - reloc->u.b.s = sym->bsym; + reloc->u.b.s = symbol_get_bfdsym (sym); reloc->u.b.r.sym_ptr_ptr = & reloc->u.b.s; reloc->u.b.r.address = offset; reloc->u.b.r.addend = addend; @@ -1951,6 +1949,7 @@ maybe_generate_build_notes (void) offsetT desc2_offset; int desc_reloc; symbolS * sym; + asymbol * bsym; if (! flag_generate_build_notes || bfd_get_section_by_name (stdoutput, @@ -2004,12 +2003,12 @@ maybe_generate_build_notes (void) total_size = 0; note = NULL; - for (sym = symbol_rootP; sym != NULL; sym = sym->sy_next) - if (sym->bsym != NULL - && sym->bsym->flags & BSF_SECTION_SYM - && sym->bsym->section != NULL + for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym)) + if ((bsym = symbol_get_bfdsym (sym)) != NULL + && bsym->flags & BSF_SECTION_SYM + && bsym->section != NULL /* Skip linkonce sections - we cannot use these section symbols as they may disappear. */ - && (sym->bsym->section->flags & (SEC_CODE | SEC_LINK_ONCE)) == SEC_CODE + && (bsym->section->flags & (SEC_CODE | SEC_LINK_ONCE)) == SEC_CODE /* Not all linkonce sections are flagged... */ && strncmp (S_GET_NAME (sym), ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) != 0) { @@ -2042,7 +2041,7 @@ maybe_generate_build_notes (void) /* ...and another one to install the end address. */ create_note_reloc (sec, sym, total_size + desc2_offset, desc_reloc, - bfd_get_section_size (sym->bsym->section), + bfd_get_section_size (bsym->section), note); total_size += note_size; |