gas HANDLE_ALIGN and frag_alloc
Alan Modra
amodra@gmail.com
Thu Jan 16 09:28:47 GMT 2025
This adds the section to HANDLE_ALIGN args, so that the frag created
by the ppc backend can be properly allocated on the frag obstack.
I've added an extra param to frag_alloc too, for cases where we know
the frag requires at least some bytes in fr_literal. This simplifies
some existing code, for example in compress_debug and relax_segment.
In the case of the relax_segment code, I think we may have had a bug
there in using obstack_blank_fast, which doesn't check that the frag
has room.
* config/tc-ppc.c (ppc_handle_align): Add section param,
use frag obstack to allocate frag.
* config/tc-ppc.h (HANDLE_ALIGN, ppc_handle_align): Add extra
param.
* config/tc-aarch64.h (HANDLE_ALIGN): Add extra param.
* config/tc-alpha.h: Likewise.
* config/tc-arc.h: Likewise.
* config/tc-arm.h: Likewise.
* config/tc-avr.h: Likewise.
* config/tc-epiphany.h: Likewise.
* config/tc-frv.h: Likewise.
* config/tc-i386.h: Likewise.
* config/tc-ia64.h: Likewise.
* config/tc-kvx.h: Likewise.
* config/tc-loongarch.h: Likewise.
* config/tc-m32c.h: Likewise.
* config/tc-m32r.h: Likewise.
* config/tc-metag.h: Likewise.
* config/tc-mips.h: Likewise.
* config/tc-mn10300.h: Likewise.
* config/tc-nds32.h: Likewise.
* config/tc-riscv.h: Likewise.
* config/tc-rl78.h: Likewise.
* config/tc-rx.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-v850.h: Likewise.
* config/tc-visium.h: Likewise.
* config/tc-wasm32.h: Likewise.
* config/tc-xtensa.h: Likewise.
* frags.h (frag_alloc): Update prototype.
* frags.c (frag_alloc): Add extra size param, allocate extra.
(frag_new): Update.
* subsegs.c (subseg_set_rest): Update frag_alloc call.
* write.c: Formatting.
(cvt_frag_to_fill): Pass sec to HANDLE_ALIGN.
(compress_frag): Update frag_alloc call.
(compress_debug): Use new frag_alloc to simplify frag sizing.
(relax_segment): Likewise.
diff --git a/gas/config/tc-aarch64.h b/gas/config/tc-aarch64.h
index 52381e31b24..acf1ce4aa03 100644
--- a/gas/config/tc-aarch64.h
+++ b/gas/config/tc-aarch64.h
@@ -182,7 +182,7 @@ struct aarch64_frag_type
#define TC_FRAG_TYPE struct aarch64_frag_type
#define TC_FRAG_INIT(fragp, max_bytes) aarch64_init_frag (fragp, max_bytes)
-#define HANDLE_ALIGN(fragp) aarch64_handle_align (fragp)
+#define HANDLE_ALIGN(sec, fragp) aarch64_handle_align (fragp)
#define md_do_align(N, FILL, LEN, MAX, LABEL) \
if (FILL == NULL && (N) != 0 && ! need_pass_2 && subseg_text_p (now_seg)) \
diff --git a/gas/config/tc-alpha.h b/gas/config/tc-alpha.h
index 6937ba0b0ff..466a7a0d9ac 100644
--- a/gas/config/tc-alpha.h
+++ b/gas/config/tc-alpha.h
@@ -108,7 +108,7 @@ extern void alpha_define_label (symbolS *);
#define md_cons_align(nbytes) alpha_cons_align (nbytes)
extern void alpha_cons_align (int);
-#define HANDLE_ALIGN(fragp) alpha_handle_align (fragp)
+#define HANDLE_ALIGN(sec, fragp) alpha_handle_align (fragp)
extern void alpha_handle_align (struct frag *);
#define MAX_MEM_FOR_RS_ALIGN_CODE (3 + 4 + 8)
diff --git a/gas/config/tc-arc.h b/gas/config/tc-arc.h
index 93a1e8d52e8..727041a7169 100644
--- a/gas/config/tc-arc.h
+++ b/gas/config/tc-arc.h
@@ -111,7 +111,7 @@ extern const char *arc_target_format;
/* HANDLE_ALIGN called after all the assembly has been done,
so we can fill in all the rs_align_code type frags with
nop instructions. */
-#define HANDLE_ALIGN(FRAGP) arc_handle_align (FRAGP)
+#define HANDLE_ALIGN(SEC, FRAGP) arc_handle_align (FRAGP)
/* Values passed to md_apply_fix3 don't include the symbol value. */
#define MD_APPLY_SYM_VALUE(FIX) 0
diff --git a/gas/config/tc-arm.h b/gas/config/tc-arm.h
index 8274632b9bd..24e2197d7e0 100644
--- a/gas/config/tc-arm.h
+++ b/gas/config/tc-arm.h
@@ -230,7 +230,7 @@ arm_min (int am_p1, int am_p2)
#define TC_FRAG_TYPE struct arm_frag_type
#define TC_FRAG_INIT(fragp, max_bytes) arm_init_frag (fragp, max_bytes)
#define TC_ALIGN_ZERO_IS_DEFAULT 1
-#define HANDLE_ALIGN(fragp) arm_handle_align (fragp)
+#define HANDLE_ALIGN(sec, fragp) arm_handle_align (fragp)
/* PR gas/19276: COFF/PE segment alignment is already handled in coff_frob_section(). */
#ifndef TE_PE
#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) \
diff --git a/gas/config/tc-avr.h b/gas/config/tc-avr.h
index 8e1b7b3d47e..47f6778df73 100644
--- a/gas/config/tc-avr.h
+++ b/gas/config/tc-avr.h
@@ -228,7 +228,7 @@ extern symbolS* avr_undefined_symbol (char*);
#define md_post_relax_hook avr_post_relax_hook ()
extern void avr_post_relax_hook (void);
-#define HANDLE_ALIGN(fragP) avr_handle_align (fragP)
+#define HANDLE_ALIGN(sec, fragP) avr_handle_align (fragP)
extern void avr_handle_align (fragS *);
struct avr_frag_data
diff --git a/gas/config/tc-epiphany.h b/gas/config/tc-epiphany.h
index 63e5d527fa2..dde673305f4 100644
--- a/gas/config/tc-epiphany.h
+++ b/gas/config/tc-epiphany.h
@@ -72,7 +72,7 @@ extern void epiphany_cgen_md_operand (expressionS *);
epiphany_cgen_parse_fix_exp (opinfo, exp)
extern int epiphany_cgen_parse_fix_exp (int, expressionS *);
-#define HANDLE_ALIGN(f) epiphany_handle_align (f)
+#define HANDLE_ALIGN(s, f) epiphany_handle_align (f)
extern void epiphany_handle_align (fragS *);
#define TARGET_FORMAT "elf32-epiphany"
diff --git a/gas/config/tc-frv.h b/gas/config/tc-frv.h
index 9f86a2a5807..21e3bac1095 100644
--- a/gas/config/tc-frv.h
+++ b/gas/config/tc-frv.h
@@ -99,7 +99,7 @@ extern void frv_frob_file (void);
for little gain. This code is not meant to be run anyway, so just
emit nops. */
#define MAX_MEM_FOR_RS_ALIGN_CODE (3 + 4)
-#define HANDLE_ALIGN(FRAGP) do \
+#define HANDLE_ALIGN(SEC, FRAGP) do \
if ((FRAGP)->fr_type == rs_align_code) \
{ \
valueT count = ((FRAGP)->fr_next->fr_address \
diff --git a/gas/config/tc-i386.h b/gas/config/tc-i386.h
index 78de263b326..d93de2c7985 100644
--- a/gas/config/tc-i386.h
+++ b/gas/config/tc-i386.h
@@ -374,7 +374,7 @@ extern void i386_generate_nops (fragS *, char *, offsetT, int);
#define md_generate_nops(frag, where, amount, control) \
i386_generate_nops ((frag), (where), (amount), (control))
-#define HANDLE_ALIGN(fragP) \
+#define HANDLE_ALIGN(sec, fragP) \
if (fragP->fr_type == rs_align_code) \
{ \
offsetT __count = (fragP->fr_next->fr_address \
diff --git a/gas/config/tc-ia64.h b/gas/config/tc-ia64.h
index 5ab7823ec85..0f9810d5fd6 100644
--- a/gas/config/tc-ia64.h
+++ b/gas/config/tc-ia64.h
@@ -154,7 +154,7 @@ extern void ia64_convert_frag (fragS *);
#define MD_PCREL_FROM_SECTION(fix,sec) ia64_pcrel_from_section (fix, sec)
#define md_section_align(seg,size) (size)
#define md_do_align(n,f,l,m,j) ia64_md_do_align (n,f,l,m)
-#define HANDLE_ALIGN(f) ia64_handle_align (f)
+#define HANDLE_ALIGN(s, f) ia64_handle_align (f)
#define md_elf_section_type(str,len) ia64_elf_section_type (str, len)
#define md_after_parse_args() ia64_after_parse_args ()
#define TC_DWARF2_EMIT_OFFSET ia64_dwarf2_emit_offset
diff --git a/gas/config/tc-kvx.h b/gas/config/tc-kvx.h
index a33b63c1d79..a4d0e2d9b13 100644
--- a/gas/config/tc-kvx.h
+++ b/gas/config/tc-kvx.h
@@ -296,8 +296,7 @@ extern void kvx_cons_fix_new (fragS *f, int where, int nbytes,
/* Enable special handling for the alignment directive. */
extern void kvx_handle_align (fragS *);
-#undef HANDLE_ALIGN
-#define HANDLE_ALIGN kvx_handle_align
+#define HANDLE_ALIGN(s, f) kvx_handle_align (f)
#ifdef OBJ_ELF
diff --git a/gas/config/tc-loongarch.h b/gas/config/tc-loongarch.h
index 5873ad4d9f6..ebed8e0c049 100644
--- a/gas/config/tc-loongarch.h
+++ b/gas/config/tc-loongarch.h
@@ -139,7 +139,7 @@ extern void loongarch_pre_output_hook (void);
#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
-#define HANDLE_ALIGN(fragp) loongarch_handle_align (fragp)
+#define HANDLE_ALIGN(sec, fragp) loongarch_handle_align (fragp)
extern void loongarch_handle_align (struct frag *);
#define MAX_MEM_FOR_RS_ALIGN_CODE (3 + 4)
diff --git a/gas/config/tc-m32c.h b/gas/config/tc-m32c.h
index cc155a81cbb..bcdca98a191 100644
--- a/gas/config/tc-m32c.h
+++ b/gas/config/tc-m32c.h
@@ -79,5 +79,5 @@ 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)
-#define HANDLE_ALIGN(fragP)
+#define HANDLE_ALIGN(sec, fragP)
#define MAX_MEM_FOR_RS_ALIGN_CODE 1
diff --git a/gas/config/tc-m32r.h b/gas/config/tc-m32r.h
index 2d50b0a5583..6be96bb3c31 100644
--- a/gas/config/tc-m32r.h
+++ b/gas/config/tc-m32r.h
@@ -63,7 +63,7 @@ extern long m32r_relax_frag (segT, fragS *, long);
/* Fill in rs_align_code fragments. */
extern void m32r_handle_align (fragS *);
-#define HANDLE_ALIGN(f) m32r_handle_align (f)
+#define HANDLE_ALIGN(s, f) m32r_handle_align (f)
#define MAX_MEM_FOR_RS_ALIGN_CODE (1 + 2 + 4)
diff --git a/gas/config/tc-metag.h b/gas/config/tc-metag.h
index ea7bbb2a0ba..9d112c4ae70 100644
--- a/gas/config/tc-metag.h
+++ b/gas/config/tc-metag.h
@@ -52,7 +52,7 @@ extern int metag_force_relocation (struct fix *);
/* Call md_pcrel_from_section(), not md_pcrel_from(). */
#define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section (FIX, SEC)
-#define HANDLE_ALIGN(fragp) metag_handle_align (fragp)
+#define HANDLE_ALIGN(sec, fragp) metag_handle_align (fragp)
extern void metag_handle_align (struct frag *);
#define DWARF2_LINE_MIN_INSN_LENGTH 1
diff --git a/gas/config/tc-mips.h b/gas/config/tc-mips.h
index 02e211e458d..38a0e39b937 100644
--- a/gas/config/tc-mips.h
+++ b/gas/config/tc-mips.h
@@ -59,7 +59,7 @@ extern char mips_nop_opcode (void);
#define NOP_OPCODE (mips_nop_opcode ())
extern void mips_handle_align (struct frag *);
-#define HANDLE_ALIGN(fragp) mips_handle_align (fragp)
+#define HANDLE_ALIGN(sec, fragp) mips_handle_align (fragp)
#define MAX_MEM_FOR_RS_ALIGN_CODE (3 + 4)
diff --git a/gas/config/tc-mn10300.h b/gas/config/tc-mn10300.h
index 77917ef6851..ab6192e2aa0 100644
--- a/gas/config/tc-mn10300.h
+++ b/gas/config/tc-mn10300.h
@@ -125,7 +125,7 @@ extern bool mn10300_allow_local_subtract (expressionS *, expressionS *, segT);
#define TC_FRAG_TYPE bool
-#define HANDLE_ALIGN(frag) mn10300_handle_align (frag)
+#define HANDLE_ALIGN(sec, frag) mn10300_handle_align (frag)
extern void mn10300_handle_align (fragS *);
/* Only allow call frame debug info optimization when linker relaxation is
diff --git a/gas/config/tc-nds32.h b/gas/config/tc-nds32.h
index c5449f43476..14109f09dd0 100644
--- a/gas/config/tc-nds32.h
+++ b/gas/config/tc-nds32.h
@@ -112,7 +112,7 @@ extern void tc_nds32_frame_initial_instructions (void);
#define GAS_SORT_RELOCS 1
/* Values passed to md_apply_fix don't include the symbol value. */
#define MD_APPLY_SYM_VALUE(FIX) 0
-#define HANDLE_ALIGN(f) nds32_handle_align (f)
+#define HANDLE_ALIGN(s, f) nds32_handle_align (f)
#undef DIFF_EXPR_OK /* They should be fixed in linker. */
#define md_relax_frag(segment, fragP, stretch) nds32_relax_frag (segment, fragP, stretch)
#define WORKING_DOT_WORD /* We don't need to handle .word strangely. */
diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c
index 9c3adb39950..f9614035748 100644
--- a/gas/config/tc-ppc.c
+++ b/gas/config/tc-ppc.c
@@ -6889,7 +6889,7 @@ ppc_nop_select (void)
}
void
-ppc_handle_align (struct frag *fragP)
+ppc_handle_align (segT sec, struct frag *fragP)
{
valueT count = (fragP->fr_next->fr_address
- (fragP->fr_address + fragP->fr_fix));
@@ -6928,7 +6928,9 @@ ppc_handle_align (struct frag *fragP)
if (count == 0)
return;
- rest = xmalloc (SIZEOF_STRUCT_FRAG + 4);
+ segment_info_type *seginfo = seg_info (sec);
+ struct obstack *ob = &seginfo->frchainP->frch_obstack;
+ rest = frag_alloc (ob, 4);
memcpy (rest, fragP, SIZEOF_STRUCT_FRAG);
fragP->fr_next = rest;
fragP = rest;
@@ -6952,7 +6954,9 @@ ppc_handle_align (struct frag *fragP)
reduce the number of nops in the current frag by one. */
if (count > 4)
{
- struct frag *group_nop = xmalloc (SIZEOF_STRUCT_FRAG + 4);
+ segment_info_type *seginfo = seg_info (sec);
+ struct obstack *ob = &seginfo->frchainP->frch_obstack;
+ struct frag *group_nop = frag_alloc (ob, 4);
memcpy (group_nop, fragP, SIZEOF_STRUCT_FRAG);
group_nop->fr_address = group_nop->fr_next->fr_address - 4;
diff --git a/gas/config/tc-ppc.h b/gas/config/tc-ppc.h
index b0893cd1ab2..f6b37f80ef4 100644
--- a/gas/config/tc-ppc.h
+++ b/gas/config/tc-ppc.h
@@ -73,14 +73,14 @@ extern const char *ppc_target_format (void);
#define WORKING_DOT_WORD
#define MAX_MEM_FOR_RS_ALIGN_CODE 4
-#define HANDLE_ALIGN(FRAGP) \
+#define HANDLE_ALIGN(SEC, FRAGP) \
if ((FRAGP)->fr_type == rs_align_code) \
- ppc_handle_align (FRAGP);
+ ppc_handle_align (SEC, FRAGP);
extern unsigned int ppc_nop_select (void);
#define NOP_OPCODE ppc_nop_select ()
-extern void ppc_handle_align (struct frag *);
+extern void ppc_handle_align (segT, struct frag *);
extern void ppc_frag_check (struct frag *);
#ifdef OBJ_ELF
diff --git a/gas/config/tc-riscv.h b/gas/config/tc-riscv.h
index 6b25a791da8..e2e8e7af876 100644
--- a/gas/config/tc-riscv.h
+++ b/gas/config/tc-riscv.h
@@ -62,7 +62,7 @@ extern bool riscv_frag_align_code (int);
}
extern void riscv_handle_align (fragS *);
-#define HANDLE_ALIGN riscv_handle_align
+#define HANDLE_ALIGN(s, f) riscv_handle_align (f)
#define MAX_MEM_FOR_RS_ALIGN_CODE (3 + 4)
diff --git a/gas/config/tc-rl78.h b/gas/config/tc-rl78.h
index 12aca9ea4c2..4a513250ab9 100644
--- a/gas/config/tc-rl78.h
+++ b/gas/config/tc-rl78.h
@@ -76,7 +76,7 @@ extern void rl78_cons_fix_new (fragS *, int, int, expressionS *);
#define MAX_RELOC_EXPANSION 8
#define MAX_MEM_FOR_RS_ALIGN_CODE 8
-#define HANDLE_ALIGN(FRAG) rl78_handle_align (FRAG)
+#define HANDLE_ALIGN(SEC, FRAG) rl78_handle_align (FRAG)
extern void rl78_handle_align (fragS *);
#define elf_tc_final_processing rl78_elf_final_processing
diff --git a/gas/config/tc-rx.h b/gas/config/tc-rx.h
index 859a0b77c3a..3c4524f4aa9 100644
--- a/gas/config/tc-rx.h
+++ b/gas/config/tc-rx.h
@@ -97,7 +97,7 @@ extern void rx_cons_fix_new (fragS *, int, int, expressionS *,
}
#define MAX_MEM_FOR_RS_ALIGN_CODE 8
-#define HANDLE_ALIGN(FRAG) rx_handle_align (FRAG)
+#define HANDLE_ALIGN(SEC, FRAG) rx_handle_align (FRAG)
extern void rx_handle_align (fragS *);
#define RELOC_EXPANSION_POSSIBLE 1
diff --git a/gas/config/tc-sh.h b/gas/config/tc-sh.h
index 38247ebbe17..fb1e4b81244 100644
--- a/gas/config/tc-sh.h
+++ b/gas/config/tc-sh.h
@@ -53,7 +53,7 @@ extern int sh_optimize_expr (expressionS *, operatorT, expressionS *);
/* When relaxing, we need to generate relocations for alignment
directives. */
-#define HANDLE_ALIGN(frag) sh_handle_align (frag)
+#define HANDLE_ALIGN(sec, frag) sh_handle_align (frag)
extern void sh_handle_align (fragS *);
#define MAX_MEM_FOR_RS_ALIGN_CODE (1 + 2)
diff --git a/gas/config/tc-sparc.h b/gas/config/tc-sparc.h
index f18bc1d93ad..b87212f011d 100644
--- a/gas/config/tc-sparc.h
+++ b/gas/config/tc-sparc.h
@@ -75,7 +75,7 @@ extern int sparc_pic_code;
#define md_cons_align(nbytes) sparc_cons_align (nbytes)
extern void sparc_cons_align (int);
-#define HANDLE_ALIGN(fragp) sparc_handle_align (fragp)
+#define HANDLE_ALIGN(sec, fragp) sparc_handle_align (fragp)
extern void sparc_handle_align (struct frag *);
#define MAX_MEM_FOR_RS_ALIGN_CODE (3 + 4 + 4)
diff --git a/gas/config/tc-spu.h b/gas/config/tc-spu.h
index 8c132d3ce0b..4c164856c1f 100644
--- a/gas/config/tc-spu.h
+++ b/gas/config/tc-spu.h
@@ -102,7 +102,7 @@ extern symbolS *section_symbol (asection *);
/* Fill in rs_align_code fragments. */
extern void spu_handle_align (fragS *);
-#define HANDLE_ALIGN(frag) spu_handle_align (frag)
+#define HANDLE_ALIGN(sec, frag) spu_handle_align (frag)
#define MAX_MEM_FOR_RS_ALIGN_CODE (7 + 8)
diff --git a/gas/config/tc-tilegx.h b/gas/config/tc-tilegx.h
index 08a87ae48d4..06db4416ec5 100644
--- a/gas/config/tc-tilegx.h
+++ b/gas/config/tc-tilegx.h
@@ -39,7 +39,7 @@ extern const char * tilegx_target_format (void);
#define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */
-#define HANDLE_ALIGN(fragp) tilegx_handle_align (fragp)
+#define HANDLE_ALIGN(sec, fragp) tilegx_handle_align (fragp)
extern void tilegx_handle_align (struct frag *);
#define MAX_MEM_FOR_RS_ALIGN_CODE (7 + 8)
diff --git a/gas/config/tc-tilepro.h b/gas/config/tc-tilepro.h
index 6fb98532c7c..945d1cac9a1 100644
--- a/gas/config/tc-tilepro.h
+++ b/gas/config/tc-tilepro.h
@@ -39,7 +39,7 @@
#define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */
-#define HANDLE_ALIGN(fragp) tilepro_handle_align (fragp)
+#define HANDLE_ALIGN(sec, fragp) tilepro_handle_align (fragp)
extern void tilepro_handle_align (struct frag *);
#define MAX_MEM_FOR_RS_ALIGN_CODE (7 + 8)
diff --git a/gas/config/tc-v850.h b/gas/config/tc-v850.h
index c06ab6848be..1e234416cd6 100644
--- a/gas/config/tc-v850.h
+++ b/gas/config/tc-v850.h
@@ -69,7 +69,7 @@ extern const struct relax_type md_relax_table[];
/* When relaxing, we need to generate
relocations for alignment directives. */
-#define HANDLE_ALIGN(frag) v850_handle_align (frag)
+#define HANDLE_ALIGN(sec, frag) v850_handle_align (frag)
extern void v850_handle_align (fragS *);
/* We need space in a frag's fixed size to allow for alignment when relaxing. */
diff --git a/gas/config/tc-visium.h b/gas/config/tc-visium.h
index 6a5e8e2c67b..01f86285d3f 100644
--- a/gas/config/tc-visium.h
+++ b/gas/config/tc-visium.h
@@ -45,7 +45,7 @@
#define tc_fix_adjustable(FIXP) visium_fix_adjustable (FIXP)
extern bool visium_fix_adjustable (struct fix *);
-#define HANDLE_ALIGN(FRAGP) \
+#define HANDLE_ALIGN(SEC, FRAGP) \
if ((FRAGP)->fr_type == rs_align_code) \
visium_handle_align (FRAGP);
extern void visium_handle_align (struct frag *);
diff --git a/gas/config/tc-wasm32.h b/gas/config/tc-wasm32.h
index 32d7d8783b3..b2ccf1cff59 100644
--- a/gas/config/tc-wasm32.h
+++ b/gas/config/tc-wasm32.h
@@ -75,7 +75,7 @@ extern int wasm32_force_relocation (struct fix *);
#define elf_tc_final_processing()
#define md_post_relax_hook
#define md_start_line_hook()
-#define HANDLE_ALIGN(fragP)
+#define HANDLE_ALIGN(sec, fragP)
extern bool wasm32_fix_adjustable (struct fix *);
diff --git a/gas/config/tc-xtensa.h b/gas/config/tc-xtensa.h
index 00d03c01943..3d757e8413c 100644
--- a/gas/config/tc-xtensa.h
+++ b/gas/config/tc-xtensa.h
@@ -378,7 +378,7 @@ extern void xtensa_init (int, char **);
#define TEXT_SECTION_NAME xtensa_section_rename (".text")
#define DATA_SECTION_NAME xtensa_section_rename (".data")
#define BSS_SECTION_NAME xtensa_section_rename (".bss")
-#define HANDLE_ALIGN(fragP) xtensa_handle_align (fragP)
+#define HANDLE_ALIGN(sec, fragP) xtensa_handle_align (fragP)
#define MAX_MEM_FOR_RS_ALIGN_CODE 1
diff --git a/gas/frags.c b/gas/frags.c
index a57a4d56187..d067bb4761e 100644
--- a/gas/frags.c
+++ b/gas/frags.c
@@ -73,7 +73,7 @@ frag_alloc_check (const struct obstack *ob)
hackery can be done in just one place. */
fragS *
-frag_alloc (struct obstack *ob)
+frag_alloc (struct obstack *ob, size_t extra)
{
fragS *ptr;
int oalign;
@@ -81,7 +81,7 @@ frag_alloc (struct obstack *ob)
(void) obstack_alloc (ob, 0);
oalign = obstack_alignment_mask (ob);
obstack_alignment_mask (ob) = 0;
- ptr = (fragS *) obstack_alloc (ob, SIZEOF_STRUCT_FRAG);
+ ptr = (fragS *) obstack_alloc (ob, extra + SIZEOF_STRUCT_FRAG);
obstack_alignment_mask (ob) = oalign;
memset (ptr, 0, SIZEOF_STRUCT_FRAG);
totalfrags++;
@@ -180,7 +180,7 @@ frag_new (size_t old_frags_var_max_size
former_last_fragP = frchP->frch_last;
gas_assert (former_last_fragP != 0);
gas_assert (former_last_fragP == frag_now);
- frag_now = frag_alloc (&frchP->frch_obstack);
+ frag_now = frag_alloc (&frchP->frch_obstack, 0);
frag_now->fr_file = as_where (&frag_now->fr_line);
diff --git a/gas/frags.h b/gas/frags.h
index a1dcea0be0c..695277d7871 100644
--- a/gas/frags.h
+++ b/gas/frags.h
@@ -124,7 +124,7 @@ extern void frag_append_1_char (int);
#define FRAG_APPEND_1_CHAR(X) frag_append_1_char (X)
void frag_init (void);
-fragS *frag_alloc (struct obstack *);
+fragS *frag_alloc (struct obstack *, size_t);
void frag_grow (size_t nchars);
char *frag_more (size_t nchars);
void frag_align (int alignment, int fill_character, int max);
diff --git a/gas/subsegs.c b/gas/subsegs.c
index 837af056485..e098ec4302a 100644
--- a/gas/subsegs.c
+++ b/gas/subsegs.c
@@ -127,7 +127,7 @@ subseg_set_rest (segT seg, subsegT subseg)
#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 = frag_alloc (&newP->frch_obstack, 0);
newP->frch_frag_now->fr_type = rs_fill;
newP->frch_cfi_data = NULL;
newP->frch_ginsn_data = NULL;
diff --git a/gas/write.c b/gas/write.c
index e8231603961..439f6a6913a 100644
--- a/gas/write.c
+++ b/gas/write.c
@@ -417,7 +417,7 @@ cvt_frag_to_fill (segT sec ATTRIBUTE_UNUSED, fragS *fragP)
case rs_org:
case rs_space:
#ifdef HANDLE_ALIGN
- HANDLE_ALIGN (fragP);
+ HANDLE_ALIGN (sec, fragP);
#endif
skip_align:
know (fragP->fr_next != NULL);
@@ -737,11 +737,11 @@ resolve_reloc_expr_symbols (void)
else if (sym != NULL && sec != NULL)
{
/* Convert relocs against local symbols to refer to the
- corresponding section symbol plus offset instead. Keep
- PC-relative relocs of the REL variety intact though to
+ corresponding section symbol plus offset instead. Keep
+ PC-relative relocs of the REL variety intact though to
prevent the offset from overflowing the relocated field,
- unless it has enough bits to cover the whole address
- space. */
+ unless it has enough bits to cover the whole address
+ space. */
if (S_IS_LOCAL (sym)
&& S_IS_DEFINED (sym)
&& !symbol_section_p (sym)
@@ -1448,17 +1448,17 @@ compress_frag (bool use_zstd, void *ctx, const char *contents, int in_size,
while (in_size > 0)
{
/* Reserve all the space available in the current chunk.
- If none is available, start a new frag. */
+ If none is available, start a new frag. */
avail_out = obstack_room (ob);
if (avail_out <= 0)
- {
- obstack_finish (ob);
- f = frag_alloc (ob);
+ {
+ obstack_finish (ob);
+ f = frag_alloc (ob, 0);
f->fr_type = rs_fill;
- (*last_newf)->fr_next = f;
- *last_newf = f;
- avail_out = obstack_room (ob);
- }
+ (*last_newf)->fr_next = f;
+ *last_newf = f;
+ avail_out = obstack_room (ob);
+ }
if (avail_out <= 0)
as_fatal (_("can't extend frag"));
next_out = obstack_next_free (ob);
@@ -1510,16 +1510,8 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
/* Create a new frag to contain the compression header. */
struct obstack *ob = &seginfo->frchainP->frch_obstack;
- fragS *first_newf = frag_alloc (ob);
- if (obstack_room (ob) < header_size)
- first_newf = frag_alloc (ob);
- if (obstack_room (ob) < header_size)
- as_fatal (ngettext ("can't extend frag %lu char",
- "can't extend frag %lu chars",
- (unsigned long) header_size),
- (unsigned long) header_size);
+ fragS *first_newf = frag_alloc (ob, header_size);
fragS *last_newf = first_newf;
- obstack_blank_fast (ob, header_size);
last_newf->fr_type = rs_fill;
last_newf->fr_fix = header_size;
char *header = last_newf->fr_literal;
@@ -1577,7 +1569,7 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
fragS *newf;
obstack_finish (ob);
- newf = frag_alloc (ob);
+ newf = frag_alloc (ob, 0);
newf->fr_type = rs_fill;
last_newf->fr_next = newf;
last_newf = newf;
@@ -2994,9 +2986,7 @@ relax_segment (struct frag *segment_frag_root, segT segment, int pass)
struct obstack *ob = &seginfo->frchainP->frch_obstack;
struct frag *newf;
- newf = frag_alloc (ob);
- obstack_blank_fast (ob, fragP->fr_var);
- obstack_finish (ob);
+ newf = frag_alloc (ob, fragP->fr_var);
memcpy (newf, fragP, SIZEOF_STRUCT_FRAG);
memcpy (newf->fr_literal,
fragP->fr_literal + fragP->fr_fix,
--
Alan Modra
More information about the Binutils
mailing list