#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)) \
#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)
/* 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
#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) \
#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
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"
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 \
#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 \
#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
/* 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
#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)
#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
/* 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)
/* 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
#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)
#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
#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. */
}
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));
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;
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;
#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
}
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)
#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
}
#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
/* 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)
#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)
/* 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)
#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)
#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)
/* 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. */
#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 *);
#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 *);
#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
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;
(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++;
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);
#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);
#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;
case rs_org:
case rs_space:
#ifdef HANDLE_ALIGN
- HANDLE_ALIGN (fragP);
+ HANDLE_ALIGN (sec, fragP);
#endif
skip_align:
know (fragP->fr_next != NULL);
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)
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);
/* 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;
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;
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,