1999-05-03 15:29:11 +08:00
|
|
|
|
/* subsegs.c - subsegments -
|
2024-01-04 19:52:08 +08:00
|
|
|
|
Copyright (C) 1987-2024 Free Software Foundation, Inc.
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
|
|
|
|
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
|
2007-07-03 19:01:12 +08:00
|
|
|
|
the Free Software Foundation; either version 3, or (at your option)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
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
|
2005-05-05 17:13:19 +08:00
|
|
|
|
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
|
|
|
|
|
02110-1301, USA. */
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
2000-11-07 09:18:45 +08:00
|
|
|
|
/* Segments & sub-segments. */
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
|
|
|
|
#include "as.h"
|
|
|
|
|
|
|
|
|
|
#include "subsegs.h"
|
|
|
|
|
#include "obstack.h"
|
|
|
|
|
|
2006-05-04 07:52:15 +08:00
|
|
|
|
frchainS *frchain_now;
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
|
|
|
|
static struct obstack frchains;
|
|
|
|
|
|
|
|
|
|
static fragS dummy_frag;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2003-12-03 11:39:58 +08:00
|
|
|
|
subsegs_begin (void)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
|
|
|
|
obstack_begin (&frchains, chunksize);
|
|
|
|
|
#if __GNUC__ >= 2
|
|
|
|
|
obstack_alignment_mask (&frchains) = __alignof__ (frchainS) - 1;
|
|
|
|
|
#endif
|
|
|
|
|
|
2000-09-12 11:56:22 +08:00
|
|
|
|
frchain_now = NULL; /* Warn new_subseg() that we are booting. */
|
1999-05-03 15:29:11 +08:00
|
|
|
|
frag_now = &dummy_frag;
|
|
|
|
|
}
|
2022-07-04 11:15:47 +08:00
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
subsegs_end (struct obstack **obs)
|
|
|
|
|
{
|
|
|
|
|
for (; *obs; obs++)
|
|
|
|
|
_obstack_free (*obs, NULL);
|
|
|
|
|
_obstack_free (&frchains, NULL);
|
2023-01-11 15:58:33 +08:00
|
|
|
|
bfd_set_section_userdata (bfd_abs_section_ptr, NULL);
|
|
|
|
|
bfd_set_section_userdata (bfd_und_section_ptr, NULL);
|
2022-07-04 11:15:47 +08:00
|
|
|
|
}
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
2022-07-04 11:15:47 +08:00
|
|
|
|
static void
|
|
|
|
|
alloc_seginfo (segT seg)
|
|
|
|
|
{
|
|
|
|
|
segment_info_type *seginfo;
|
|
|
|
|
|
|
|
|
|
seginfo = obstack_alloc (¬es, sizeof (*seginfo));
|
|
|
|
|
memset (seginfo, 0, sizeof (*seginfo));
|
|
|
|
|
bfd_set_section_userdata (seg, seginfo);
|
|
|
|
|
}
|
1999-05-03 15:29:11 +08:00
|
|
|
|
/*
|
|
|
|
|
* subseg_change()
|
|
|
|
|
*
|
|
|
|
|
* Change the subsegment we are in, BUT DO NOT MAKE A NEW FRAG for the
|
|
|
|
|
* subsegment. If we are already in the correct subsegment, change nothing.
|
|
|
|
|
* This is used eg as a worker for subseg_set [which does make a new frag_now]
|
|
|
|
|
* and for changing segments after we have read the source. We construct eg
|
|
|
|
|
* fixSs even after the source file is read, so we do have to keep the
|
|
|
|
|
* segment context correct.
|
|
|
|
|
*/
|
|
|
|
|
void
|
Don't use register keyword
* expr.c (expr_symbol_where): Don't use register keyword.
* app.c (app_push, app_pop, do_scrub_chars): Likewise.
* ecoff.c (add_string, add_ecoff_symbol, add_aux_sym_symint,
add_aux_sym_rndx, add_aux_sym_tir, add_procedure, add_file,
ecoff_build_lineno, ecoff_setup_ext, allocate_cluster.
allocate_scope, allocate_vlinks, allocate_shash,
allocate_thash, allocate_tag, allocate_forward, allocate_thead,
allocate_lineno_list): Likewise.
* frags.c (frag_more, frag_var, frag_variant, frag_wane): Likewise.
* input-file.c (input_file_push, input_file_pop): Likewise.
* input-scrub.c (input_scrub_push, input_scrub_next_buffer): Likewise.
* subsegs.c (subseg_change): Likewise.
* symbols.c (colon, symbol_table_insert, symbol_find_or_make)
(dollar_label_name, fb_label_name): Likewise.
* write.c (relax_align): Likewise.
* config/tc-alpha.c (s_alpha_pdesc): Likewise.
* config/tc-bfin.c (bfin_s_bss): Likewise.
* config/tc-i860.c (md_estimate_size_before_relax): Likewise.
* config/tc-m68hc11.c (md_convert_frag): Likewise.
* config/tc-m68k.c (m68k_ip, crack_operand): Likewise.
(md_convert_frag_1, s_even): Likewise.
* config/tc-mips.c (mips_clear_insn_labels): Likewise.
* config/tc-mn10200.c (md_begin): Likewise.
* config/tc-s390.c (s390_setup_opcodes, md_begin): Likewise.
* config/tc-sh.c (sh_elf_cons): Likewise.
* config/tc-tic4x.c (tic4x_cons, tic4x_stringer): Likewise.
* config/m68k-parse.y (m68k_reg_parse): Likewise. Convert from K&R.
(yylex, m68k_ip_op, yyerror): Convert from K&R.
2014-11-04 13:01:09 +08:00
|
|
|
|
subseg_change (segT seg, int subseg)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
|
|
|
|
now_seg = seg;
|
|
|
|
|
now_subseg = subseg;
|
|
|
|
|
|
2022-07-04 11:15:47 +08:00
|
|
|
|
if (!seg_info (seg))
|
|
|
|
|
alloc_seginfo (seg);
|
1999-05-03 15:29:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2003-12-03 11:39:58 +08:00
|
|
|
|
subseg_set_rest (segT seg, subsegT subseg)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
2006-05-04 07:52:15 +08:00
|
|
|
|
frchainS *frcP; /* crawl frchain chain */
|
|
|
|
|
frchainS **lastPP; /* address of last pointer */
|
1999-05-03 15:29:11 +08:00
|
|
|
|
frchainS *newP; /* address of new frchain */
|
2006-05-04 07:52:15 +08:00
|
|
|
|
segment_info_type *seginfo;
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
|
|
|
|
mri_common_symbol = NULL;
|
|
|
|
|
|
|
|
|
|
if (frag_now && frchain_now)
|
|
|
|
|
frchain_now->frch_frag_now = frag_now;
|
|
|
|
|
|
* gas/app, gas/as.c, gas/as.h, gas/atof-generic.c, gas/cgen.c,
gas/config/atof-ieee.c, gas/config/obj-aout.c,
gas/config/obj-coff.c, gas/config/obj-ecoff.c,
gas/config/obj-elf.c, gas/config/obj-som.c, gas/config/tc-alpha.c,
gas/config/tc-arc.c, gas/config/tc-arm.c, gas/config/tc-cr16.c,
gas/config/tc-cris.c, gas/config/tc-crx.c, gas/config/tc-d30v.c,
gas/config/tc-dlx.c, gas/config/tc-hppa.c, gas/config/tc-i370.c,
gas/config/tc-i386-intel.c, gas/config/tc-i386.c,
gas/config/tc-i860.c, gas/config/tc-i960.c, gas/config/tc-ia64.c,
gas/config/tc-iq2000.c, gas/config/tc-m32c.c,
gas/config/tc-m32r.c, gas/config/tc-m68hc11.c,
gas/config/tc-m68k.c, gas/config/tc-maxq.c, gas/config/tc-mcore.c,
gas/config/tc-mep.c, gas/config/tc-mips.c, gas/config/tc-mmix.c,
gas/config/tc-mn10300.c, gas/config/tc-moxie.c,
gas/config/tc-ns32k.c, gas/config/tc-pj.c, gas/config/tc-ppc.c,
gas/config/tc-s390.c, gas/config/tc-score.c,
gas/config/tc-score7.c, gas/config/tc-sh.c, gas/config/tc-sparc.c,
gas/config/tc-spu.c, gas/config/tc-tic30.c, gas/config/tc-vax.c,
gas/config/tc-xtensa.c, gas/config/xtensa-relax.c,
gas/dw2gencfi.c, gas/dwarf2dbg.c, gas/ehopt.c, gas/expr.c,
gas/frags.c, gas/input-file.c, gas/read.c, gas/sb.c,
gas/subsegs.c, gas/symbols.c, gas/write.c: Change the name of the
gas macro `assert' to `gas_assert'.
2009-06-23 01:56:02 +08:00
|
|
|
|
gas_assert (frchain_now == 0
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|| frchain_now->frch_last == frag_now);
|
|
|
|
|
|
|
|
|
|
subseg_change (seg, (int) subseg);
|
|
|
|
|
|
2006-05-04 07:52:15 +08:00
|
|
|
|
seginfo = seg_info (seg);
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
2021-01-07 22:42:00 +08:00
|
|
|
|
/* Should the section symbol be kept? */
|
|
|
|
|
if (bfd_keep_unused_section_symbols (stdoutput))
|
|
|
|
|
seg->symbol->flags |= BSF_SECTION_SYM_USED;
|
|
|
|
|
|
2006-05-04 07:52:15 +08:00
|
|
|
|
/* Attempt to find or make a frchain for that subsection.
|
|
|
|
|
We keep the list sorted by subsection number. */
|
|
|
|
|
for (frcP = *(lastPP = &seginfo->frchainP);
|
|
|
|
|
frcP != NULL;
|
1999-05-03 15:29:11 +08:00
|
|
|
|
frcP = *(lastPP = &frcP->frch_next))
|
2006-05-04 07:52:15 +08:00
|
|
|
|
if (frcP->frch_subseg >= subseg)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
if (frcP == NULL || frcP->frch_subseg != subseg)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
2006-05-04 07:52:15 +08:00
|
|
|
|
/* This should be the only code that creates a frchainS. */
|
* README-vms: Delete.
* config-gas.com: Delete.
* makefile.vms: Delete.
* vmsconf.sh: Delete.
* config/atof-tahoe.c: Delete.
* config/m88k-opcode.h: Delete.
* config/obj-bout.c: Delete.
* config/obj-bout.h: Delete.
* config/obj-hp300.c: Delete.
* config/obj-hp300.h: Delete.
* config/tc-a29k.c: Delete.
* config/tc-a29k.h: Delete.
* config/tc-h8500.c: Delete.
* config/tc-h8500.h: Delete.
* config/tc-m88k.c: Delete.
* config/tc-m88k.h: Delete.
* config/tc-tahoe.c: Delete.
* config/tc-tahoe.h: Delete.
* config/tc-tic80.c: Delete.
* config/tc-tic80.h: Delete.
* config/tc-w65.c: Delete.
* config/tc-w65.h: Delete.
* config/te-aux.h: Delete.
* config/te-delt88.h: Delete.
* config/te-delta.h: Delete.
* config/te-dpx2.h: Delete.
* config/te-hp300.h: Delete.
* config/te-ic960.h: Delete.
* config/vms-a-conf.h: Delete.
* doc/c-a29k.texi: Delete.
* doc/c-h8500.texi: Delete.
* doc/c-m88k.texi: Delete.
* README: Remove obsolete examples, and list of supported targets.
* Makefile.am: Remove a29k, h8500, m88k, tahoe, tic80, w65,
bout and hp300 support.
(DEP_FLAGS): Don't define BFD_ASSEMBLER.
* configure.in: Remove --enable-bfd-assembler, need_bfd,
primary_bfd_gas.
* configure.tgt: Remove a29k, h8300-coff, h8500-*, i960 non-elf,
m68k non bfd, m88k, or32-coff, tic80-*, vax non-bfd, w65k-*, *-nindy.
* as.c: Remove all non-BFD_ASSEMBLER code, support for above targets.
* as.h: Likewise.
* dw2gencfi.c: Likewise.
* dwarf2dbg.c: Likewise.
* ehopt.c: Likewise.
* input-file.c: Likewise.
* listing.c: Likewise.
* literal.c: Likewise.
* messages.c: Likewise.
* obj.h: Likewise.
* output-file.c: Likewise.
* read.c: Likewise.
* stabs.c: Likewise.
* struc-symbol.h: Likewise.
* subsegs.c: Likewise.
* subsegs.h: Likewise.
* symbols.c: Likewise.
* symbols.h: Likewise.
* tc.h: Likewise.
* write.c: Likewise.
* write.h: Likewise.
* config/aout_gnu.h: Likewise.
* config/obj-aout.c: Likewise.
* config/obj-aout.h: Likewise.
* config/obj-coff.c: Likewise.
* config/obj-coff.h: Likewise.
* config/obj-evax.h: Likewise.
* config/obj-ieee.h: Likewise.
* config/tc-arm.c: Likewise.
* config/tc-arm.h: Likewise.
* config/tc-avr.c: Likewise.
* config/tc-avr.h: Likewise.
* config/tc-crx.h: Likewise.
* config/tc-d10v.h: Likewise.
* config/tc-d30v.h: Likewise.
* config/tc-dlx.h: Likewise.
* config/tc-fr30.h: Likewise.
* config/tc-frv.h: Likewise.
* config/tc-h8300.c: Likewise.
* config/tc-h8300.h: Likewise.
* config/tc-hppa.h: Likewise.
* config/tc-i370.h: Likewise.
* config/tc-i386.c: Likewise.
* config/tc-i386.h: Likewise.
* config/tc-i860.h: Likewise.
* config/tc-i960.c: Likewise.
* config/tc-i960.h: Likewise.
* config/tc-ip2k.h: Likewise.
* config/tc-iq2000.h: Likewise.
* config/tc-m32c.h: Likewise.
* config/tc-m32r.h: Likewise.
* config/tc-m68hc11.h: Likewise.
* config/tc-m68k.c: Likewise.
* config/tc-m68k.h: Likewise.
* config/tc-maxq.c: Likewise.
* config/tc-maxq.h: Likewise.
* config/tc-mcore.c: Likewise.
* config/tc-mcore.h: Likewise.
* config/tc-mn10200.h: Likewise.
* config/tc-mn10300.c: Likewise.
* config/tc-mn10300.h: Likewise.
* config/tc-ms1.h: Likewise.
* config/tc-msp430.c: Likewise.
* config/tc-msp430.h: Likewise.
* config/tc-ns32k.c: Likewise.
* config/tc-ns32k.h: Likewise.
* config/tc-openrisc.h: Likewise.
* config/tc-or32.c: Likewise.
* config/tc-or32.h: Likewise.
* config/tc-ppc.c: Likewise.
* config/tc-ppc.h: Likewise.
* config/tc-s390.h: Likewise.
* config/tc-sh.c: Likewise.
* config/tc-sh.h: Likewise.
* config/tc-sparc.c: Likewise.
* config/tc-tic30.c: Likewise.
* config/tc-tic30.h: Likewise.
* config/tc-tic4x.c: Likewise.
* config/tc-tic4x.h: Likewise.
* config/tc-tic54x.c: Likewise.
* config/tc-tic54x.h: Likewise.
* config/tc-v850.h: Likewise.
* config/tc-vax.c: Likewise.
* config/tc-vax.h: Likewise.
* config/tc-xstormy16.h: Likewise.
* config/tc-xtensa.h: Likewise.
* config/tc-z8k.c: Likewise.
* config/tc-z8k.h: Likewise.
* config/vms-a-conf.h
* doc/Makefile.am: Likewise.
* doc/all.texi: Likewise.
* doc/as.texinfo: Likewise.
* doc/Makefile.in: Regenerate.
* Makefile.in: Regenerate.
* configure: Regenerate.
* config.in: Regenerate.
* po/POTFILES.in: Regenerate.
2005-08-11 09:25:29 +08:00
|
|
|
|
|
2009-09-11 23:27:38 +08:00
|
|
|
|
newP = (frchainS *) obstack_alloc (&frchains, sizeof (frchainS));
|
1999-05-03 15:29:11 +08:00
|
|
|
|
newP->frch_subseg = subseg;
|
|
|
|
|
newP->fix_root = NULL;
|
|
|
|
|
newP->fix_tail = NULL;
|
|
|
|
|
obstack_begin (&newP->frch_obstack, chunksize);
|
|
|
|
|
#if __GNUC__ >= 2
|
|
|
|
|
obstack_alignment_mask (&newP->frch_obstack) = __alignof__ (fragS) - 1;
|
|
|
|
|
#endif
|
|
|
|
|
newP->frch_frag_now = frag_alloc (&newP->frch_obstack);
|
|
|
|
|
newP->frch_frag_now->fr_type = rs_fill;
|
2006-12-03 00:24:37 +08:00
|
|
|
|
newP->frch_cfi_data = NULL;
|
gas: x86: synthesize CFI for hand-written asm
This patch adds support in GAS to create generic GAS instructions
(a.k.a., the ginsn) for the x86 backend (AMD64 ABI only at this time).
Using this ginsn infrastructure, GAS can then synthesize CFI for
hand-written asm for x86_64.
A ginsn is a target-independent representation of the machine
instructions. One machine instruction may need one or more ginsn.
This patch also adds skeleton support for printing ginsn in the listing
output for debugging purposes.
Since the current use-case of ginsn is to synthesize CFI, the x86 target
needs to generate ginsns necessary for the following machine
instructions only:
- All change of flow instructions, including all conditional and
unconditional branches, call and return from functions.
- All register saves and unsaves to the stack.
- All instructions affecting the two registers that could potentially
be used as the base register for CFA tracking. For SCFI, the base
register for CFA tracking is limited to REG_SP and REG_FP only for
now.
The representation of ginsn is kept simple:
- GAS instruction has GINSN_NUM_SRC_OPNDS (defined to be 2 at this time)
number of source operands and one destination operand at this time.
- GAS instruction uses DWARF register numbers in its representation and
does not track register size.
- GAS instructions carry location information (file name and line
number).
- GAS instructions are ID's with a natural number in order of their
addtion to the list. This can be used as a proxy for the static
program order of the corresponding machine instructions.
Note that, GAS instruction (ginsn) format does not support
GINSN_TYPE_PUSH and GINSN_TYPE_POP. Some architectures, like aarch64,
do not have push and pop instructions, but rather STP/LDP/STR/LDR etc.
instructions. Further these instructions have a variety of addressing
modes, like offset, pre-indexing and post-indexing etc. Among other
things, one of differences in these addressing modes is _when_ the addr
register is updated with the result of the address calculation: before
or after the memory operation. To best support such needs, the generic
instructions like GINSN_TYPE_LOAD, GINSN_TYPE_STORE together with
GINSN_TYPE_ADD, and GINSN_TYPE_SUB may be used.
The functionality provided in ginsn.c and scfi.c is compiled in when a
target defines TARGET_USE_SCFI and TARGET_USE_GINSN. This can be
revisited later when there are other use-cases of creating ginsn's in
GAS, apart from the current use-case of synthesizing CFI for
hand-written asm.
Support is added only for System V AMD64 ABI for ELF at this time. If
the user enables SCFI with --32, GAS issues an error:
"Fatal error: SCFI is not supported for this ABI"
For synthesizing (DWARF) CFI, the SCFI machinery requires the programmer
to adhere to some pre-requisites for their asm:
- Hand-written asm block must begin with a .type foo, @function
It is highly recommended to, additionally, also ensure that:
- Hand-written asm block ends with a .size foo, .-foo
The SCFI machinery encodes some rules which align with the standard
calling convention specified by the ABI. Apart from the rules, the SCFI
machinery employs some heuristics. For example:
- The base register for CFA tracking may be either REG_SP or REG_FP.
- If the base register for CFA tracking is REG_SP, the precise amount of
stack usage (and hence, the value of REG_SP) must be known at all times.
- If using dynamic stack allocation, the function must switch to
FP-based CFA. This means using instructions like the following (in
AMD64) in prologue:
pushq %rbp
movq %rsp, %rbp
and analogous instructions in epilogue.
- Save and Restore of callee-saved registers must be symmetrical.
However, the SCFI machinery at this time only warns if any such
asymmetry is seen.
These heuristics/rules are architecture-independent and are meant to
employed for all architectures/ABIs using SCFI in the future.
gas/
* Makefile.am: Add new files.
* Makefile.in: Regenerated.
* as.c (defined): Handle documentation and listing option for
ginsns and SCFI.
* config/obj-elf.c (obj_elf_size): Invoke ginsn_data_end.
(obj_elf_type): Invoke ginsn_data_begin.
* config/tc-i386.c (x86_scfi_callee_saved_p): New function.
(ginsn_prefix_66H_p): Likewise.
(ginsn_dw2_regnum): Likewise.
(x86_ginsn_addsub_reg_mem): Likewise.
(x86_ginsn_addsub_mem_reg): Likewise.
(x86_ginsn_alu_imm): Likewise.
(x86_ginsn_move): Likewise.
(x86_ginsn_lea): Likewise.
(x86_ginsn_jump): Likewise.
(x86_ginsn_jump_cond): Likewise.
(x86_ginsn_enter): Likewise.
(x86_ginsn_safe_to_skip): Likewise.
(x86_ginsn_unhandled): Likewise.
(x86_ginsn_new): New functionality to generate ginsns.
(md_assemble): Invoke x86_ginsn_new.
(s_insn): Likewise.
(i386_target_format): Add hard error for usage of SCFI with non AMD64 ABIs.
* config/tc-i386.h (TARGET_USE_GINSN): New definition.
(TARGET_USE_SCFI): Likewise.
(SCFI_MAX_REG_ID): Likewise.
(REG_FP): Likewise.
(REG_SP): Likewise.
(SCFI_INIT_CFA_OFFSET): Likewise.
(SCFI_CALLEE_SAVED_REG_P): Likewise.
(x86_scfi_callee_saved_p): Likewise.
* gas/listing.h (LISTING_GINSN_SCFI): New define for ginsn and
SCFI.
* gas/read.c (read_a_source_file): Close SCFI processing at end
of file read.
* gas/scfidw2gen.c (scfi_process_cfi_label): Add implementation.
(scfi_process_cfi_signal_frame): Likewise.
* subsegs.h (struct frch_ginsn_data): New forward declaration.
(struct frchain): New member for ginsn data.
* gas/subsegs.c (subseg_set_rest): Initialize the new member.
* symbols.c (colon): Invoke ginsn_frob_label to convey
user-defined labels to ginsn infrastructure.
* ginsn.c: New file.
* ginsn.h: New file.
* scfi.c: New file.
* scfi.h: New file.
2024-01-15 17:00:31 +08:00
|
|
|
|
newP->frch_ginsn_data = NULL;
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
|
|
|
|
newP->frch_root = newP->frch_last = newP->frch_frag_now;
|
|
|
|
|
|
|
|
|
|
*lastPP = newP;
|
2006-05-04 07:52:15 +08:00
|
|
|
|
newP->frch_next = frcP;
|
1999-05-03 15:29:11 +08:00
|
|
|
|
frcP = newP;
|
|
|
|
|
}
|
2006-05-04 07:52:15 +08:00
|
|
|
|
|
1999-05-03 15:29:11 +08:00
|
|
|
|
frchain_now = frcP;
|
|
|
|
|
frag_now = frcP->frch_frag_now;
|
|
|
|
|
|
* gas/app, gas/as.c, gas/as.h, gas/atof-generic.c, gas/cgen.c,
gas/config/atof-ieee.c, gas/config/obj-aout.c,
gas/config/obj-coff.c, gas/config/obj-ecoff.c,
gas/config/obj-elf.c, gas/config/obj-som.c, gas/config/tc-alpha.c,
gas/config/tc-arc.c, gas/config/tc-arm.c, gas/config/tc-cr16.c,
gas/config/tc-cris.c, gas/config/tc-crx.c, gas/config/tc-d30v.c,
gas/config/tc-dlx.c, gas/config/tc-hppa.c, gas/config/tc-i370.c,
gas/config/tc-i386-intel.c, gas/config/tc-i386.c,
gas/config/tc-i860.c, gas/config/tc-i960.c, gas/config/tc-ia64.c,
gas/config/tc-iq2000.c, gas/config/tc-m32c.c,
gas/config/tc-m32r.c, gas/config/tc-m68hc11.c,
gas/config/tc-m68k.c, gas/config/tc-maxq.c, gas/config/tc-mcore.c,
gas/config/tc-mep.c, gas/config/tc-mips.c, gas/config/tc-mmix.c,
gas/config/tc-mn10300.c, gas/config/tc-moxie.c,
gas/config/tc-ns32k.c, gas/config/tc-pj.c, gas/config/tc-ppc.c,
gas/config/tc-s390.c, gas/config/tc-score.c,
gas/config/tc-score7.c, gas/config/tc-sh.c, gas/config/tc-sparc.c,
gas/config/tc-spu.c, gas/config/tc-tic30.c, gas/config/tc-vax.c,
gas/config/tc-xtensa.c, gas/config/xtensa-relax.c,
gas/dw2gencfi.c, gas/dwarf2dbg.c, gas/ehopt.c, gas/expr.c,
gas/frags.c, gas/input-file.c, gas/read.c, gas/sb.c,
gas/subsegs.c, gas/symbols.c, gas/write.c: Change the name of the
gas macro `assert' to `gas_assert'.
2009-06-23 01:56:02 +08:00
|
|
|
|
gas_assert (frchain_now->frch_last == frag_now);
|
1999-05-03 15:29:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* subseg_set(segT, subsegT)
|
|
|
|
|
*
|
|
|
|
|
* If you attempt to change to the current subsegment, nothing happens.
|
|
|
|
|
*
|
|
|
|
|
* In: segT, subsegT code for new subsegment.
|
|
|
|
|
* frag_now -> incomplete frag for current subsegment.
|
|
|
|
|
* If frag_now==NULL, then there is no old, incomplete frag, so
|
|
|
|
|
* the old frag is not closed off.
|
|
|
|
|
*
|
|
|
|
|
* Out: now_subseg, now_seg updated.
|
|
|
|
|
* Frchain_now points to the (possibly new) struct frchain for this
|
|
|
|
|
* sub-segment.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
segT
|
2003-12-03 11:39:58 +08:00
|
|
|
|
subseg_get (const char *segname, int force_new)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
|
|
|
|
segT secptr;
|
bfd_section_* macros
This large patch removes the unnecessary bfd parameter from various
bfd section macros and functions. The bfd is hardly ever used and if
needed for the bfd_set_section_* or bfd_rename_section functions can
be found via section->owner except for the com, und, abs, and ind
std_section special sections. Those sections shouldn't be modified
anyway.
The patch also removes various bfd_get_section_<field> macros,
replacing their use with bfd_section_<field>, and adds
bfd_set_section_lma. I've also fixed a minor bug in gas where
compressed section renaming was done directly rather than calling
bfd_rename_section. This would have broken bfd_get_section_by_name
and similar functions, but that hardly mattered at such a late stage
in gas processing.
bfd/
* bfd-in.h (bfd_get_section_name, bfd_get_section_vma),
(bfd_get_section_lma, bfd_get_section_alignment),
(bfd_get_section_size, bfd_get_section_flags),
(bfd_get_section_userdata): Delete.
(bfd_section_name, bfd_section_size, bfd_section_vma),
(bfd_section_lma, bfd_section_alignment): Lose bfd parameter.
(bfd_section_flags, bfd_section_userdata): New.
(bfd_is_com_section): Rename parameter.
* section.c (bfd_set_section_userdata, bfd_set_section_vma),
(bfd_set_section_alignment, bfd_set_section_flags, bfd_rename_section),
(bfd_set_section_size): Delete bfd parameter, rename section parameter.
(bfd_set_section_lma): New.
* bfd-in2.h: Regenerate.
* mach-o.c (bfd_mach_o_init_section_from_mach_o): Delete bfd param,
update callers.
* aoutx.h, * bfd.c, * coff-alpha.c, * coff-arm.c, * coff-mips.c,
* coff64-rs6000.c, * coffcode.h, * coffgen.c, * cofflink.c,
* compress.c, * ecoff.c, * elf-eh-frame.c, * elf-hppa.h,
* elf-ifunc.c, * elf-m10200.c, * elf-m10300.c, * elf-properties.c,
* elf-s390-common.c, * elf-vxworks.c, * elf.c, * elf32-arc.c,
* elf32-arm.c, * elf32-avr.c, * elf32-bfin.c, * elf32-cr16.c,
* elf32-cr16c.c, * elf32-cris.c, * elf32-crx.c, * elf32-csky.c,
* elf32-d10v.c, * elf32-epiphany.c, * elf32-fr30.c, * elf32-frv.c,
* elf32-ft32.c, * elf32-h8300.c, * elf32-hppa.c, * elf32-i386.c,
* elf32-ip2k.c, * elf32-iq2000.c, * elf32-lm32.c, * elf32-m32c.c,
* elf32-m32r.c, * elf32-m68hc1x.c, * elf32-m68k.c, * elf32-mcore.c,
* elf32-mep.c, * elf32-metag.c, * elf32-microblaze.c,
* elf32-moxie.c, * elf32-msp430.c, * elf32-mt.c, * elf32-nds32.c,
* elf32-nios2.c, * elf32-or1k.c, * elf32-ppc.c, * elf32-pru.c,
* elf32-rl78.c, * elf32-rx.c, * elf32-s390.c, * elf32-score.c,
* elf32-score7.c, * elf32-sh.c, * elf32-spu.c, * elf32-tic6x.c,
* elf32-tilepro.c, * elf32-v850.c, * elf32-vax.c, * elf32-visium.c,
* elf32-xstormy16.c, * elf32-xtensa.c, * elf64-alpha.c,
* elf64-bpf.c, * elf64-hppa.c, * elf64-ia64-vms.c, * elf64-mmix.c,
* elf64-ppc.c, * elf64-s390.c, * elf64-sparc.c, * elf64-x86-64.c,
* elflink.c, * elfnn-aarch64.c, * elfnn-ia64.c, * elfnn-riscv.c,
* elfxx-aarch64.c, * elfxx-mips.c, * elfxx-sparc.c,
* elfxx-tilegx.c, * elfxx-x86.c, * i386msdos.c, * linker.c,
* mach-o.c, * mmo.c, * opncls.c, * pdp11.c, * pei-x86_64.c,
* peicode.h, * reloc.c, * section.c, * syms.c, * vms-alpha.c,
* xcofflink.c: Update throughout for bfd section macro and function
changes.
binutils/
* addr2line.c, * bucomm.c, * coffgrok.c, * dlltool.c, * nm.c,
* objcopy.c, * objdump.c, * od-elf32_avr.c, * od-macho.c,
* od-xcoff.c, * prdbg.c, * rdcoff.c, * rddbg.c, * rescoff.c,
* resres.c, * size.c, * srconv.c, * strings.c, * windmc.c: Update
throughout for bfd section macro and function changes.
gas/
* as.c, * as.h, * dw2gencfi.c, * dwarf2dbg.c, * ecoff.c,
* read.c, * stabs.c, * subsegs.c, * subsegs.h, * write.c,
* config/obj-coff-seh.c, * config/obj-coff.c, * config/obj-ecoff.c,
* config/obj-elf.c, * config/obj-macho.c, * config/obj-som.c,
* config/tc-aarch64.c, * config/tc-alpha.c, * config/tc-arc.c,
* config/tc-arm.c, * config/tc-avr.c, * config/tc-bfin.c,
* config/tc-bpf.c, * config/tc-d10v.c, * config/tc-d30v.c,
* config/tc-epiphany.c, * config/tc-fr30.c, * config/tc-frv.c,
* config/tc-h8300.c, * config/tc-hppa.c, * config/tc-i386.c,
* config/tc-ia64.c, * config/tc-ip2k.c, * config/tc-iq2000.c,
* config/tc-lm32.c, * config/tc-m32c.c, * config/tc-m32r.c,
* config/tc-m68hc11.c, * config/tc-mep.c, * config/tc-microblaze.c,
* config/tc-mips.c, * config/tc-mmix.c, * config/tc-mn10200.c,
* config/tc-mn10300.c, * config/tc-msp430.c, * config/tc-mt.c,
* config/tc-nds32.c, * config/tc-or1k.c, * config/tc-ppc.c,
* config/tc-pru.c, * config/tc-rl78.c, * config/tc-rx.c,
* config/tc-s12z.c, * config/tc-s390.c, * config/tc-score.c,
* config/tc-score7.c, * config/tc-sh.c, * config/tc-sparc.c,
* config/tc-spu.c, * config/tc-tic4x.c, * config/tc-tic54x.c,
* config/tc-tic6x.c, * config/tc-tilegx.c, * config/tc-tilepro.c,
* config/tc-v850.c, * config/tc-visium.c, * config/tc-wasm32.c,
* config/tc-xc16x.c, * config/tc-xgate.c, * config/tc-xstormy16.c,
* config/tc-xtensa.c, * config/tc-z8k.c: Update throughout for
bfd section macro and function changes.
* write.c (compress_debug): Use bfd_rename_section.
gdb/
* aarch64-linux-tdep.c, * arm-tdep.c, * auto-load.c,
* coff-pe-read.c, * coffread.c, * corelow.c, * dbxread.c,
* dicos-tdep.c, * dwarf2-frame.c, * dwarf2read.c, * elfread.c,
* exec.c, * fbsd-tdep.c, * gcore.c, * gdb_bfd.c, * gdb_bfd.h,
* hppa-tdep.c, * i386-cygwin-tdep.c, * i386-fbsd-tdep.c,
* i386-linux-tdep.c, * jit.c, * linux-tdep.c, * machoread.c,
* maint.c, * mdebugread.c, * minidebug.c, * mips-linux-tdep.c,
* mips-sde-tdep.c, * mips-tdep.c, * mipsread.c, * nto-tdep.c,
* objfiles.c, * objfiles.h, * osabi.c, * ppc-linux-tdep.c,
* ppc64-tdep.c, * record-btrace.c, * record-full.c, * remote.c,
* rs6000-aix-tdep.c, * rs6000-tdep.c, * s390-linux-tdep.c,
* s390-tdep.c, * solib-aix.c, * solib-dsbt.c, * solib-frv.c,
* solib-spu.c, * solib-svr4.c, * solib-target.c,
* spu-linux-nat.c, * spu-tdep.c, * symfile-mem.c, * symfile.c,
* symmisc.c, * symtab.c, * target.c, * windows-nat.c,
* xcoffread.c, * cli/cli-dump.c, * compile/compile-object-load.c,
* mi/mi-interp.c: Update throughout for bfd section macro and
function changes.
* gcore (gcore_create_callback): Use bfd_set_section_lma.
* spu-tdep.c (spu_overlay_new_objfile): Likewise.
gprof/
* corefile.c, * symtab.c: Update throughout for bfd section
macro and function changes.
ld/
* ldcref.c, * ldctor.c, * ldelf.c, * ldlang.c, * pe-dll.c,
* emultempl/aarch64elf.em, * emultempl/aix.em,
* emultempl/armcoff.em, * emultempl/armelf.em,
* emultempl/cr16elf.em, * emultempl/cskyelf.em,
* emultempl/m68hc1xelf.em, * emultempl/m68kelf.em,
* emultempl/mipself.em, * emultempl/mmix-elfnmmo.em,
* emultempl/mmo.em, * emultempl/msp430.em,
* emultempl/nios2elf.em, * emultempl/pe.em, * emultempl/pep.em,
* emultempl/ppc64elf.em, * emultempl/xtensaelf.em: Update
throughout for bfd section macro and function changes.
libctf/
* ctf-open-bfd.c: Update throughout for bfd section macro changes.
opcodes/
* arc-ext.c: Update throughout for bfd section macro changes.
sim/
* common/sim-load.c, * common/sim-utils.c, * cris/sim-if.c,
* erc32/func.c, * lm32/sim-if.c, * m32c/load.c, * m32c/trace.c,
* m68hc11/interp.c, * ppc/hw_htab.c, * ppc/hw_init.c,
* rl78/load.c, * rl78/trace.c, * rx/gdb-if.c, * rx/load.c,
* rx/trace.c: Update throughout for bfd section macro changes.
2019-09-16 18:55:17 +08:00
|
|
|
|
const char *now_seg_name = now_seg ? bfd_section_name (now_seg) : 0;
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
|
|
|
|
if (!force_new
|
|
|
|
|
&& now_seg_name
|
|
|
|
|
&& (now_seg_name == segname
|
|
|
|
|
|| !strcmp (now_seg_name, segname)))
|
|
|
|
|
return now_seg;
|
|
|
|
|
|
|
|
|
|
if (!force_new)
|
|
|
|
|
secptr = bfd_make_section_old_way (stdoutput, segname);
|
|
|
|
|
else
|
|
|
|
|
secptr = bfd_make_section_anyway (stdoutput, segname);
|
|
|
|
|
|
2022-07-04 11:15:47 +08:00
|
|
|
|
if (!seg_info (secptr))
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
2006-05-04 07:52:15 +08:00
|
|
|
|
secptr->output_section = secptr;
|
2022-07-04 11:15:47 +08:00
|
|
|
|
alloc_seginfo (secptr);
|
1999-05-03 15:29:11 +08:00
|
|
|
|
}
|
|
|
|
|
return secptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
segT
|
2003-12-03 11:39:58 +08:00
|
|
|
|
subseg_new (const char *segname, subsegT subseg)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
|
|
|
|
segT secptr;
|
|
|
|
|
|
|
|
|
|
secptr = subseg_get (segname, 0);
|
|
|
|
|
subseg_set_rest (secptr, subseg);
|
|
|
|
|
return secptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Like subseg_new, except a new section is always created, even if
|
|
|
|
|
a section with that name already exists. */
|
|
|
|
|
segT
|
2003-12-03 11:39:58 +08:00
|
|
|
|
subseg_force_new (const char *segname, subsegT subseg)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
|
|
|
|
segT secptr;
|
|
|
|
|
|
|
|
|
|
secptr = subseg_get (segname, 1);
|
|
|
|
|
subseg_set_rest (secptr, subseg);
|
|
|
|
|
return secptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2003-12-03 11:39:58 +08:00
|
|
|
|
subseg_set (segT secptr, subsegT subseg)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
|
|
|
|
if (! (secptr == now_seg && subseg == now_subseg))
|
|
|
|
|
subseg_set_rest (secptr, subseg);
|
|
|
|
|
mri_common_symbol = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifndef obj_sec_sym_ok_for_reloc
|
|
|
|
|
#define obj_sec_sym_ok_for_reloc(SEC) 0
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
symbolS *
|
2003-12-03 11:39:58 +08:00
|
|
|
|
section_symbol (segT sec)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
|
|
|
|
segment_info_type *seginfo = seg_info (sec);
|
|
|
|
|
symbolS *s;
|
|
|
|
|
|
|
|
|
|
if (seginfo == 0)
|
|
|
|
|
abort ();
|
|
|
|
|
if (seginfo->sym)
|
|
|
|
|
return seginfo->sym;
|
|
|
|
|
|
|
|
|
|
#ifndef EMIT_SECTION_SYMBOLS
|
|
|
|
|
#define EMIT_SECTION_SYMBOLS 1
|
|
|
|
|
#endif
|
|
|
|
|
|
2002-09-05 08:01:18 +08:00
|
|
|
|
if (! EMIT_SECTION_SYMBOLS || symbol_table_frozen)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
|
|
|
|
/* Here we know it won't be going into the symbol table. */
|
2020-08-21 07:47:53 +08:00
|
|
|
|
s = symbol_create (sec->symbol->name, sec, &zero_address_frag, 0);
|
1999-05-03 15:29:11 +08:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2004-07-20 03:15:43 +08:00
|
|
|
|
segT seg;
|
2005-04-19 23:05:09 +08:00
|
|
|
|
s = symbol_find (sec->symbol->name);
|
2004-05-11 23:53:47 +08:00
|
|
|
|
/* We have to make sure it is the right symbol when we
|
|
|
|
|
have multiple sections with the same section name. */
|
2004-07-20 03:15:43 +08:00
|
|
|
|
if (s == NULL
|
|
|
|
|
|| ((seg = S_GET_SEGMENT (s)) != sec
|
|
|
|
|
&& seg != undefined_section))
|
2020-08-21 07:47:53 +08:00
|
|
|
|
s = symbol_new (sec->symbol->name, sec, &zero_address_frag, 0);
|
2004-07-20 03:15:43 +08:00
|
|
|
|
else if (seg == undefined_section)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
2004-07-20 03:15:43 +08:00
|
|
|
|
S_SET_SEGMENT (s, sec);
|
|
|
|
|
symbol_set_frag (s, &zero_address_frag);
|
1999-05-03 15:29:11 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
S_CLEAR_EXTERNAL (s);
|
|
|
|
|
|
|
|
|
|
/* Use the BFD section symbol, if possible. */
|
|
|
|
|
if (obj_sec_sym_ok_for_reloc (sec))
|
Add support for storing local symbols in a small structure to save
memory when assembling large files.
* as.h: Don't include struc-symbol.h.
(symbolS): Add typedef.
* symbols.c: Include struc-symbol.h.
(local_hash): New static variable.
(save_symbol_name): New static function, from symbol_create.
(symbol_create): Call save_symbol_name.
(local_symbol_count): New static variable.
(local_symbol_conversion_count): Likewise.
(LOCAL_SYMBOL_CHECK): Define.
(local_symbol_make): New static function.
(local_symbol_convert): New static function.
(colon): Handle local symbols. Create local symbol for local
label name.
(symbol_table_insert): Handle local symbols.
(symbol_find_or_make): Create local symbol for local label name.
(symbol_find_base): Check for local symbol.
(symbol_append, symbol_insert): Check for local symbols.
(symbol_clear_list_pointers, symbol_remove): Likewise.
(verify_symbol_chain): Likewise.
(copy_symbol_attributes): Likewise.
(resolve_symbol_value): Handle local symbols.
(resolve_local_symbol): New static function.
(resolve_local_symbol_values): New function.
(S_GET_VALUE, S_SET_VALUE): Handle local symbols.
(S_IS_FUNCTION, S_IS_EXTERNAL, S_IS_WEAK, S_IS_COMMON): Likewise.
(S_IS_DEFINED, S_IS_DEBUG, S_IS_LOCAL, S_GET_NAME): Likewise.
(S_GET_SEGMENT, S_SET_SEGMENT, S_SET_EXTERNAL): Likewise.
(S_CLEAR_EXTERNAL, S_SET_WEAK, S_SET_NAME): Likewise.
(symbol_previous, symbol_next): New functions.
(symbol_get_value_expression): Likewise.
(symbol_set_value_expression): Likewise.
(symbol_set_frag, symbol_get_frag): Likewise.
(symbol_mark_used, symbol_clear_used, symbol_used_p): Likewise.
(symbol_mark_used_in_reloc): Likewise.
(symbol_clear_used_in_reloc, symbol_used_in_reloc_p): Likewise.
(symbol_mark_mri_common, symbol_clear_mri_common): Likewise.
(symbol_mri_common_p): Likewise.
(symbol_mark_written, symbol_clear_written): Likewise.
(symbol_written_p): Likewise.
(symbol_mark_resolved, symbol_resolved_p): Likewise.
(symbol_section_p, symbol_equated_p): Likewise.
(symbol_constant_p): Likewise.
(symbol_get_bfdsym, symbol_set_bfdsym): Likewise.
(symbol_get_obj, symbol_set_obj): Likewise.
(symbol_get_tc, symbol_set_tc): Likewise.
(symbol_begin): Initialize local_hash.
(print_symbol_value_1): Handle local symbols.
(symbol_print_statistics): Print local symbol statistics.
* symbols.h: Include "struc-symbol.h" if not BFD_ASSEMBLER.
Declare new symbols.c functions. Move many declarations here from
struc-symbol.h.
(SYMBOLS_NEED_BACKPOINTERS): Define if needed.
* struc-symbol.h (SYMBOLS_NEED_BACKPOINTERS): Don't set.
(struct symbol): Move bsym to make it clearly the first field.
Remove TARGET_SYMBOL_FIELDS.
(symbolS): Don't typedef.
(struct broken_word): Remove.
(N_TYPE_seg, seg_N_TYPE): Move to symbol.h.
(SEGMENT_TO_SYMBOL_TYPE, N_REGISTER): Likewise.
(symbol_clear_list_pointers): Likewise.
(symbol_insert, symbol_remove): Likewise.
(symbol_previous, symbol_append): Likewise.
(verify_symbol_chain, verify_symbol_chain_2): Likewise.
(struct local_symbol): Define.
(local_symbol_converted_p, local_symbol_mark_converted): Define.
(local_symbol_resolved_p, local_symbol_mark_resolved): Define.
(local_symbol_get_frag, local_symbol_set_frag): Define.
(local_symbol_get_real_symbol): Define.
(local_symbol_set_real_symbol): Define.
Define.
* write.c (write_object_file): Call resolve_local_symbol_values.
* config/obj-ecoff.h (OBJ_SYMFIELD_TYPE): Define.
(TARGET_SYMBOL_FIELDS): Don't define.
* config/obj-elf.h (OBJ_SYMFIELD_TYPE): Add local field. If
ECOFF_DEBUGGING, add ECOFF fields.
(ELF_TARGET_SYMBOL_FIELDS, TARGET_SYMBOL_FIELDS): Don't define.
* config/obj-multi.h (struct elf_obj_sy): Add local field. If
ECOFF_DEBUGGING, add ECOFF fields.
(ELF_TARGET_SYMBOL_FIELDS, TARGET_SYMBOL_FIELDS): Don't define.
(ECOFF_DEBUG_TARGET_SYMBOL_FIELDS): Don't define.
* config/tc-mcore.h: Don't include struc-symbol.h.
(TARGET_SYMBOL_FIELDS): Don't define.
(struct mcore_tc_sy): Define.
(TC_SYMFIELD_TYPE): Define.
* Many files: Use symbolS instead of struct symbol. Use new
accessor functions rather than referring to symbolS fields
directly.
* read.c (s_mri_common): Don't add in value of line_label.
* config/tc-mips.c (md_apply_fix): Correct parenthesization when
checking for SEC_LINK_ONCE.
* config/tc-sh.h (sh_fix_adjustable): Declare.
1999-06-03 08:29:48 +08:00
|
|
|
|
symbol_set_bfdsym (s, sec->symbol);
|
2002-09-05 08:01:18 +08:00
|
|
|
|
else
|
|
|
|
|
symbol_get_bfdsym (s)->flags |= BSF_SECTION_SYM;
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
|
|
|
|
seginfo->sym = s;
|
|
|
|
|
return s;
|
|
|
|
|
}
|
|
|
|
|
|
1999-06-13 00:49:51 +08:00
|
|
|
|
/* Return whether the specified segment is thought to hold text. */
|
|
|
|
|
|
|
|
|
|
int
|
2003-12-03 11:39:58 +08:00
|
|
|
|
subseg_text_p (segT sec)
|
1999-06-13 00:49:51 +08:00
|
|
|
|
{
|
bfd_section_* macros
This large patch removes the unnecessary bfd parameter from various
bfd section macros and functions. The bfd is hardly ever used and if
needed for the bfd_set_section_* or bfd_rename_section functions can
be found via section->owner except for the com, und, abs, and ind
std_section special sections. Those sections shouldn't be modified
anyway.
The patch also removes various bfd_get_section_<field> macros,
replacing their use with bfd_section_<field>, and adds
bfd_set_section_lma. I've also fixed a minor bug in gas where
compressed section renaming was done directly rather than calling
bfd_rename_section. This would have broken bfd_get_section_by_name
and similar functions, but that hardly mattered at such a late stage
in gas processing.
bfd/
* bfd-in.h (bfd_get_section_name, bfd_get_section_vma),
(bfd_get_section_lma, bfd_get_section_alignment),
(bfd_get_section_size, bfd_get_section_flags),
(bfd_get_section_userdata): Delete.
(bfd_section_name, bfd_section_size, bfd_section_vma),
(bfd_section_lma, bfd_section_alignment): Lose bfd parameter.
(bfd_section_flags, bfd_section_userdata): New.
(bfd_is_com_section): Rename parameter.
* section.c (bfd_set_section_userdata, bfd_set_section_vma),
(bfd_set_section_alignment, bfd_set_section_flags, bfd_rename_section),
(bfd_set_section_size): Delete bfd parameter, rename section parameter.
(bfd_set_section_lma): New.
* bfd-in2.h: Regenerate.
* mach-o.c (bfd_mach_o_init_section_from_mach_o): Delete bfd param,
update callers.
* aoutx.h, * bfd.c, * coff-alpha.c, * coff-arm.c, * coff-mips.c,
* coff64-rs6000.c, * coffcode.h, * coffgen.c, * cofflink.c,
* compress.c, * ecoff.c, * elf-eh-frame.c, * elf-hppa.h,
* elf-ifunc.c, * elf-m10200.c, * elf-m10300.c, * elf-properties.c,
* elf-s390-common.c, * elf-vxworks.c, * elf.c, * elf32-arc.c,
* elf32-arm.c, * elf32-avr.c, * elf32-bfin.c, * elf32-cr16.c,
* elf32-cr16c.c, * elf32-cris.c, * elf32-crx.c, * elf32-csky.c,
* elf32-d10v.c, * elf32-epiphany.c, * elf32-fr30.c, * elf32-frv.c,
* elf32-ft32.c, * elf32-h8300.c, * elf32-hppa.c, * elf32-i386.c,
* elf32-ip2k.c, * elf32-iq2000.c, * elf32-lm32.c, * elf32-m32c.c,
* elf32-m32r.c, * elf32-m68hc1x.c, * elf32-m68k.c, * elf32-mcore.c,
* elf32-mep.c, * elf32-metag.c, * elf32-microblaze.c,
* elf32-moxie.c, * elf32-msp430.c, * elf32-mt.c, * elf32-nds32.c,
* elf32-nios2.c, * elf32-or1k.c, * elf32-ppc.c, * elf32-pru.c,
* elf32-rl78.c, * elf32-rx.c, * elf32-s390.c, * elf32-score.c,
* elf32-score7.c, * elf32-sh.c, * elf32-spu.c, * elf32-tic6x.c,
* elf32-tilepro.c, * elf32-v850.c, * elf32-vax.c, * elf32-visium.c,
* elf32-xstormy16.c, * elf32-xtensa.c, * elf64-alpha.c,
* elf64-bpf.c, * elf64-hppa.c, * elf64-ia64-vms.c, * elf64-mmix.c,
* elf64-ppc.c, * elf64-s390.c, * elf64-sparc.c, * elf64-x86-64.c,
* elflink.c, * elfnn-aarch64.c, * elfnn-ia64.c, * elfnn-riscv.c,
* elfxx-aarch64.c, * elfxx-mips.c, * elfxx-sparc.c,
* elfxx-tilegx.c, * elfxx-x86.c, * i386msdos.c, * linker.c,
* mach-o.c, * mmo.c, * opncls.c, * pdp11.c, * pei-x86_64.c,
* peicode.h, * reloc.c, * section.c, * syms.c, * vms-alpha.c,
* xcofflink.c: Update throughout for bfd section macro and function
changes.
binutils/
* addr2line.c, * bucomm.c, * coffgrok.c, * dlltool.c, * nm.c,
* objcopy.c, * objdump.c, * od-elf32_avr.c, * od-macho.c,
* od-xcoff.c, * prdbg.c, * rdcoff.c, * rddbg.c, * rescoff.c,
* resres.c, * size.c, * srconv.c, * strings.c, * windmc.c: Update
throughout for bfd section macro and function changes.
gas/
* as.c, * as.h, * dw2gencfi.c, * dwarf2dbg.c, * ecoff.c,
* read.c, * stabs.c, * subsegs.c, * subsegs.h, * write.c,
* config/obj-coff-seh.c, * config/obj-coff.c, * config/obj-ecoff.c,
* config/obj-elf.c, * config/obj-macho.c, * config/obj-som.c,
* config/tc-aarch64.c, * config/tc-alpha.c, * config/tc-arc.c,
* config/tc-arm.c, * config/tc-avr.c, * config/tc-bfin.c,
* config/tc-bpf.c, * config/tc-d10v.c, * config/tc-d30v.c,
* config/tc-epiphany.c, * config/tc-fr30.c, * config/tc-frv.c,
* config/tc-h8300.c, * config/tc-hppa.c, * config/tc-i386.c,
* config/tc-ia64.c, * config/tc-ip2k.c, * config/tc-iq2000.c,
* config/tc-lm32.c, * config/tc-m32c.c, * config/tc-m32r.c,
* config/tc-m68hc11.c, * config/tc-mep.c, * config/tc-microblaze.c,
* config/tc-mips.c, * config/tc-mmix.c, * config/tc-mn10200.c,
* config/tc-mn10300.c, * config/tc-msp430.c, * config/tc-mt.c,
* config/tc-nds32.c, * config/tc-or1k.c, * config/tc-ppc.c,
* config/tc-pru.c, * config/tc-rl78.c, * config/tc-rx.c,
* config/tc-s12z.c, * config/tc-s390.c, * config/tc-score.c,
* config/tc-score7.c, * config/tc-sh.c, * config/tc-sparc.c,
* config/tc-spu.c, * config/tc-tic4x.c, * config/tc-tic54x.c,
* config/tc-tic6x.c, * config/tc-tilegx.c, * config/tc-tilepro.c,
* config/tc-v850.c, * config/tc-visium.c, * config/tc-wasm32.c,
* config/tc-xc16x.c, * config/tc-xgate.c, * config/tc-xstormy16.c,
* config/tc-xtensa.c, * config/tc-z8k.c: Update throughout for
bfd section macro and function changes.
* write.c (compress_debug): Use bfd_rename_section.
gdb/
* aarch64-linux-tdep.c, * arm-tdep.c, * auto-load.c,
* coff-pe-read.c, * coffread.c, * corelow.c, * dbxread.c,
* dicos-tdep.c, * dwarf2-frame.c, * dwarf2read.c, * elfread.c,
* exec.c, * fbsd-tdep.c, * gcore.c, * gdb_bfd.c, * gdb_bfd.h,
* hppa-tdep.c, * i386-cygwin-tdep.c, * i386-fbsd-tdep.c,
* i386-linux-tdep.c, * jit.c, * linux-tdep.c, * machoread.c,
* maint.c, * mdebugread.c, * minidebug.c, * mips-linux-tdep.c,
* mips-sde-tdep.c, * mips-tdep.c, * mipsread.c, * nto-tdep.c,
* objfiles.c, * objfiles.h, * osabi.c, * ppc-linux-tdep.c,
* ppc64-tdep.c, * record-btrace.c, * record-full.c, * remote.c,
* rs6000-aix-tdep.c, * rs6000-tdep.c, * s390-linux-tdep.c,
* s390-tdep.c, * solib-aix.c, * solib-dsbt.c, * solib-frv.c,
* solib-spu.c, * solib-svr4.c, * solib-target.c,
* spu-linux-nat.c, * spu-tdep.c, * symfile-mem.c, * symfile.c,
* symmisc.c, * symtab.c, * target.c, * windows-nat.c,
* xcoffread.c, * cli/cli-dump.c, * compile/compile-object-load.c,
* mi/mi-interp.c: Update throughout for bfd section macro and
function changes.
* gcore (gcore_create_callback): Use bfd_set_section_lma.
* spu-tdep.c (spu_overlay_new_objfile): Likewise.
gprof/
* corefile.c, * symtab.c: Update throughout for bfd section
macro and function changes.
ld/
* ldcref.c, * ldctor.c, * ldelf.c, * ldlang.c, * pe-dll.c,
* emultempl/aarch64elf.em, * emultempl/aix.em,
* emultempl/armcoff.em, * emultempl/armelf.em,
* emultempl/cr16elf.em, * emultempl/cskyelf.em,
* emultempl/m68hc1xelf.em, * emultempl/m68kelf.em,
* emultempl/mipself.em, * emultempl/mmix-elfnmmo.em,
* emultempl/mmo.em, * emultempl/msp430.em,
* emultempl/nios2elf.em, * emultempl/pe.em, * emultempl/pep.em,
* emultempl/ppc64elf.em, * emultempl/xtensaelf.em: Update
throughout for bfd section macro and function changes.
libctf/
* ctf-open-bfd.c: Update throughout for bfd section macro changes.
opcodes/
* arc-ext.c: Update throughout for bfd section macro changes.
sim/
* common/sim-load.c, * common/sim-utils.c, * cris/sim-if.c,
* erc32/func.c, * lm32/sim-if.c, * m32c/load.c, * m32c/trace.c,
* m68hc11/interp.c, * ppc/hw_htab.c, * ppc/hw_init.c,
* rl78/load.c, * rl78/trace.c, * rx/gdb-if.c, * rx/load.c,
* rx/trace.c: Update throughout for bfd section macro changes.
2019-09-16 18:55:17 +08:00
|
|
|
|
return (bfd_section_flags (sec) & SEC_CODE) != 0;
|
1999-06-13 00:49:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
2005-01-28 00:33:47 +08:00
|
|
|
|
/* Return non zero if SEC has at least one byte of data. It is
|
|
|
|
|
possible that we'll return zero even on a non-empty section because
|
|
|
|
|
we don't know all the fragment types, and it is possible that an
|
|
|
|
|
fr_fix == 0 one still contributes data. Think of this as
|
|
|
|
|
seg_definitely_not_empty_p. */
|
|
|
|
|
|
2005-02-08 01:53:26 +08:00
|
|
|
|
int
|
2005-02-17 21:46:05 +08:00
|
|
|
|
seg_not_empty_p (segT sec ATTRIBUTE_UNUSED)
|
2005-01-28 00:33:47 +08:00
|
|
|
|
{
|
|
|
|
|
segment_info_type *seginfo = seg_info (sec);
|
|
|
|
|
frchainS *chain;
|
|
|
|
|
fragS *frag;
|
|
|
|
|
|
|
|
|
|
if (!seginfo)
|
|
|
|
|
return 0;
|
2013-01-11 03:51:55 +08:00
|
|
|
|
|
2005-01-28 00:33:47 +08:00
|
|
|
|
for (chain = seginfo->frchainP; chain; chain = chain->frch_next)
|
|
|
|
|
{
|
|
|
|
|
for (frag = chain->frch_root; frag; frag = frag->fr_next)
|
|
|
|
|
if (frag->fr_fix)
|
|
|
|
|
return 1;
|
|
|
|
|
if (obstack_next_free (&chain->frch_obstack)
|
|
|
|
|
!= chain->frch_last->fr_literal)
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
1999-05-03 15:29:11 +08:00
|
|
|
|
void
|
2003-12-03 11:39:58 +08:00
|
|
|
|
subsegs_print_statistics (FILE *file)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
|
|
|
|
frchainS *frchp;
|
2006-05-04 07:52:15 +08:00
|
|
|
|
asection *s;
|
|
|
|
|
|
2016-12-01 23:02:45 +08:00
|
|
|
|
/* PR 20897 - check to see if the output bfd was actually created. */
|
|
|
|
|
if (stdoutput == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
1999-05-03 15:29:11 +08:00
|
|
|
|
fprintf (file, "frag chains:\n");
|
2006-05-04 07:52:15 +08:00
|
|
|
|
for (s = stdoutput->sections; s; s = s->next)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
2006-05-04 07:52:15 +08:00
|
|
|
|
segment_info_type *seginfo;
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
2006-05-04 07:52:15 +08:00
|
|
|
|
/* Skip gas-internal sections. */
|
|
|
|
|
if (segment_name (s)[0] == '*')
|
1999-05-03 15:29:11 +08:00
|
|
|
|
continue;
|
|
|
|
|
|
2006-05-04 07:52:15 +08:00
|
|
|
|
seginfo = seg_info (s);
|
|
|
|
|
if (!seginfo)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
continue;
|
|
|
|
|
|
2006-05-04 07:52:15 +08:00
|
|
|
|
for (frchp = seginfo->frchainP; frchp; frchp = frchp->frch_next)
|
1999-05-03 15:29:11 +08:00
|
|
|
|
{
|
2006-05-04 07:52:15 +08:00
|
|
|
|
int count = 0;
|
|
|
|
|
fragS *fragp;
|
|
|
|
|
|
|
|
|
|
for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
|
|
|
|
|
count++;
|
|
|
|
|
|
|
|
|
|
fprintf (file, "\n");
|
|
|
|
|
fprintf (file, "\t%p %-10s\t%10d frags\n", (void *) frchp,
|
|
|
|
|
segment_name (s), count);
|
1999-05-03 15:29:11 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* end of subsegs.c */
|