Files
binutils-gdb/gas/config/tc-alpha.h
Alan Modra 5e5f37ed00 Reduce rs_align_code memory for small alignments
On x86, MAX_MEM_FOR_RS_ALIGN_CODE is 35, when the most common
alignment is 2**3 or 2**4, where the max memory required for the
alignment nops is 7 and 15 bytes respectively.  So there is some
memory wasted since commit 83d94ae428.  It's not a large amount,
especially considering that frag overhead on x86_46 is 144 bytes,
but even so I'd rather not be blamed for increasing gas memory usage.

So to reduce the memory we'd like to take the alignment into
consideration when initialising an rs_align_code frag.  The only
difficulty here is start_bundle making an rs_align_code frag with an
alignment of zero initially, then later increasing the alignment.  We
change that to use the bundle alignment when setting up the frag.  I
think that is sufficient as bundle_align_p2 can't change in the middle
of a start_bundle/finish_bundle sequence.

I haven't modified any targets other than x86 in this patch.  Most
won't benefit much due to using fairly small MAX_MEM_FOR_RS_ALIGN_CODE.

	* read.c (start_bundle): Create rs_align_code frag with
	bundle_align_p2 alignment, then set to zero alignment.
	(finish_bundle): Adjust comment.
	* frags.c (MAX_MEM_FOR_RS_ALIGN_CODE): Pass p2align and max
	to macro.
	* config/tc-i386.h (HANDLE_ALIGN): Assert that max_bytes is
	sufficient for nop padding.
	(max_mem_for_rs_align_code): New inline function.
	(MAX_MEM_FOR_RS_ALIGN_CODE): Use it.
	* config/tc-aarch64.h: Adjust MAX_MEM_FOR_RS_ALIGN_CODE.
	* config/tc-alpha.h: Likewise.
	* config/tc-arc.h: Likewise.
	* config/tc-arm.h: Likewise.
	* config/tc-epiphany.h: Likewise.
	* config/tc-frv.h: Likewise.
	* config/tc-ia64.h: Likewise.
	* config/tc-kvx.h: Likewise.
	* config/tc-loongarch.h: Likewise.
	* config/tc-m32r.h: Likewise.
	* config/tc-metag.h: Likewise.
	* config/tc-mips.h: Likewise.
	* config/tc-nds32.h: Likewise.
	* config/tc-ppc.h: Likewise.
	* config/tc-riscv.h: Likewise.
	* config/tc-rl78.h: Likewise.
	* config/tc-rx.h: Likewise.
	* config/tc-score.h: Likewise.
	* config/tc-sh.h: Likewise.
	* config/tc-sparc.h: Likewise.
	* config/tc-spu.h: Likewise.
	* config/tc-tilegx.h: Likewise.
	* config/tc-tilepro.h: Likewise.
	* config/tc-visium.h: Likewise.
	* config/tc-xtensa.h: Likewise.
2025-05-30 10:16:19 +09:30

192 lines
5.8 KiB
C

/* This file is tc-alpha.h
Copyright (C) 1994-2025 Free Software Foundation, Inc.
Written by Ken Raeburn <raeburn@cygnus.com>.
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. */
#define TC_ALPHA
#define TARGET_BYTES_BIG_ENDIAN 0
#define WORKING_DOT_WORD
#define TARGET_ARCH bfd_arch_alpha
#ifdef TE_FreeBSD
#define ELF_TARGET_FORMAT "elf64-alpha-freebsd"
#endif
#ifndef ELF_TARGET_FORMAT
#define ELF_TARGET_FORMAT "elf64-alpha"
#endif
#define TARGET_FORMAT (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
? "ecoff-littlealpha" \
: OUTPUT_FLAVOR == bfd_target_elf_flavour \
? ELF_TARGET_FORMAT \
: OUTPUT_FLAVOR == bfd_target_evax_flavour \
? "vms-alpha" \
: "unknown-format")
#define NEED_LITERAL_POOL
#define REPEAT_CONS_EXPRESSIONS
struct fix;
struct alpha_reloc_tag;
extern int alpha_force_relocation (struct fix *);
extern int alpha_fix_adjustable (struct fix *);
extern unsigned long alpha_gprmask, alpha_fprmask;
extern valueT alpha_gp_value;
#define TC_FORCE_RELOCATION(FIX) alpha_force_relocation (FIX)
#define tc_fix_adjustable(FIX) alpha_fix_adjustable (FIX)
#define RELOC_REQUIRES_SYMBOL
/* Values passed to md_apply_fix don't include the symbol value. */
#define MD_APPLY_SYM_VALUE(FIX) 0
#define md_convert_frag(b,s,f) as_fatal ("alpha convert_frag\n")
#define md_estimate_size_before_relax(f,s) \
(as_fatal ("estimate_size_before_relax called"),1)
#define md_operand(x)
#ifdef OBJ_EVAX
#define TC_VALIDATE_FIX_SUB(FIX, SEG) 1
#define tc_canonicalize_symbol_name evax_shorten_name
#define TC_CONS_FIX_NEW(FRAG,OFF,LEN,EXP,RELOC) \
(void) RELOC, \
fix_new_exp (FRAG, OFF, (int)LEN, EXP, 0, \
LEN == 2 ? BFD_RELOC_16 \
: LEN == 4 ? BFD_RELOC_32 \
: LEN == 8 ? BFD_RELOC_64 \
: BFD_RELOC_ALPHA_LINKAGE);
#endif
#ifdef OBJ_EVAX
#define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR) (P2VAR) = 3
#else
#define TC_IMPLICIT_LCOMM_ALIGNMENT(size, align) \
do \
{ \
align = 0; \
if (size > 1) \
{ \
addressT temp = 1; \
while ((size & temp) == 0) \
++align, temp <<= 1; \
} \
} \
while (0)
#endif
#define md_number_to_chars number_to_chars_littleendian
extern int tc_get_register (int);
extern void alpha_frob_ecoff_data (void);
#define tc_frob_label(sym) alpha_define_label (sym)
extern void alpha_define_label (symbolS *);
#define md_cons_align(nbytes) alpha_cons_align (nbytes)
extern void alpha_cons_align (int);
#define HANDLE_ALIGN(sec, fragp) alpha_handle_align (fragp)
extern void alpha_handle_align (struct frag *);
#define MAX_MEM_FOR_RS_ALIGN_CODE(p2align, max) (3 + 4 + 8)
#ifdef OBJ_ECOFF
#define tc_frob_file_before_adjust() alpha_frob_file_before_adjust ()
extern void alpha_frob_file_before_adjust (void);
#define TC_VALIDATE_FIX_SUB(FIX, SEG) \
((md_register_arithmetic || (SEG) != reg_section) \
&& ((FIX)->fx_r_type == BFD_RELOC_GPREL32 \
|| (FIX)->fx_r_type == BFD_RELOC_GPREL16))
#endif
#define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs. */
#ifdef OBJ_ELF
#define md_elf_section_letter alpha_elf_section_letter
extern bfd_vma alpha_elf_section_letter (int, const char **);
#define md_elf_section_flags alpha_elf_section_flags
extern flagword alpha_elf_section_flags (flagword, bfd_vma, int);
#endif
/* Whether to add support for explicit !relocation_op!sequence_number. At the
moment, only do this for ELF, though ECOFF could use it as well. */
#ifdef OBJ_ELF
#define RELOC_OP_P
#endif
#ifndef OBJ_EVAX
/* Before the relocations are written, reorder them, so that user
supplied !lituse relocations follow the appropriate !literal
relocations. Also convert the gas-internal relocations to the
appropriate linker relocations. */
#define tc_frob_file_before_fix() alpha_before_fix ()
extern void alpha_before_fix (void);
#endif
#ifdef OBJ_ELF
#define md_finish alpha_elf_md_finish
extern void alpha_elf_md_finish (void);
#endif
/* New fields for supporting explicit relocations (such as !literal to mark
where a pointer is loaded from the global table, and !lituse_base to track
all of the normal uses of that pointer). */
#define TC_FIX_TYPE struct alpha_fix_tag
struct alpha_fix_tag
{
struct fix *next_reloc; /* Next !lituse or !gpdisp. */
struct alpha_reloc_tag *info; /* Other members with same sequence. */
};
/* Initialize the TC_FIX_TYPE field. */
#define TC_INIT_FIX_DATA(FIX) \
do { \
FIX->tc_fix_data.next_reloc = NULL; \
FIX->tc_fix_data.info = NULL; \
} while (0)
/* Work with DEBUG5 to print fields in tc_fix_type. */
#define TC_FIX_DATA_PRINT(STREAM, FIX) \
do { \
if (FIX->tc_fix_data.info) \
fprintf (STREAM, "\tinfo = 0x%lx, next_reloc = 0x%lx\n", \
(long) FIX->tc_fix_data.info, \
(long) FIX->tc_fix_data.next_reloc); \
} while (0)
#define TARGET_USE_CFIPOP 1
#define tc_cfi_frame_initial_instructions alpha_cfi_frame_initial_instructions
extern void alpha_cfi_frame_initial_instructions (void);
#define DWARF2_LINE_MIN_INSN_LENGTH 4
#define DWARF2_DEFAULT_RETURN_COLUMN 26
#define DWARF2_CIE_DATA_ALIGNMENT (-8)