mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-11-16 12:34:43 +00:00
avr, kvx, metag, mn10300, nds32, v850, visium, and wasm32 targets defined HANDLE_ALIGN without defining MAX_MEM_FOR_RS_ALIGN_CODE. This can result in a rather large chunk of memory being allocated. Fix that by a combination of changing the default allocation to one byte and/or defining a target MAX_MEM_FOR_RS_ALIGN_CODE. arm wanted to write out the entire set of nops, and limited allowed code alignment to 64 bytes to prevent large memory allocations. Fix that by making use of the fact that rs_align_code frags repeat fr_var bytes at fr_literal + fr_fix to fill out the required area. Fix metag, nds32 and kvx too, which it seems copied either arm or x86 in similarly not making use of repeating patterns. It's worth mentioning that my tidy to kvx changed the order of nop bundles, placing a short bundle first rather than last. epiphany was totally broken in that uninitialised data was written out for any alignment requiring more than three bytes of fill. ppc created a new frag to handle a branch over a large number of nops. This saves 4 bytes per rs_align_code frag, and most times the branch isn't used so it is generally a win for memory usage, but I figured the extra code complexity wasn't worth it. So that code of mine goes. visium copied the same scheme, so that goes too. This leaves x86 as the only target making large allocations for alignment frags. * frags.c (MAX_MEM_FOR_RS_ALIGN_CODE): Default to 1. * config/tc-aarch64.c (aarch64_handle_align): Remove always true condition. * config/tc-aarch64.h (MAX_MEM_FOR_RS_ALIGN_CODE): Move to be adjacent to HANDLE_ALIGN define. * config/tc-arm.c (arm_handle_align): Allow alignment of more than MAX_MEM_FOR_RS_ALIGN_CODE bytes. Just write one repeat of nop pattern to frag. (arm_frag_align_code): Delete function. * config/tc-arm.h (MAX_MEM_ALIGNMENT_BYTES): Don't define. (MAX_MEM_FOR_RS_ALIGN_CODE): Set to 7. (md_do_align): Don't define. (arm_frag_align_code): Don't declare. * config/tc-epiphany.c (epiphany_handle_align): Correct frag so that nop_pattern repeats rather than random data. * config/tc-epiphany.h (MAX_MEM_FOR_RS_ALIGN_CODE): Define. * config/tc-kvx.c (kvx_make_nops): Merge into.. (kvx_handle_align): ..here. Put short nop bundle first, followed by repeated full nop bundle. * config/tc-kvx.h (MAX_MEM_FOR_RS_ALIGN_CODE): Define. * config/tc-m32c.h (HANDLE_ALIGN, MAX_MEM_FOR_RS_ALIGN_CODE): Don't define. * config/tc-metag.c (metag_handle_align): Just write one repeat of nop pattern to frag. * config/tc-metag.h (MAX_MEM_FOR_RS_ALIGN_CODE): Define. * config/tc-nds32.c (nds32_handle_align): Just write one repeat of nop pattern to frag. * config/tc-nds32.h (MAX_MEM_FOR_RS_ALIGN_CODE): Define. * config/tc-ppc.c (ppc_handle_align): Don't make a new frag for branch. * config/tc-ppc.h (MAX_MEM_FOR_RS_ALIGN_CODE): Increase to 8. * config/tc-visium.c (visium_handle_align): Don't make a new frag for branch. * config/tc-visium.h (MAX_MEM_FOR_RS_ALIGN_CODE): Define. * config/tc-wasm32.h (HANDLE_ALIGN): Don't define. * testsuite/gas/epiphany/nop.d, * testsuite/gas/epiphany/nop.s: New test. * testsuite/gas/epiphany/allinsn.exp: Run it. * testsuite/gas/kvx/nop-align.d: Adjust.
82 lines
2.9 KiB
C
82 lines
2.9 KiB
C
/* tc-m32c.h -- Header file for tc-m32c.c.
|
|
Copyright (C) 2004-2025 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 this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
MA 02110-1301, USA. */
|
|
|
|
#define TC_M32C
|
|
|
|
#define LISTING_HEADER "M16C/M32C GAS "
|
|
|
|
/* The target BFD architecture. */
|
|
#define TARGET_ARCH bfd_arch_m32c
|
|
|
|
#define TARGET_FORMAT "elf32-m32c"
|
|
|
|
#define TARGET_BYTES_BIG_ENDIAN 0
|
|
|
|
#define md_start_line_hook m32c_start_line_hook
|
|
extern void m32c_start_line_hook (void);
|
|
|
|
/* Permit temporary numeric labels. */
|
|
#define LOCAL_LABELS_FB 1
|
|
|
|
#define DIFF_EXPR_OK /* .-foo gets turned into PC relative relocs */
|
|
|
|
/* We don't need to handle .word strangely. */
|
|
#define WORKING_DOT_WORD
|
|
|
|
#define md_apply_fix m32c_apply_fix
|
|
extern void m32c_apply_fix (struct fix *, valueT *, segT);
|
|
|
|
#define tc_fix_adjustable(fixP) m32c_fix_adjustable (fixP)
|
|
extern bool m32c_fix_adjustable (struct fix *);
|
|
|
|
/* When relaxing, we need to emit various relocs we otherwise wouldn't. */
|
|
#define TC_FORCE_RELOCATION(fix) m32c_force_relocation (fix)
|
|
extern int m32c_force_relocation (struct fix *);
|
|
|
|
#define TC_CONS_FIX_NEW(FRAG, WHERE, NBYTES, EXP, RELOC) \
|
|
m32c_cons_fix_new (FRAG, WHERE, NBYTES, EXP, RELOC)
|
|
extern void m32c_cons_fix_new (fragS *, int, int, expressionS *,
|
|
bfd_reloc_code_real_type);
|
|
|
|
extern const struct relax_type md_relax_table[];
|
|
#define TC_GENERIC_RELAX_TABLE md_relax_table
|
|
|
|
extern void m32c_prepare_relax_scan (fragS *, offsetT *, relax_substateT);
|
|
#define md_prepare_relax_scan(FRAGP, ADDR, AIM, STATE, TYPE) \
|
|
m32c_prepare_relax_scan(FRAGP, &AIM, STATE)
|
|
|
|
/* Values passed to md_apply_fix don't include the symbol value. */
|
|
#define MD_APPLY_SYM_VALUE(FIX) 0
|
|
|
|
/* Call md_pcrel_from_section(), not md_pcrel_from(). */
|
|
#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section (FIXP, SEC)
|
|
|
|
/* We need a special version of the TC_START_LABEL macro so that we
|
|
allow the :Z, :S, :Q and :G suffixes to be
|
|
parsed as such. We need to be able to change the contents of the
|
|
var storing what was at the NUL delimiter. */
|
|
#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \
|
|
(NEXT_CHAR == ':' && !m32c_is_colon_insn (STR, &NUL_CHAR))
|
|
extern int m32c_is_colon_insn (char *, char *);
|
|
|
|
#define H_TICK_HEX 1
|
|
|
|
#define NOP_OPCODE (bfd_get_mach (stdoutput) == bfd_mach_m32c ? 0xde : 0x04)
|