gas TC_PARSE_CONS_EXPRESSION communication with TC_CONS_FIX_NEW

A number of targets pass extra information from TC_PARSE_CONS_EXPRESSION
to TC_CONS_FIX_NEW via static variables.  That's OK, but not best
practice.  tc-ppc.c goes further in implementing its own replacement
for cons(), because the generic one doesn't allow relocation modifiers
on constants.  This patch fixes both of these warts.

	* gas/config/tc-alpha.h (TC_CONS_FIX_NEW): Add RELOC parameter.
	* gas/config/tc-arc.c (arc_cons_fix_new): Add reloc parameter.
	* gas/config/tc-arc.h (arc_cons_fix_new): Update prototype.
	(TC_CONS_FIX_NEW): Add RELOC parameter.
	* gas/config/tc-arm.c (cons_fix_new_arm): Similarly
	* gas/config/tc-arm.h (cons_fix_new_arm, TC_CONS_FIX_NEW): Similarly.
	* gas/config/tc-cr16.c (cr16_cons_fix_new): Similarly.
	* gas/config/tc-cr16.h (cr16_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
	* gas/config/tc-crx.h (TC_CONS_FIX_NEW): Similarly.
	* gas/config/tc-m32c.c (m32c_cons_fix_new): Similarly.
	* gas/config/tc-m32c.h (m32c_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
	* gas/config/tc-mn10300.c (mn10300_cons_fix_new): Similarly.
	* gas/config/tc-mn10300.h (mn10300_cons_fix_new, TC_CONS_FIX_NEW):
	Similarly.
	* gas/config/tc-ns32k.c (cons_fix_new_ns32k): Similarly.
	* gas/config/tc-ns32k.h (cons_fix_new_ns32k): Similarly.
	* gas/config/tc-pj.c (pj_cons_fix_new_pj): Similarly.
	* gas/config/tc-pj.h (pj_cons_fix_new_pj, TC_CONS_FIX_NEW): Similarly.
	* gas/config/tc-rx.c (rx_cons_fix_new): Similarly.
	* gas/config/tc-rx.h (rx_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
	* gas/config/tc-sh.c (sh_cons_fix_new): Similarly.
	* gas/config/tc-sh.h (sh_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
	* gas/config/tc-tic54x.c (tic54x_cons_fix_new): Similarly.
	* gas/config/tc-tic54x.h (tic54x_cons_fix_new, TC_CONS_FIX_NEW):
	Similarly.
	* gas/config/tc-tic6x.c (tic6x_cons_fix_new): Similarly.
	* gas/config/tc-tic6x.h (tic6x_cons_fix_new, TC_CONS_FIX_NEW):
	Similarly.
	* gas/config/tc-arc.c (arc_parse_cons_expression): Return reloc.
	* gas/config/tc-arc.h (arc_parse_cons_expression): Update proto.
	* gas/config/tc-avr.c (exp_mod_data): Make global.
	(pexp_mod_data): Delete.
	(avr_parse_cons_expression): Return exp_mod_data pointer.
	(avr_cons_fix_new): Add exp_mod_data_t pointer param.
	(exp_mod_data_t): Move typedef..
	* gas/config/tc-avr.h: ..to here.
	(exp_mod_data): Declare.
	(TC_PARSE_CONS_RETURN_TYPE, TC_PARSE_CONS_RETURN_NONE): Define.
	(avr_parse_cons_expression, avr_cons_fix_new): Update prototype.
	(TC_CONS_FIX_NEW): Update.
	* gas/config/tc-hppa.c (hppa_field_selector): Delete static var.
	(cons_fix_new_hppa): Add hppa_field_selector param.
	(fix_new_hppa): Adjust.
	(parse_cons_expression_hppa): Return field selector.
	* gas/config/tc-hppa.h (parse_cons_expression_hppa): Update proto.
	(cons_fix_new_hppa): Likewise.
	(TC_PARSE_CONS_RETURN_TYPE, TC_PARSE_CONS_RETURN_NONE): Define.
	* gas/config/tc-i386.c (got_reloc): Delete static var.
	(x86_cons_fix_new): Add reloc param.
	(x86_cons): Return got reloc.
	* gas/config/tc-i386.h (x86_cons, x86_cons_fix_new): Update proto.
	(TC_CONS_FIX_NEW): Add RELOC param.
	* gas/config/tc-ia64.c (ia64_cons_fix_new): Add reloc param.  Adjust
	calls.
	* gas/config/tc-ia64.h (ia64_cons_fix_new): Update prototype.
	(TC_CONS_FIX_NEW): Add reloc param.
	* gas/config/tc-microblaze.c (parse_cons_expression_microblaze):
	Return reloc.
	(cons_fix_new_microblaze): Add reloc param.
	* gas/config/tc-microblaze.h: Formatting.
	(parse_cons_expression_microblaze): Update proto.
	(cons_fix_new_microblaze): Likewise.
	* gas/config/tc-nios2.c (nios2_tls_ldo_reloc): Delete static var.
	(nios2_cons): Return ldo reloc.
	(nios2_cons_fix_new): Delete.
	* gas/config/tc-nios2.h (nios2_cons): Update prototype.
	(nios2_cons_fix_new, TC_CONS_FIX_NEW): Delete.
	* gas/config/tc-ppc.c (md_pseudo_table): Remove quad, long, word,
	short.  Make llong use cons.
	(ppc_elf_suffix): Return BFD_RELOC_NONE rather than BFD_RELOC_UNUSED.
	(ppc_elf_cons): Delete.
	(ppc_elf_parse_cons): New function.
	(ppc_elf_validate_fix): Don't check for BFD_RELOC_UNUSED.
	(md_assemble): Use BFD_RELOC_NONE rather than BFD_RELOC_UNUSED.
	* gas/config/tc-ppc.h (TC_PARSE_CONS_EXPRESSION): Define
	(ppc_elf_parse_cons): Declare.
	* gas/config/tc-sparc.c (sparc_cons_special_reloc): Delete static var.
	(sparc_cons): Return reloc specifier.
	(cons_fix_new_sparc): Add reloc specifier param.
	(sparc_cfi_emit_pcrel_expr): Use emit_expr_with_reloc.
	* gas/config/tc-sparc.h (TC_PARSE_CONS_RETURN_TYPE): Define.
	(TC_PARSE_CONS_RETURN_NONE): Define.
	(sparc_cons, cons_fix_new_sparc): Update prototype.
	* gas/config/tc-v850.c (hold_cons_reloc): Delete static var.
	(v850_reloc_prefix): Use BFD_RELOC_NONE rather than BFD_RELOC_UNUSED.
	(md_assemble): Likewise.
	(parse_cons_expression_v850): Return reloc.
	(cons_fix_new_v850): Add reloc parameter.
	* gas/config/tc-v850.h (parse_cons_expression_v850): Update proto.
	(cons_fix_new_v850): Likewise.
	* gas/config/tc-vax.c (vax_cons_special_reloc): Delete static var.
	(vax_cons): Return reloc.
	(vax_cons_fix_new): Add reloc parameter.
	* gas/config/tc-vax.h (vax_cons, vax_cons_fix_new): Update proto.
	* gas/config/tc-xstormy16.c (xstormy16_cons_fix_new): Add reloc param.
	* gas/config/tc-xstormy16.h (xstormy16_cons_fix_new): Update proto.
	* gas/dwarf2dbg.c (TC_PARSE_CONS_RETURN_NONE): Provide default.
	(emit_fixed_inc_line_addr): Adjust exmit_expr_fix calls.
	* gas/read.c (TC_PARSE_CONS_EXPRESSION): Return value.
	(do_parse_cons_expression): Adjust.
	(cons_worker): Pass return value from TC_PARSE_CONS_EXPRESSION
	to emit_expr_with_reloc.
	(emit_expr_with_reloc): New function handling reloc, mostly
	extracted from..
	(emit_expr): ..here.
	(emit_expr_fix): Add reloc param.  Adjust TC_CONS_FIX_NEW invocation.
	Handle reloc.
	(parse_mri_cons): Convert to ISO.
	* gas/read.h (TC_PARSE_CONS_RETURN_TYPE): Define.
	(TC_PARSE_CONS_RETURN_NONE): Define.
	(emit_expr_with_reloc): Declare.
	(emit_expr_fix): Update prototype.
	* gas/write.c (write_object_file): Update TC_CONS_FIX_NEW invocation.
This commit is contained in:
Alan Modra 2014-04-08 14:38:22 +09:30
parent e30d16e9ec
commit 62ebcb5cbe
51 changed files with 427 additions and 325 deletions

View File

@ -1,3 +1,119 @@
2014-04-09 Alan Modra <amodra@gmail.com>
* gas/config/tc-alpha.h (TC_CONS_FIX_NEW): Add RELOC parameter.
* gas/config/tc-arc.c (arc_cons_fix_new): Add reloc parameter.
* gas/config/tc-arc.h (arc_cons_fix_new): Update prototype.
(TC_CONS_FIX_NEW): Add RELOC parameter.
* gas/config/tc-arm.c (cons_fix_new_arm): Similarly
* gas/config/tc-arm.h (cons_fix_new_arm, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-cr16.c (cr16_cons_fix_new): Similarly.
* gas/config/tc-cr16.h (cr16_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-crx.h (TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-m32c.c (m32c_cons_fix_new): Similarly.
* gas/config/tc-m32c.h (m32c_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-mn10300.c (mn10300_cons_fix_new): Similarly.
* gas/config/tc-mn10300.h (mn10300_cons_fix_new, TC_CONS_FIX_NEW):
Similarly.
* gas/config/tc-ns32k.c (cons_fix_new_ns32k): Similarly.
* gas/config/tc-ns32k.h (cons_fix_new_ns32k): Similarly.
* gas/config/tc-pj.c (pj_cons_fix_new_pj): Similarly.
* gas/config/tc-pj.h (pj_cons_fix_new_pj, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-rx.c (rx_cons_fix_new): Similarly.
* gas/config/tc-rx.h (rx_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-sh.c (sh_cons_fix_new): Similarly.
* gas/config/tc-sh.h (sh_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-tic54x.c (tic54x_cons_fix_new): Similarly.
* gas/config/tc-tic54x.h (tic54x_cons_fix_new, TC_CONS_FIX_NEW):
Similarly.
* gas/config/tc-tic6x.c (tic6x_cons_fix_new): Similarly.
* gas/config/tc-tic6x.h (tic6x_cons_fix_new, TC_CONS_FIX_NEW):
Similarly.
* gas/config/tc-arc.c (arc_parse_cons_expression): Return reloc.
* gas/config/tc-arc.h (arc_parse_cons_expression): Update proto.
* gas/config/tc-avr.c (exp_mod_data): Make global.
(pexp_mod_data): Delete.
(avr_parse_cons_expression): Return exp_mod_data pointer.
(avr_cons_fix_new): Add exp_mod_data_t pointer param.
(exp_mod_data_t): Move typedef..
* gas/config/tc-avr.h: ..to here.
(exp_mod_data): Declare.
(TC_PARSE_CONS_RETURN_TYPE, TC_PARSE_CONS_RETURN_NONE): Define.
(avr_parse_cons_expression, avr_cons_fix_new): Update prototype.
(TC_CONS_FIX_NEW): Update.
* gas/config/tc-hppa.c (hppa_field_selector): Delete static var.
(cons_fix_new_hppa): Add hppa_field_selector param.
(fix_new_hppa): Adjust.
(parse_cons_expression_hppa): Return field selector.
* gas/config/tc-hppa.h (parse_cons_expression_hppa): Update proto.
(cons_fix_new_hppa): Likewise.
(TC_PARSE_CONS_RETURN_TYPE, TC_PARSE_CONS_RETURN_NONE): Define.
* gas/config/tc-i386.c (got_reloc): Delete static var.
(x86_cons_fix_new): Add reloc param.
(x86_cons): Return got reloc.
* gas/config/tc-i386.h (x86_cons, x86_cons_fix_new): Update proto.
(TC_CONS_FIX_NEW): Add RELOC param.
* gas/config/tc-ia64.c (ia64_cons_fix_new): Add reloc param. Adjust
calls.
* gas/config/tc-ia64.h (ia64_cons_fix_new): Update prototype.
(TC_CONS_FIX_NEW): Add reloc param.
* gas/config/tc-microblaze.c (parse_cons_expression_microblaze):
Return reloc.
(cons_fix_new_microblaze): Add reloc param.
* gas/config/tc-microblaze.h: Formatting.
(parse_cons_expression_microblaze): Update proto.
(cons_fix_new_microblaze): Likewise.
* gas/config/tc-nios2.c (nios2_tls_ldo_reloc): Delete static var.
(nios2_cons): Return ldo reloc.
(nios2_cons_fix_new): Delete.
* gas/config/tc-nios2.h (nios2_cons): Update prototype.
(nios2_cons_fix_new, TC_CONS_FIX_NEW): Delete.
* gas/config/tc-ppc.c (md_pseudo_table): Remove quad, long, word,
short. Make llong use cons.
(ppc_elf_suffix): Return BFD_RELOC_NONE rather than BFD_RELOC_UNUSED.
(ppc_elf_cons): Delete.
(ppc_elf_parse_cons): New function.
(ppc_elf_validate_fix): Don't check for BFD_RELOC_UNUSED.
(md_assemble): Use BFD_RELOC_NONE rather than BFD_RELOC_UNUSED.
* gas/config/tc-ppc.h (TC_PARSE_CONS_EXPRESSION): Define
(ppc_elf_parse_cons): Declare.
* gas/config/tc-sparc.c (sparc_cons_special_reloc): Delete static var.
(sparc_cons): Return reloc specifier.
(cons_fix_new_sparc): Add reloc specifier param.
(sparc_cfi_emit_pcrel_expr): Use emit_expr_with_reloc.
* gas/config/tc-sparc.h (TC_PARSE_CONS_RETURN_TYPE): Define.
(TC_PARSE_CONS_RETURN_NONE): Define.
(sparc_cons, cons_fix_new_sparc): Update prototype.
* gas/config/tc-v850.c (hold_cons_reloc): Delete static var.
(v850_reloc_prefix): Use BFD_RELOC_NONE rather than BFD_RELOC_UNUSED.
(md_assemble): Likewise.
(parse_cons_expression_v850): Return reloc.
(cons_fix_new_v850): Add reloc parameter.
* gas/config/tc-v850.h (parse_cons_expression_v850): Update proto.
(cons_fix_new_v850): Likewise.
* gas/config/tc-vax.c (vax_cons_special_reloc): Delete static var.
(vax_cons): Return reloc.
(vax_cons_fix_new): Add reloc parameter.
* gas/config/tc-vax.h (vax_cons, vax_cons_fix_new): Update proto.
* gas/config/tc-xstormy16.c (xstormy16_cons_fix_new): Add reloc param.
* gas/config/tc-xstormy16.h (xstormy16_cons_fix_new): Update proto.
* gas/dwarf2dbg.c (TC_PARSE_CONS_RETURN_NONE): Provide default.
(emit_fixed_inc_line_addr): Adjust exmit_expr_fix calls.
* gas/read.c (TC_PARSE_CONS_EXPRESSION): Return value.
(do_parse_cons_expression): Adjust.
(cons_worker): Pass return value from TC_PARSE_CONS_EXPRESSION
to emit_expr_with_reloc.
(emit_expr_with_reloc): New function handling reloc, mostly
extracted from..
(emit_expr): ..here.
(emit_expr_fix): Add reloc param. Adjust TC_CONS_FIX_NEW invocation.
Handle reloc.
(parse_mri_cons): Convert to ISO.
* gas/read.h (TC_PARSE_CONS_RETURN_TYPE): Define.
(TC_PARSE_CONS_RETURN_NONE): Define.
(emit_expr_with_reloc): Declare.
(emit_expr_fix): Update prototype.
* gas/write.c (write_object_file): Update TC_CONS_FIX_NEW invocation.
2014-04-03 Ilya Tocar <ilya.tocar@intel.com> 2014-04-03 Ilya Tocar <ilya.tocar@intel.com>
* config/tc-i386.c (cpu_arch): Add .se1. * config/tc-i386.c (cpu_arch): Add .se1.

View File

@ -71,7 +71,8 @@ extern valueT alpha_gp_value;
#define tc_canonicalize_symbol_name evax_shorten_name #define tc_canonicalize_symbol_name evax_shorten_name
#define TC_CONS_FIX_NEW(FRAG,OFF,LEN,EXP) \ #define TC_CONS_FIX_NEW(FRAG,OFF,LEN,EXP,RELOC) \
(void) RELOC, \
fix_new_exp (FRAG, OFF, (int)LEN, EXP, 0, \ fix_new_exp (FRAG, OFF, (int)LEN, EXP, 0, \
LEN == 2 ? BFD_RELOC_16 \ LEN == 2 ? BFD_RELOC_16 \
: LEN == 4 ? BFD_RELOC_32 \ : LEN == 4 ? BFD_RELOC_32 \

View File

@ -1160,7 +1160,7 @@ md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
Values for the status register are specified with %st(label). Values for the status register are specified with %st(label).
`label' will be right shifted by 2. */ `label' will be right shifted by 2. */
void bfd_reloc_code_real_type
arc_parse_cons_expression (expressionS *exp, arc_parse_cons_expression (expressionS *exp,
unsigned int nbytes ATTRIBUTE_UNUSED) unsigned int nbytes ATTRIBUTE_UNUSED)
{ {
@ -1179,6 +1179,7 @@ arc_parse_cons_expression (expressionS *exp,
arc_code_symbol (exp); arc_code_symbol (exp);
input_line_pointer = p; input_line_pointer = p;
} }
return BFD_RELOC_NONE;
} }
/* Record a fixup for a cons expression. */ /* Record a fixup for a cons expression. */
@ -1187,7 +1188,8 @@ void
arc_cons_fix_new (fragS *frag, arc_cons_fix_new (fragS *frag,
int where, int where,
int nbytes, int nbytes,
expressionS *exp) expressionS *exp,
bfd_reloc_code_real_type r ATTRIBUTE_UNUSED)
{ {
if (nbytes == 4) if (nbytes == 4)
{ {

View File

@ -54,13 +54,15 @@ extern const char * arc_target_format;
/* The ARC needs to parse reloc specifiers in .word. */ /* The ARC needs to parse reloc specifiers in .word. */
extern void arc_parse_cons_expression (struct expressionS *, unsigned); extern bfd_reloc_code_real_type arc_parse_cons_expression (struct expressionS *,
unsigned);
#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \ #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
arc_parse_cons_expression (EXP, NBYTES) arc_parse_cons_expression (EXP, NBYTES)
extern void arc_cons_fix_new (struct frag *, int, int, struct expressionS *); extern void arc_cons_fix_new (struct frag *, int, int, struct expressionS *,
#define TC_CONS_FIX_NEW(FRAG, WHERE, NBYTES, EXP) \ bfd_reloc_code_real_type);
arc_cons_fix_new (FRAG, WHERE, NBYTES, EXP) #define TC_CONS_FIX_NEW(FRAG, WHERE, NBYTES, EXP, RELOC) \
arc_cons_fix_new (FRAG, WHERE, NBYTES, EXP, RELOC)
#define DWARF2_LINE_MIN_INSN_LENGTH 4 #define DWARF2_LINE_MIN_INSN_LENGTH 4

View File

@ -23159,9 +23159,9 @@ void
cons_fix_new_arm (fragS * frag, cons_fix_new_arm (fragS * frag,
int where, int where,
int size, int size,
expressionS * exp) expressionS * exp,
bfd_reloc_code_real_type reloc)
{ {
bfd_reloc_code_real_type type;
int pcrel = 0; int pcrel = 0;
/* Pick a reloc. /* Pick a reloc.
@ -23169,17 +23169,17 @@ cons_fix_new_arm (fragS * frag,
switch (size) switch (size)
{ {
case 1: case 1:
type = BFD_RELOC_8; reloc = BFD_RELOC_8;
break; break;
case 2: case 2:
type = BFD_RELOC_16; reloc = BFD_RELOC_16;
break; break;
case 4: case 4:
default: default:
type = BFD_RELOC_32; reloc = BFD_RELOC_32;
break; break;
case 8: case 8:
type = BFD_RELOC_64; reloc = BFD_RELOC_64;
break; break;
} }
@ -23187,11 +23187,11 @@ cons_fix_new_arm (fragS * frag,
if (exp->X_op == O_secrel) if (exp->X_op == O_secrel)
{ {
exp->X_op = O_symbol; exp->X_op = O_symbol;
type = BFD_RELOC_32_SECREL; reloc = BFD_RELOC_32_SECREL;
} }
#endif #endif
fix_new_exp (frag, where, (int) size, exp, pcrel, type); fix_new_exp (frag, where, size, exp, pcrel, reloc);
} }
#if defined (OBJ_COFF) #if defined (OBJ_COFF)

View File

@ -348,7 +348,8 @@ extern int arm_data_in_code (void);
extern char * arm_canonicalize_symbol_name (char *); extern char * arm_canonicalize_symbol_name (char *);
extern void arm_adjust_symtab (void); extern void arm_adjust_symtab (void);
extern void armelf_frob_symbol (symbolS *, int *); extern void armelf_frob_symbol (symbolS *, int *);
extern void cons_fix_new_arm (fragS *, int, int, expressionS *); extern void cons_fix_new_arm (fragS *, int, int, expressionS *,
bfd_reloc_code_real_type);
extern void arm_init_frag (struct frag *, int); extern void arm_init_frag (struct frag *, int);
extern void arm_handle_align (struct frag *); extern void arm_handle_align (struct frag *);
extern bfd_boolean arm_fix_adjustable (struct fix *); extern bfd_boolean arm_fix_adjustable (struct fix *);

View File

@ -1521,22 +1521,7 @@ md_assemble (char *str)
} }
} }
typedef struct const exp_mod_data_t exp_mod_data[] =
{
/* Name of the expression modifier allowed with .byte, .word, etc. */
const char *name;
/* Only allowed with n bytes of data. */
int nbytes;
/* Associated RELOC. */
bfd_reloc_code_real_type reloc;
/* Part of the error message. */
const char *error;
} exp_mod_data_t;
static const exp_mod_data_t exp_mod_data[] =
{ {
/* Default, must be first. */ /* Default, must be first. */
{ "", 0, BFD_RELOC_16, "" }, { "", 0, BFD_RELOC_16, "" },
@ -1557,21 +1542,16 @@ static const exp_mod_data_t exp_mod_data[] =
{ NULL, 0, 0, NULL } { NULL, 0, 0, NULL }
}; };
/* Data to pass between `avr_parse_cons_expression' and `avr_cons_fix_new'. */
static const exp_mod_data_t *pexp_mod_data = &exp_mod_data[0];
/* Parse special CONS expression: pm (expression) or alternatively /* Parse special CONS expression: pm (expression) or alternatively
gs (expression). These are used for addressing program memory. Moreover, gs (expression). These are used for addressing program memory. Moreover,
define lo8 (expression), hi8 (expression) and hlo8 (expression). */ define lo8 (expression), hi8 (expression) and hlo8 (expression). */
void const exp_mod_data_t *
avr_parse_cons_expression (expressionS *exp, int nbytes) avr_parse_cons_expression (expressionS *exp, int nbytes)
{ {
const exp_mod_data_t *pexp = &exp_mod_data[0]; const exp_mod_data_t *pexp = &exp_mod_data[0];
char *tmp; char *tmp;
pexp_mod_data = pexp;
tmp = input_line_pointer = skip_space (input_line_pointer); tmp = input_line_pointer = skip_space (input_line_pointer);
/* The first entry of exp_mod_data[] contains an entry if no /* The first entry of exp_mod_data[] contains an entry if no
@ -1589,18 +1569,18 @@ avr_parse_cons_expression (expressionS *exp, int nbytes)
if (*input_line_pointer == '(') if (*input_line_pointer == '(')
{ {
input_line_pointer = skip_space (input_line_pointer + 1); input_line_pointer = skip_space (input_line_pointer + 1);
pexp_mod_data = pexp;
expression (exp); expression (exp);
if (*input_line_pointer == ')') if (*input_line_pointer == ')')
++input_line_pointer; {
++input_line_pointer;
return pexp;
}
else else
{ {
as_bad (_("`)' required")); as_bad (_("`)' required"));
pexp_mod_data = &exp_mod_data[0]; return &exp_mod_data[0];
} }
return;
} }
input_line_pointer = tmp; input_line_pointer = tmp;
@ -1610,13 +1590,15 @@ avr_parse_cons_expression (expressionS *exp, int nbytes)
} }
expression (exp); expression (exp);
return &exp_mod_data[0];
} }
void void
avr_cons_fix_new (fragS *frag, avr_cons_fix_new (fragS *frag,
int where, int where,
int nbytes, int nbytes,
expressionS *exp) expressionS *exp,
const exp_mod_data_t *pexp_mod_data)
{ {
int bad = 0; int bad = 0;
@ -1646,8 +1628,6 @@ avr_cons_fix_new (fragS *frag,
if (bad) if (bad)
as_bad (_("illegal %srelocation size: %d"), pexp_mod_data->error, nbytes); as_bad (_("illegal %srelocation size: %d"), pexp_mod_data->error, nbytes);
pexp_mod_data = &exp_mod_data[0];
} }
static bfd_boolean static bfd_boolean

View File

@ -50,16 +50,36 @@
will point to the start of the expression. */ will point to the start of the expression. */
#define md_operand(x) #define md_operand(x)
typedef struct
{
/* Name of the expression modifier allowed with .byte, .word, etc. */
const char *name;
/* Only allowed with n bytes of data. */
int nbytes;
/* Associated RELOC. */
bfd_reloc_code_real_type reloc;
/* Part of the error message. */
const char *error;
} exp_mod_data_t;
extern const exp_mod_data_t exp_mod_data[];
#define TC_PARSE_CONS_RETURN_TYPE const exp_mod_data_t *
#define TC_PARSE_CONS_RETURN_NONE exp_mod_data
/* You may define this macro to parse an expression used in a data /* You may define this macro to parse an expression used in a data
allocation pseudo-op such as `.word'. You can use this to allocation pseudo-op such as `.word'. You can use this to
recognize relocation directives that may appear in such directives. */ recognize relocation directives that may appear in such directives. */
#define TC_PARSE_CONS_EXPRESSION(EXPR,N) avr_parse_cons_expression (EXPR, N) #define TC_PARSE_CONS_EXPRESSION(EXPR,N) avr_parse_cons_expression (EXPR, N)
extern void avr_parse_cons_expression (expressionS *, int); extern const exp_mod_data_t *avr_parse_cons_expression (expressionS *, int);
/* You may define this macro to generate a fixup for a data /* You may define this macro to generate a fixup for a data
allocation pseudo-op. */ allocation pseudo-op. */
#define TC_CONS_FIX_NEW(FRAG,WHERE,N,EXP) avr_cons_fix_new (FRAG, WHERE, N, EXP) #define TC_CONS_FIX_NEW avr_cons_fix_new
extern void avr_cons_fix_new (fragS *,int, int, expressionS *); extern void avr_cons_fix_new (fragS *,int, int, expressionS *,
const exp_mod_data_t *);
/* This should just call either `number_to_chars_bigendian' or /* This should just call either `number_to_chars_bigendian' or
`number_to_chars_littleendian', whichever is appropriate. On `number_to_chars_littleendian', whichever is appropriate. On

View File

@ -492,10 +492,9 @@ cr16_force_relocation (fixS *fix)
/* Record a fixup for a cons expression. */ /* Record a fixup for a cons expression. */
void void
cr16_cons_fix_new (fragS *frag, int offset, int len, expressionS *exp) cr16_cons_fix_new (fragS *frag, int offset, int len, expressionS *exp,
bfd_reloc_code_real_type rtype)
{ {
int rtype = BFD_RELOC_UNUSED;
switch (len) switch (len)
{ {
default: rtype = BFD_RELOC_NONE; break; default: rtype = BFD_RELOC_NONE; break;

View File

@ -57,12 +57,13 @@ extern int cr16_force_relocation (struct fix *);
of two bytes long. */ of two bytes long. */
#define DWARF2_LINE_MIN_INSN_LENGTH 2 #define DWARF2_LINE_MIN_INSN_LENGTH 2
extern void cr16_cons_fix_new (struct frag *, int, int, struct expressionS *); extern void cr16_cons_fix_new (struct frag *, int, int, struct expressionS *,
bfd_reloc_code_real_type);
/* This is called by emit_expr when creating a reloc for a cons. /* This is called by emit_expr when creating a reloc for a cons.
We could use the definition there, except that we want to handle We could use the definition there, except that we want to handle
the CR16 reloc type specially, rather than the BFD_RELOC type. */ the CR16 reloc type specially, rather than the BFD_RELOC type. */
#define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP) \ #define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP, RELOC) \
cr16_cons_fix_new (FRAG, OFF, LEN, EXP) cr16_cons_fix_new (FRAG, OFF, LEN, EXP, RELOC)
/* Give an error if a frag containing code is not aligned to a 2-byte /* Give an error if a frag containing code is not aligned to a 2-byte
boundary. */ boundary. */

View File

@ -60,7 +60,8 @@ extern int crx_force_relocation (struct fix *);
/* This is called by emit_expr when creating a reloc for a cons. /* This is called by emit_expr when creating a reloc for a cons.
We could use the definition there, except that we want to handle We could use the definition there, except that we want to handle
the CRX reloc type specially, rather than the BFD_RELOC type. */ the CRX reloc type specially, rather than the BFD_RELOC type. */
#define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP) \ #define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP, RELOC) \
(void) RELOC, \
fix_new_exp (FRAG, OFF, (int) LEN, EXP, 0, \ fix_new_exp (FRAG, OFF, (int) LEN, EXP, 0, \
LEN == 1 ? BFD_RELOC_CRX_NUM8 \ LEN == 1 ? BFD_RELOC_CRX_NUM8 \
: LEN == 2 ? BFD_RELOC_CRX_NUM16 \ : LEN == 2 ? BFD_RELOC_CRX_NUM16 \

View File

@ -606,9 +606,6 @@ static int within_procedure;
seen in each subspace. */ seen in each subspace. */
static label_symbol_struct *label_symbols_rootp = NULL; static label_symbol_struct *label_symbols_rootp = NULL;
/* Holds the last field selector. */
static int hppa_field_selector;
/* Nonzero when strict matching is enabled. Zero otherwise. /* Nonzero when strict matching is enabled. Zero otherwise.
Each opcode in the table has a flag which indicates whether or Each opcode in the table has a flag which indicates whether or
@ -1263,7 +1260,8 @@ fix_new_hppa (fragS *frag,
hppa_field_selector is set by the parse_cons_expression_hppa. */ hppa_field_selector is set by the parse_cons_expression_hppa. */
void void
cons_fix_new_hppa (fragS *frag, int where, int size, expressionS *exp) cons_fix_new_hppa (fragS *frag, int where, int size, expressionS *exp,
int hppa_field_selector)
{ {
unsigned int rel_type; unsigned int rel_type;
@ -1300,9 +1298,6 @@ cons_fix_new_hppa (fragS *frag, int where, int size, expressionS *exp)
fix_new_hppa (frag, where, size, fix_new_hppa (frag, where, size,
(symbolS *) NULL, (offsetT) 0, exp, 0, rel_type, (symbolS *) NULL, (offsetT) 0, exp, 0, rel_type,
hppa_field_selector, size * 8, 0, 0); hppa_field_selector, size * 8, 0, 0);
/* Reset field selector to its default state. */
hppa_field_selector = 0;
} }
/* Mark (via expr_end) the end of an expression (I think). FIXME. */ /* Mark (via expr_end) the end of an expression (I think). FIXME. */
@ -2517,11 +2512,12 @@ pa_chk_field_selector (char **str)
/* Parse a .byte, .word, .long expression for the HPPA. Called by /* Parse a .byte, .word, .long expression for the HPPA. Called by
cons via the TC_PARSE_CONS_EXPRESSION macro. */ cons via the TC_PARSE_CONS_EXPRESSION macro. */
void int
parse_cons_expression_hppa (expressionS *exp) parse_cons_expression_hppa (expressionS *exp)
{ {
hppa_field_selector = pa_chk_field_selector (&input_line_pointer); int hppa_field_selector = pa_chk_field_selector (&input_line_pointer);
expression (exp); expression (exp);
return hppa_field_selector;
} }
/* Evaluate an absolute expression EXP which may be modified by /* Evaluate an absolute expression EXP which may be modified by

View File

@ -90,8 +90,8 @@
/* pa_define_label gets used outside of tc-hppa.c via tc_frob_label. */ /* pa_define_label gets used outside of tc-hppa.c via tc_frob_label. */
extern void pa_define_label (symbolS *); extern void pa_define_label (symbolS *);
extern void parse_cons_expression_hppa (expressionS *); extern int parse_cons_expression_hppa (expressionS *);
extern void cons_fix_new_hppa (fragS *, int, int, expressionS *); extern void cons_fix_new_hppa (fragS *, int, int, expressionS *, int);
extern int hppa_force_relocation (struct fix *); extern int hppa_force_relocation (struct fix *);
/* This gets called before writing the object file to make sure /* This gets called before writing the object file to make sure
@ -112,6 +112,8 @@ extern const char hppa_symbol_chars[];
#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \ #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
parse_cons_expression_hppa (EXP) parse_cons_expression_hppa (EXP)
#define TC_CONS_FIX_NEW cons_fix_new_hppa #define TC_CONS_FIX_NEW cons_fix_new_hppa
#define TC_PARSE_CONS_RETURN_TYPE int
#define TC_PARSE_CONS_RETURN_NONE e_fsel
/* On the PA, an exclamation point can appear in an instruction. It is /* On the PA, an exclamation point can appear in an instruction. It is
used in FP comparison instructions and as an end of line marker. used in FP comparison instructions and as an end of line marker.

View File

@ -7334,16 +7334,13 @@ output_imm (fragS *insn_start_frag, offsetT insn_start_off)
/* x86_cons_fix_new is called via the expression parsing code when a /* x86_cons_fix_new is called via the expression parsing code when a
reloc is needed. We use this hook to get the correct .got reloc. */ reloc is needed. We use this hook to get the correct .got reloc. */
static enum bfd_reloc_code_real got_reloc = NO_RELOC;
static int cons_sign = -1; static int cons_sign = -1;
void void
x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len, x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
expressionS *exp) expressionS *exp, bfd_reloc_code_real_type r)
{ {
enum bfd_reloc_code_real r = reloc (len, 0, cons_sign, 0, got_reloc); r = reloc (len, 0, cons_sign, 0, r);
got_reloc = NO_RELOC;
#ifdef TE_PE #ifdef TE_PE
if (exp->X_op == O_secrel) if (exp->X_op == O_secrel)
@ -7639,9 +7636,11 @@ lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
#endif /* TE_PE */ #endif /* TE_PE */
void bfd_reloc_code_real_type
x86_cons (expressionS *exp, int size) x86_cons (expressionS *exp, int size)
{ {
bfd_reloc_code_real_type got_reloc = NO_RELOC;
intel_syntax = -intel_syntax; intel_syntax = -intel_syntax;
exp->X_md = 0; exp->X_md = 0;
@ -7688,6 +7687,8 @@ x86_cons (expressionS *exp, int size)
if (intel_syntax) if (intel_syntax)
i386_intel_simplify (exp); i386_intel_simplify (exp);
return got_reloc;
} }
static void static void

View File

@ -132,11 +132,12 @@ extern const char *i386_comment_chars;
#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) && !defined (LEX_AT) #if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) && !defined (LEX_AT)
#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) x86_cons (EXP, NBYTES) #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) x86_cons (EXP, NBYTES)
#endif #endif
extern void x86_cons (expressionS *, int); extern bfd_reloc_code_real_type x86_cons (expressionS *, int);
#define TC_CONS_FIX_NEW(FRAG,OFF,LEN,EXP) x86_cons_fix_new(FRAG, OFF, LEN, EXP) #define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP, RELOC) \
x86_cons_fix_new(FRAG, OFF, LEN, EXP, RELOC)
extern void x86_cons_fix_new extern void x86_cons_fix_new
(fragS *, unsigned int, unsigned int, expressionS *); (fragS *, unsigned int, unsigned int, expressionS *, bfd_reloc_code_real_type);
#define TC_ADDRESS_BYTES x86_address_bytes #define TC_ADDRESS_BYTES x86_address_bytes
extern int x86_address_bytes (void); extern int x86_address_bytes (void);

View File

@ -4466,14 +4466,15 @@ dot_endp (int dummy ATTRIBUTE_UNUSED)
symbol_get_frag (unwind.proc_pending.sym)); symbol_get_frag (unwind.proc_pending.sym));
else else
e.X_add_symbol = unwind.proc_pending.sym; e.X_add_symbol = unwind.proc_pending.sym;
ia64_cons_fix_new (frag_now, where, bytes_per_address, &e); ia64_cons_fix_new (frag_now, where, bytes_per_address, &e,
BFD_RELOC_NONE);
e.X_op = O_pseudo_fixup; e.X_op = O_pseudo_fixup;
e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym; e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
e.X_add_number = 0; e.X_add_number = 0;
e.X_add_symbol = proc_end; e.X_add_symbol = proc_end;
ia64_cons_fix_new (frag_now, where + bytes_per_address, ia64_cons_fix_new (frag_now, where + bytes_per_address,
bytes_per_address, &e); bytes_per_address, &e, BFD_RELOC_NONE);
if (unwind.info) if (unwind.info)
{ {
@ -4482,7 +4483,7 @@ dot_endp (int dummy ATTRIBUTE_UNUSED)
e.X_add_number = 0; e.X_add_number = 0;
e.X_add_symbol = unwind.info; e.X_add_symbol = unwind.info;
ia64_cons_fix_new (frag_now, where + (bytes_per_address * 2), ia64_cons_fix_new (frag_now, where + (bytes_per_address * 2),
bytes_per_address, &e); bytes_per_address, &e, BFD_RELOC_NONE);
} }
} }
subseg_set (saved_seg, saved_subseg); subseg_set (saved_seg, saved_subseg);
@ -11056,9 +11057,9 @@ ia64_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
fixup. We pick the right reloc code depending on the byteorder fixup. We pick the right reloc code depending on the byteorder
currently in effect. */ currently in effect. */
void void
ia64_cons_fix_new (fragS *f, int where, int nbytes, expressionS *exp) ia64_cons_fix_new (fragS *f, int where, int nbytes, expressionS *exp,
bfd_reloc_code_real_type code)
{ {
bfd_reloc_code_real_type code;
fixS *fix; fixS *fix;
switch (nbytes) switch (nbytes)

View File

@ -106,7 +106,8 @@ extern void ia64_cons_align (int);
extern void ia64_flush_insns (void); extern void ia64_flush_insns (void);
extern int ia64_fix_adjustable (struct fix *); extern int ia64_fix_adjustable (struct fix *);
extern int ia64_force_relocation (struct fix *); extern int ia64_force_relocation (struct fix *);
extern void ia64_cons_fix_new (fragS *, int, int, expressionS *); extern void ia64_cons_fix_new (fragS *, int, int, expressionS *,
bfd_reloc_code_real_type);
extern void ia64_validate_fix (struct fix *); extern void ia64_validate_fix (struct fix *);
extern char * ia64_canonicalize_symbol_name (char *); extern char * ia64_canonicalize_symbol_name (char *);
extern bfd_vma ia64_elf_section_letter (int, char **); extern bfd_vma ia64_elf_section_letter (int, char **);
@ -148,7 +149,7 @@ extern void ia64_convert_frag (fragS *);
#define md_elf_section_flags ia64_elf_section_flags #define md_elf_section_flags ia64_elf_section_flags
#define TC_FIX_TYPE struct ia64_fix #define TC_FIX_TYPE struct ia64_fix
#define TC_INIT_FIX_DATA(f) { f->tc_fix_data.opnd = 0; } #define TC_INIT_FIX_DATA(f) { f->tc_fix_data.opnd = 0; }
#define TC_CONS_FIX_NEW(f,o,l,e) ia64_cons_fix_new (f, o, l, e) #define TC_CONS_FIX_NEW(f,o,l,e,r) ia64_cons_fix_new (f, o, l, e, r)
#define TC_VALIDATE_FIX(fix,seg,skip) ia64_validate_fix (fix) #define TC_VALIDATE_FIX(fix,seg,skip) ia64_validate_fix (fix)
#define MD_PCREL_FROM_SECTION(fix,sec) ia64_pcrel_from_section (fix, sec) #define MD_PCREL_FROM_SECTION(fix,sec) ia64_pcrel_from_section (fix, sec)
#define md_section_align(seg,size) (size) #define md_section_align(seg,size) (size)

View File

@ -1019,10 +1019,9 @@ void
m32c_cons_fix_new (fragS * frag, m32c_cons_fix_new (fragS * frag,
int where, int where,
int size, int size,
expressionS *exp) expressionS *exp,
bfd_reloc_code_real_type type)
{ {
bfd_reloc_code_real_type type;
switch (size) switch (size)
{ {
case 1: case 1:

View File

@ -57,9 +57,10 @@ extern bfd_boolean m32c_fix_adjustable (struct fix *);
#define TC_FORCE_RELOCATION(fix) m32c_force_relocation (fix) #define TC_FORCE_RELOCATION(fix) m32c_force_relocation (fix)
extern int m32c_force_relocation (struct fix *); extern int m32c_force_relocation (struct fix *);
#define TC_CONS_FIX_NEW(FRAG, WHERE, NBYTES, EXP) \ #define TC_CONS_FIX_NEW(FRAG, WHERE, NBYTES, EXP, RELOC) \
m32c_cons_fix_new (FRAG, WHERE, NBYTES, EXP) m32c_cons_fix_new (FRAG, WHERE, NBYTES, EXP, RELOC)
extern void m32c_cons_fix_new (fragS *, int, int, expressionS *); extern void m32c_cons_fix_new (fragS *, int, int, expressionS *,
bfd_reloc_code_real_type);
extern const struct relax_type md_relax_table[]; extern const struct relax_type md_relax_table[];
#define TC_GENERIC_RELAX_TABLE md_relax_table #define TC_GENERIC_RELAX_TABLE md_relax_table

View File

@ -802,7 +802,7 @@ check_got (int * got_type, int * got_len)
return tmpbuf; return tmpbuf;
} }
extern void extern bfd_reloc_code_real_type
parse_cons_expression_microblaze (expressionS *exp, int size) parse_cons_expression_microblaze (expressionS *exp, int size)
{ {
if (size == 4) if (size == 4)
@ -828,6 +828,7 @@ parse_cons_expression_microblaze (expressionS *exp, int size)
} }
else else
expression (exp); expression (exp);
return BFD_RELOC_NONE;
} }
/* This is the guts of the machine-dependent assembler. STR points to a /* This is the guts of the machine-dependent assembler. STR points to a
@ -2485,11 +2486,9 @@ void
cons_fix_new_microblaze (fragS * frag, cons_fix_new_microblaze (fragS * frag,
int where, int where,
int size, int size,
expressionS *exp) expressionS *exp,
bfd_reloc_code_real_type r)
{ {
bfd_reloc_code_real_type r;
if ((exp->X_op == O_subtract) && (exp->X_add_symbol) && if ((exp->X_op == O_subtract) && (exp->X_add_symbol) &&
(exp->X_op_symbol) && (now_seg != absolute_section) && (size == 4) (exp->X_op_symbol) && (now_seg != absolute_section) && (size == 4)
&& (!S_IS_LOCAL (exp->X_op_symbol))) && (!S_IS_LOCAL (exp->X_op_symbol)))

View File

@ -36,8 +36,10 @@
relocs for such expressions as -relax in linker can change the value relocs for such expressions as -relax in linker can change the value
of such expressions */ of such expressions */
#define TC_CONS_FIX_NEW cons_fix_new_microblaze #define TC_CONS_FIX_NEW cons_fix_new_microblaze
#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_cons_expression_microblaze (EXP, NBYTES) #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
extern void parse_cons_expression_microblaze (expressionS *, int); parse_cons_expression_microblaze (EXP, NBYTES)
extern bfd_reloc_code_real_type parse_cons_expression_microblaze
(expressionS *, int);
#define TC_FORCE_RELOCATION_SECTION(FIXP,SEG) 1 #define TC_FORCE_RELOCATION_SECTION(FIXP,SEG) 1
#define UNDEFINED_DIFFERENCE_OK 1 #define UNDEFINED_DIFFERENCE_OK 1
@ -108,7 +110,9 @@ extern void md_number_to_chars (char *, valueT, int);
extern valueT md_section_align (segT, valueT); extern valueT md_section_align (segT, valueT);
extern long md_pcrel_from_section (fixS *, segT); extern long md_pcrel_from_section (fixS *, segT);
extern arelent * tc_gen_reloc (asection *, fixS *); extern arelent * tc_gen_reloc (asection *, fixS *);
extern void cons_fix_new_microblaze (fragS *, int, int, expressionS *); extern void cons_fix_new_microblaze (fragS *, int, int,
expressionS *,
bfd_reloc_code_real_type);
extern void md_apply_fix3 (fixS *, valueT *, segT); extern void md_apply_fix3 (fixS *, valueT *, segT);
#define EXTERN_FORCE_RELOC -1 #define EXTERN_FORCE_RELOC -1

View File

@ -1013,7 +1013,8 @@ mn10300_check_fixup (struct mn10300_fixup *fixup)
} }
void void
mn10300_cons_fix_new (fragS *frag, int off, int size, expressionS *exp) mn10300_cons_fix_new (fragS *frag, int off, int size, expressionS *exp,
bfd_reloc_code_real_type r ATTRIBUTE_UNUSED)
{ {
struct mn10300_fixup fixup; struct mn10300_fixup fixup;

View File

@ -39,9 +39,10 @@ extern bfd_boolean mn10300_force_relocation (struct fix *);
mn10300_parse_name ((NAME), (EXPRP), (MODE), (NEXTCHARP)) mn10300_parse_name ((NAME), (EXPRP), (MODE), (NEXTCHARP))
int mn10300_parse_name (char const *, expressionS *, enum expr_mode, char *); int mn10300_parse_name (char const *, expressionS *, enum expr_mode, char *);
#define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP) \ #define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP, RELOC) \
mn10300_cons_fix_new ((FRAG), (OFF), (LEN), (EXP)) mn10300_cons_fix_new ((FRAG), (OFF), (LEN), (EXP), (RELOC))
void mn10300_cons_fix_new (fragS *, int, int, expressionS *); void mn10300_cons_fix_new (fragS *, int, int, expressionS *,
bfd_reloc_code_real_type);
/* This is used to construct expressions out of @GOTOFF, @PLT and @GOT /* This is used to construct expressions out of @GOTOFF, @PLT and @GOT
symbols. The relocation type is stored in X_md. */ symbols. The relocation type is stored in X_md. */

View File

@ -3003,12 +3003,10 @@ nios2_elf_section_flags (flagword flags, int attr, int type ATTRIBUTE_UNUSED)
} }
/* Implement TC_PARSE_CONS_EXPRESSION to handle %tls_ldo(...) */ /* Implement TC_PARSE_CONS_EXPRESSION to handle %tls_ldo(...) */
static int nios2_tls_ldo_reloc; bfd_reloc_code_real_type
void
nios2_cons (expressionS *exp, int size) nios2_cons (expressionS *exp, int size)
{ {
nios2_tls_ldo_reloc = 0; bfd_reloc_code_real_type nios2_tls_ldo_reloc = BFD_RELOC_NONE;
SKIP_WHITESPACE (); SKIP_WHITESPACE ();
if (input_line_pointer[0] == '%') if (input_line_pointer[0] == '%')
@ -3021,10 +3019,10 @@ nios2_cons (expressionS *exp, int size)
else else
{ {
input_line_pointer += 8; input_line_pointer += 8;
nios2_tls_ldo_reloc = 1; nios2_tls_ldo_reloc = BFD_RELOC_NIOS2_TLS_DTPREL;
} }
} }
if (nios2_tls_ldo_reloc) if (nios2_tls_ldo_reloc != BFD_RELOC_NONE)
{ {
SKIP_WHITESPACE (); SKIP_WHITESPACE ();
if (input_line_pointer[0] != '(') if (input_line_pointer[0] != '(')
@ -3066,26 +3064,9 @@ nios2_cons (expressionS *exp, int size)
} }
} }
} }
if (!nios2_tls_ldo_reloc) if (nios2_tls_ldo_reloc == BFD_RELOC_NONE)
expression (exp); expression (exp);
} return nios2_tls_ldo_reloc;
/* Implement TC_CONS_FIX_NEW. */
void
nios2_cons_fix_new (fragS *frag, int where, unsigned int nbytes,
expressionS *exp)
{
bfd_reloc_code_real_type r;
r = (nbytes == 1 ? BFD_RELOC_8
: (nbytes == 2 ? BFD_RELOC_16
: (nbytes == 4 ? BFD_RELOC_32 : BFD_RELOC_64)));
if (nios2_tls_ldo_reloc)
r = BFD_RELOC_NIOS2_TLS_DTPREL;
fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
nios2_tls_ldo_reloc = 0;
} }
/* Implement HANDLE_ALIGN. */ /* Implement HANDLE_ALIGN. */

View File

@ -107,11 +107,7 @@ extern flagword nios2_elf_section_flags (flagword, int, int);
#define CFI_DIFF_EXPR_OK 0 #define CFI_DIFF_EXPR_OK 0
#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) nios2_cons (EXP, NBYTES) #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) nios2_cons (EXP, NBYTES)
extern void nios2_cons (expressionS *exp, int size); extern bfd_reloc_code_real_type nios2_cons (expressionS *exp, int size);
#define TC_CONS_FIX_NEW nios2_cons_fix_new
extern void nios2_cons_fix_new (struct frag *frag, int where,
unsigned int nbytes, struct expressionS *exp);
/* We want .cfi_* pseudo-ops for generating unwind info. */ /* We want .cfi_* pseudo-ops for generating unwind info. */
#define TARGET_USE_CFIPOP 1 #define TARGET_USE_CFIPOP 1

View File

@ -2181,7 +2181,8 @@ void
cons_fix_new_ns32k (fragS *frag, /* Which frag? */ cons_fix_new_ns32k (fragS *frag, /* Which frag? */
int where, /* Where in that frag? */ int where, /* Where in that frag? */
int size, /* 1, 2 or 4 usually. */ int size, /* 1, 2 or 4 usually. */
expressionS *exp) /* Expression. */ expressionS *exp, /* Expression. */
bfd_reloc_code_real_type r ATTRIBUTE_UNUSED)
{ {
fix_new_ns32k_exp (frag, where, size, exp, fix_new_ns32k_exp (frag, where, size, exp,
0, 2, 0, 0, 0, 0); 0, 2, 0, 0, 0, 0);

View File

@ -54,7 +54,8 @@ extern int md_pcrel_adjust (fragS *);
#define ARG_LEN 50 #define ARG_LEN 50
#define TC_CONS_FIX_NEW cons_fix_new_ns32k #define TC_CONS_FIX_NEW cons_fix_new_ns32k
extern void cons_fix_new_ns32k (fragS *, int, int, expressionS *); extern void cons_fix_new_ns32k (fragS *, int, int, expressionS *,
bfd_reloc_code_real_type);
/* The NS32x32 has a non 0 nop instruction which should be used in aligns. */ /* The NS32x32 has a non 0 nop instruction which should be used in aligns. */
#define NOP_OPCODE 0xa2 #define NOP_OPCODE 0xa2

View File

@ -96,7 +96,8 @@ parse_exp_save_ilp (char *s, expressionS *op)
we want to handle magic pending reloc expressions specially. */ we want to handle magic pending reloc expressions specially. */
void void
pj_cons_fix_new_pj (fragS *frag, int where, int nbytes, expressionS *exp) pj_cons_fix_new_pj (fragS *frag, int where, int nbytes, expressionS *exp,
bfd_reloc_code_real_type r ATTRIBUTE_UNUSED)
{ {
static int rv[5][2] = static int rv[5][2] =
{ { 0, 0 }, { { 0, 0 },

View File

@ -31,7 +31,8 @@
? "Pico Java GAS Big Endian" \ ? "Pico Java GAS Big Endian" \
: "Pico Java GAS Little Endian") : "Pico Java GAS Little Endian")
void pj_cons_fix_new_pj (struct frag *, int, int, expressionS *); void pj_cons_fix_new_pj (struct frag *, int, int, expressionS *,
bfd_reloc_code_real_type);
arelent *tc_gen_reloc (asection *, struct fix *); arelent *tc_gen_reloc (asection *, struct fix *);
#define md_section_align(SEGMENT, SIZE) (SIZE) #define md_section_align(SEGMENT, SIZE) (SIZE)
@ -45,8 +46,8 @@ arelent *tc_gen_reloc (asection *, struct fix *);
#define md_pcrel_from(FIX) \ #define md_pcrel_from(FIX) \
((FIX)->fx_where + (FIX)->fx_frag->fr_address - 1) ((FIX)->fx_where + (FIX)->fx_frag->fr_address - 1)
#define TC_CONS_FIX_NEW(FRAG, WHERE, NBYTES, EXP) \ #define TC_CONS_FIX_NEW(FRAG, WHERE, NBYTES, EXP, RELOC) \
pj_cons_fix_new_pj (FRAG, WHERE, NBYTES, EXP) pj_cons_fix_new_pj (FRAG, WHERE, NBYTES, EXP, RELOC)
/* No shared lib support, so we don't need to ensure externally /* No shared lib support, so we don't need to ensure externally
visible symbols can be overridden. */ visible symbols can be overridden. */

View File

@ -129,7 +129,6 @@ static void ppc_vbyte (int);
#endif #endif
#ifdef OBJ_ELF #ifdef OBJ_ELF
static void ppc_elf_cons (int);
static void ppc_elf_rdata (int); static void ppc_elf_rdata (int);
static void ppc_elf_lcomm (int); static void ppc_elf_lcomm (int);
static void ppc_elf_localentry (int); static void ppc_elf_localentry (int);
@ -257,11 +256,7 @@ const pseudo_typeS md_pseudo_table[] =
#endif #endif
#ifdef OBJ_ELF #ifdef OBJ_ELF
{ "llong", ppc_elf_cons, 8 }, { "llong", cons, 8 },
{ "quad", ppc_elf_cons, 8 },
{ "long", ppc_elf_cons, 4 },
{ "word", ppc_elf_cons, 2 },
{ "short", ppc_elf_cons, 2 },
{ "rdata", ppc_elf_rdata, 0 }, { "rdata", ppc_elf_rdata, 0 },
{ "rodata", ppc_elf_rdata, 0 }, { "rodata", ppc_elf_rdata, 0 },
{ "lcomm", ppc_elf_lcomm, 0 }, { "lcomm", ppc_elf_lcomm, 0 },
@ -1957,11 +1952,11 @@ ppc_elf_suffix (char **str_p, expressionS *exp_p)
MAP64 ("tprel@highera", BFD_RELOC_PPC64_TPREL16_HIGHERA), MAP64 ("tprel@highera", BFD_RELOC_PPC64_TPREL16_HIGHERA),
MAP64 ("tprel@highest", BFD_RELOC_PPC64_TPREL16_HIGHEST), MAP64 ("tprel@highest", BFD_RELOC_PPC64_TPREL16_HIGHEST),
MAP64 ("tprel@highesta", BFD_RELOC_PPC64_TPREL16_HIGHESTA), MAP64 ("tprel@highesta", BFD_RELOC_PPC64_TPREL16_HIGHESTA),
{ (char *) 0, 0, 0, 0, BFD_RELOC_UNUSED } { (char *) 0, 0, 0, 0, BFD_RELOC_NONE }
}; };
if (*str++ != '@') if (*str++ != '@')
return BFD_RELOC_UNUSED; return BFD_RELOC_NONE;
for (ch = *str, str2 = ident; for (ch = *str, str2 = ident;
(str2 < ident + sizeof (ident) - 1 (str2 < ident + sizeof (ident) - 1
@ -2047,63 +2042,18 @@ ppc_elf_suffix (char **str_p, expressionS *exp_p)
return (bfd_reloc_code_real_type) reloc; return (bfd_reloc_code_real_type) reloc;
} }
return BFD_RELOC_UNUSED; return BFD_RELOC_NONE;
} }
/* Like normal .long/.short/.word, except support @got, etc. /* Support @got, etc. on constants emitted via .short, .int etc. */
Clobbers input_line_pointer, checks end-of-line. */
static void bfd_reloc_code_real_type
ppc_elf_cons (int nbytes /* 1=.byte, 2=.word, 4=.long, 8=.llong */) ppc_elf_parse_cons (expressionS *exp, unsigned int nbytes)
{ {
expressionS exp; expression (exp);
bfd_reloc_code_real_type reloc; if (nbytes >= 2 && *input_line_pointer == '@')
return ppc_elf_suffix (&input_line_pointer, exp);
if (is_it_end_of_statement ()) return BFD_RELOC_NONE;
{
demand_empty_rest_of_line ();
return;
}
do
{
expression (&exp);
if (*input_line_pointer == '@'
&& (reloc = ppc_elf_suffix (&input_line_pointer,
&exp)) != BFD_RELOC_UNUSED)
{
reloc_howto_type *reloc_howto;
int size;
reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc);
size = bfd_get_reloc_size (reloc_howto);
if (size > nbytes)
{
as_bad (_("%s relocations do not fit in %d bytes\n"),
reloc_howto->name, nbytes);
}
else
{
char *p;
int offset;
p = frag_more (nbytes);
memset (p, 0, nbytes);
offset = 0;
if (target_big_endian)
offset = nbytes - size;
fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size,
&exp, 0, reloc);
}
}
else
emit_expr (&exp, (unsigned int) nbytes);
}
while (*input_line_pointer++ == ',');
/* Put terminator back into stream. */
input_line_pointer--;
demand_empty_rest_of_line ();
} }
/* Solaris pseduo op to change to the .rodata section. */ /* Solaris pseduo op to change to the .rodata section. */
@ -2338,8 +2288,7 @@ ppc_elf_validate_fix (fixS *fixp, segT seg)
return; return;
case SHLIB_MRELOCATABLE: case SHLIB_MRELOCATABLE:
if (fixp->fx_r_type <= BFD_RELOC_UNUSED if (fixp->fx_r_type != BFD_RELOC_16_GOTOFF
&& fixp->fx_r_type != BFD_RELOC_16_GOTOFF
&& fixp->fx_r_type != BFD_RELOC_HI16_GOTOFF && fixp->fx_r_type != BFD_RELOC_HI16_GOTOFF
&& fixp->fx_r_type != BFD_RELOC_LO16_GOTOFF && fixp->fx_r_type != BFD_RELOC_LO16_GOTOFF
&& fixp->fx_r_type != BFD_RELOC_HI16_S_GOTOFF && fixp->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
@ -2839,12 +2788,12 @@ md_assemble (char *str)
/* FIXME: these next two specifically specify 32/64 bit /* FIXME: these next two specifically specify 32/64 bit
toc entries. We don't support them today. Is this toc entries. We don't support them today. Is this
the right way to say that? */ the right way to say that? */
toc_reloc = BFD_RELOC_UNUSED; toc_reloc = BFD_RELOC_NONE;
as_bad (_("unimplemented toc32 expression modifier")); as_bad (_("unimplemented toc32 expression modifier"));
break; break;
case must_be_64: case must_be_64:
/* FIXME: see above. */ /* FIXME: see above. */
toc_reloc = BFD_RELOC_UNUSED; toc_reloc = BFD_RELOC_NONE;
as_bad (_("unimplemented toc64 expression modifier")); as_bad (_("unimplemented toc64 expression modifier"));
break; break;
default: default:
@ -2914,7 +2863,7 @@ md_assemble (char *str)
bfd_reloc_code_real_type reloc; bfd_reloc_code_real_type reloc;
char *orig_str = str; char *orig_str = str;
if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED) if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_NONE)
switch (reloc) switch (reloc)
{ {
default: default:
@ -3000,7 +2949,7 @@ md_assemble (char *str)
} }
else else
{ {
bfd_reloc_code_real_type reloc = BFD_RELOC_UNUSED; bfd_reloc_code_real_type reloc = BFD_RELOC_NONE;
#ifdef OBJ_ELF #ifdef OBJ_ELF
if (ex.X_op == O_symbol && str[0] == '(') if (ex.X_op == O_symbol && str[0] == '(')
{ {
@ -3017,7 +2966,7 @@ md_assemble (char *str)
expression (&tls_exp); expression (&tls_exp);
if (tls_exp.X_op == O_symbol) if (tls_exp.X_op == O_symbol)
{ {
reloc = BFD_RELOC_UNUSED; reloc = BFD_RELOC_NONE;
if (strncasecmp (input_line_pointer, "@tlsgd)", 7) == 0) if (strncasecmp (input_line_pointer, "@tlsgd)", 7) == 0)
{ {
reloc = BFD_RELOC_PPC_TLSGD; reloc = BFD_RELOC_PPC_TLSGD;
@ -3028,7 +2977,7 @@ md_assemble (char *str)
reloc = BFD_RELOC_PPC_TLSLD; reloc = BFD_RELOC_PPC_TLSLD;
input_line_pointer += 7; input_line_pointer += 7;
} }
if (reloc != BFD_RELOC_UNUSED) if (reloc != BFD_RELOC_NONE)
{ {
SKIP_WHITESPACE (); SKIP_WHITESPACE ();
str = input_line_pointer; str = input_line_pointer;
@ -3045,7 +2994,7 @@ md_assemble (char *str)
} }
} }
if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED) if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_NONE)
{ {
/* Some TLS tweaks. */ /* Some TLS tweaks. */
switch (reloc) switch (reloc)
@ -3144,7 +3093,7 @@ md_assemble (char *str)
} }
#endif /* OBJ_ELF */ #endif /* OBJ_ELF */
if (reloc != BFD_RELOC_UNUSED) if (reloc != BFD_RELOC_NONE)
; ;
/* Determine a BFD reloc value based on the operand information. /* Determine a BFD reloc value based on the operand information.
We are only prepared to turn a few of the operands into We are only prepared to turn a few of the operands into
@ -3405,7 +3354,7 @@ md_assemble (char *str)
for (i = 0; i < fc; i++) for (i = 0; i < fc; i++)
{ {
fixS *fixP; fixS *fixP;
if (fixups[i].reloc != BFD_RELOC_UNUSED) if (fixups[i].reloc != BFD_RELOC_NONE)
{ {
reloc_howto_type *reloc_howto; reloc_howto_type *reloc_howto;
int size; int size;
@ -3438,7 +3387,7 @@ md_assemble (char *str)
insn_length, insn_length,
&fixups[i].exp, &fixups[i].exp,
(operand->flags & PPC_OPERAND_RELATIVE) != 0, (operand->flags & PPC_OPERAND_RELATIVE) != 0,
BFD_RELOC_UNUSED); BFD_RELOC_NONE);
} }
fixP->fx_pcrel_adjust = fixups[i].opindex; fixP->fx_pcrel_adjust = fixups[i].opindex;
} }
@ -6462,7 +6411,7 @@ ppc_handle_align (struct frag *fragP)
fixups we generated by the calls to fix_new_exp, above. */ fixups we generated by the calls to fix_new_exp, above. */
void void
md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) md_apply_fix (fixS *fixP, valueT *valP, segT seg)
{ {
valueT value = * valP; valueT value = * valP;
offsetT fieldval; offsetT fieldval;
@ -6810,7 +6759,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
return; return;
gas_assert (fixP->fx_addsy != NULL); gas_assert (fixP->fx_addsy != NULL);
if (fixP->fx_r_type == BFD_RELOC_UNUSED) if (fixP->fx_r_type == BFD_RELOC_NONE)
{ {
char *sfile; char *sfile;
unsigned int sline; unsigned int sline;

View File

@ -231,6 +231,10 @@ extern int ppc_fix_adjustable (struct fix *);
/* Values passed to md_apply_fix don't include symbol values. */ /* Values passed to md_apply_fix don't include symbol values. */
#define MD_APPLY_SYM_VALUE(FIX) 0 #define MD_APPLY_SYM_VALUE(FIX) 0
#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
ppc_elf_parse_cons (EXP, NBYTES)
extern bfd_reloc_code_real_type ppc_elf_parse_cons (expressionS *,
unsigned int);
#define tc_frob_file_before_adjust ppc_frob_file_before_adjust #define tc_frob_file_before_adjust ppc_frob_file_before_adjust
extern void ppc_frob_file_before_adjust (void); extern void ppc_frob_file_before_adjust (void);

View File

@ -2170,10 +2170,9 @@ void
rx_cons_fix_new (fragS * frag, rx_cons_fix_new (fragS * frag,
int where, int where,
int size, int size,
expressionS * exp) expressionS * exp,
bfd_reloc_code_real_type type)
{ {
bfd_reloc_code_real_type type;
switch (size) switch (size)
{ {
case 1: case 1:

View File

@ -68,9 +68,10 @@ extern long md_pcrel_from_section (struct fix *, segT);
rx_validate_fix_sub (FIX) rx_validate_fix_sub (FIX)
extern int rx_validate_fix_sub (struct fix *); extern int rx_validate_fix_sub (struct fix *);
#define TC_CONS_FIX_NEW(FRAG, WHERE, NBYTES, EXP) \ #define TC_CONS_FIX_NEW(FRAG, WHERE, NBYTES, EXP, RELOC) \
rx_cons_fix_new (FRAG, WHERE, NBYTES, EXP) rx_cons_fix_new (FRAG, WHERE, NBYTES, EXP, RELOC)
extern void rx_cons_fix_new (fragS *, int, int, expressionS *); extern void rx_cons_fix_new (fragS *, int, int, expressionS *,
bfd_reloc_code_real_type);
#define tc_fix_adjustable(x) 0 #define tc_fix_adjustable(x) 0

View File

@ -765,9 +765,10 @@ sh_check_fixup (expressionS *main_exp, bfd_reloc_code_real_type *r_type_p)
/* Add expression EXP of SIZE bytes to offset OFF of fragment FRAG. */ /* Add expression EXP of SIZE bytes to offset OFF of fragment FRAG. */
void void
sh_cons_fix_new (fragS *frag, int off, int size, expressionS *exp) sh_cons_fix_new (fragS *frag, int off, int size, expressionS *exp,
bfd_reloc_code_real_type r_type)
{ {
bfd_reloc_code_real_type r_type = BFD_RELOC_UNUSED; r_type = BFD_RELOC_UNUSED;
if (sh_check_fixup (exp, &r_type)) if (sh_check_fixup (exp, &r_type))
as_bad (_("Invalid PIC expression.")); as_bad (_("Invalid PIC expression."));

View File

@ -232,9 +232,10 @@ extern bfd_boolean sh_fix_adjustable (struct fix *);
int sh_parse_name (char const *, expressionS *, int sh_parse_name (char const *, expressionS *,
enum expr_mode, char *); enum expr_mode, char *);
#define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP) \ #define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP, RELOC) \
sh_cons_fix_new ((FRAG), (OFF), (LEN), (EXP)) sh_cons_fix_new ((FRAG), (OFF), (LEN), (EXP), (RELOC))
void sh_cons_fix_new (fragS *, int, int, expressionS *); void sh_cons_fix_new (fragS *, int, int, expressionS *,
bfd_reloc_code_real_type);
/* This is used to construct expressions out of @GOTOFF, @PLT and @GOT /* This is used to construct expressions out of @GOTOFF, @PLT and @GOT
symbols. The relocation type is stored in X_md. */ symbols. The relocation type is stored in X_md. */

View File

@ -4268,11 +4268,6 @@ s_proc (int ignore ATTRIBUTE_UNUSED)
static int sparc_no_align_cons = 0; static int sparc_no_align_cons = 0;
/* This static variable is set by sparc_cons to emit requested types
of relocations in cons_fix_new_sparc. */
static const char *sparc_cons_special_reloc;
/* This handles the unaligned space allocation pseudo-ops, such as /* This handles the unaligned space allocation pseudo-ops, such as
.uaword. .uaword is just like .word, but the value does not need .uaword. .uaword is just like .word, but the value does not need
to be aligned. */ to be aligned. */
@ -4540,13 +4535,13 @@ sparc_elf_final_processing (void)
elf_elfheader (stdoutput)->e_flags |= EF_SPARC_SUN_US1|EF_SPARC_SUN_US3; elf_elfheader (stdoutput)->e_flags |= EF_SPARC_SUN_US1|EF_SPARC_SUN_US3;
} }
void const char *
sparc_cons (expressionS *exp, int size) sparc_cons (expressionS *exp, int size)
{ {
char *save; char *save;
const char *sparc_cons_special_reloc = NULL;
SKIP_WHITESPACE (); SKIP_WHITESPACE ();
sparc_cons_special_reloc = NULL;
save = input_line_pointer; save = input_line_pointer;
if (input_line_pointer[0] == '%' if (input_line_pointer[0] == '%'
&& input_line_pointer[1] == 'r' && input_line_pointer[1] == 'r'
@ -4673,6 +4668,7 @@ sparc_cons (expressionS *exp, int size)
} }
if (sparc_cons_special_reloc == NULL) if (sparc_cons_special_reloc == NULL)
expression (exp); expression (exp);
return sparc_cons_special_reloc;
} }
#endif #endif
@ -4685,7 +4681,8 @@ void
cons_fix_new_sparc (fragS *frag, cons_fix_new_sparc (fragS *frag,
int where, int where,
unsigned int nbytes, unsigned int nbytes,
expressionS *exp) expressionS *exp,
const char *sparc_cons_special_reloc)
{ {
bfd_reloc_code_real_type r; bfd_reloc_code_real_type r;
@ -4734,7 +4731,6 @@ cons_fix_new_sparc (fragS *frag,
} }
fix_new_exp (frag, where, (int) nbytes, exp, 0, r); fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
sparc_cons_special_reloc = NULL;
} }
void void
@ -4788,9 +4784,7 @@ sparc_regname_to_dw2regnum (char *regname)
void void
sparc_cfi_emit_pcrel_expr (expressionS *exp, unsigned int nbytes) sparc_cfi_emit_pcrel_expr (expressionS *exp, unsigned int nbytes)
{ {
sparc_cons_special_reloc = "disp";
sparc_no_align_cons = 1; sparc_no_align_cons = 1;
emit_expr (exp, nbytes); emit_expr_with_reloc (exp, nbytes, "disp");
sparc_no_align_cons = 0; sparc_no_align_cons = 0;
sparc_cons_special_reloc = NULL;
} }

View File

@ -155,14 +155,17 @@ extern void sparc_md_end (void);
#endif #endif
#define TC_PARSE_CONS_RETURN_TYPE const char *
#define TC_PARSE_CONS_RETURN_NONE NULL
#ifdef OBJ_ELF #ifdef OBJ_ELF
#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) sparc_cons (EXP, NBYTES) #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) sparc_cons (EXP, NBYTES)
extern void sparc_cons (expressionS *, int); extern const char *sparc_cons (expressionS *, int);
#endif #endif
#define TC_CONS_FIX_NEW cons_fix_new_sparc #define TC_CONS_FIX_NEW cons_fix_new_sparc
extern void cons_fix_new_sparc extern void cons_fix_new_sparc
(struct frag *, int, unsigned int, struct expressionS *); (struct frag *, int, unsigned int, struct expressionS *, const char *);
#define TC_FIX_TYPE valueT #define TC_FIX_TYPE valueT

View File

@ -5121,10 +5121,9 @@ tc_gen_reloc (asection *section, fixS *fixP)
/* Handle cons expressions. */ /* Handle cons expressions. */
void void
tic54x_cons_fix_new (fragS *frag, int where, int octets, expressionS *expn) tic54x_cons_fix_new (fragS *frag, int where, int octets, expressionS *expn,
bfd_reloc_code_real_type r)
{ {
bfd_reloc_code_real_type r;
switch (octets) switch (octets)
{ {
default: default:

View File

@ -69,8 +69,10 @@ struct bit_info
extern int tic54x_start_label (int, char *); extern int tic54x_start_label (int, char *);
/* custom handling for relocations in cons expressions */ /* custom handling for relocations in cons expressions */
#define TC_CONS_FIX_NEW(FRAG,OFF,LEN,EXP) tic54x_cons_fix_new(FRAG,OFF,LEN,EXP) #define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP, RELOC) \
extern void tic54x_cons_fix_new (fragS *,int,int,expressionS *); tic54x_cons_fix_new (FRAG, OFF, LEN, EXP, RELOC)
extern void tic54x_cons_fix_new (fragS *, int, int, expressionS *,
bfd_reloc_code_real_type);
/* Define md_number_to_chars as the appropriate standard big endian or /* Define md_number_to_chars as the appropriate standard big endian or
little endian function. Mostly littleendian, but longwords and floats are little endian function. Mostly littleendian, but longwords and floats are

View File

@ -2012,10 +2012,9 @@ tic6x_fix_new_exp (fragS *frag, int where, int size, expressionS *exp,
go through the error checking in tic6x_fix_new_exp. */ go through the error checking in tic6x_fix_new_exp. */
void void
tic6x_cons_fix_new (fragS *frag, int where, int size, expressionS *exp) tic6x_cons_fix_new (fragS *frag, int where, int size, expressionS *exp,
bfd_reloc_code_real_type r_type)
{ {
bfd_reloc_code_real_type r_type;
switch (size) switch (size)
{ {
case 1: case 1:

View File

@ -184,10 +184,10 @@ extern long tic6x_pcrel_from_section (struct fix *fixp, segT sec);
#define md_start_line_hook() tic6x_start_line_hook () #define md_start_line_hook() tic6x_start_line_hook ()
extern void tic6x_start_line_hook (void); extern void tic6x_start_line_hook (void);
#define TC_CONS_FIX_NEW(frag, where, size, exp) \ #define TC_CONS_FIX_NEW(frag, where, size, exp, reloc) \
tic6x_cons_fix_new (frag, where, size, exp) tic6x_cons_fix_new (frag, where, size, exp, reloc)
extern void tic6x_cons_fix_new (fragS *frag, int where, int size, extern void tic6x_cons_fix_new (fragS *, int, int, expressionS *,
expressionS *exp); bfd_reloc_code_real_type);
#define tc_fix_adjustable(FIX) tic6x_fix_adjustable (FIX) #define tc_fix_adjustable(FIX) tic6x_fix_adjustable (FIX)
extern bfd_boolean tic6x_fix_adjustable (struct fix *); extern bfd_boolean tic6x_fix_adjustable (struct fix *);

View File

@ -27,9 +27,6 @@
/* Sign-extend a 16-bit number. */ /* Sign-extend a 16-bit number. */
#define SEXT16(x) ((((x) & 0xffff) ^ (~0x7fff)) + 0x8000) #define SEXT16(x) ((((x) & 0xffff) ^ (~0x7fff)) + 0x8000)
/* Temporarily holds the reloc in a cons expression. */
static bfd_reloc_code_real_type hold_cons_reloc = BFD_RELOC_UNUSED;
/* Set to TRUE if we want to be pedantic about signed overflows. */ /* Set to TRUE if we want to be pedantic about signed overflows. */
static bfd_boolean warn_signed_overflows = FALSE; static bfd_boolean warn_signed_overflows = FALSE;
static bfd_boolean warn_unsigned_overflows = FALSE; static bfd_boolean warn_unsigned_overflows = FALSE;
@ -2156,7 +2153,7 @@ v850_reloc_prefix (const struct v850_operand *operand, const char **errmsg)
if (paren_skipped) if (paren_skipped)
--input_line_pointer; --input_line_pointer;
return BFD_RELOC_UNUSED; return BFD_RELOC_NONE;
} }
/* Insert an operand value into an instruction. */ /* Insert an operand value into an instruction. */
@ -2407,7 +2404,7 @@ md_assemble (char *str)
input_line_pointer = str; input_line_pointer = str;
/* lo(), hi(), hi0(), etc... */ /* lo(), hi(), hi0(), etc... */
if ((reloc = v850_reloc_prefix (operand, &errmsg)) != BFD_RELOC_UNUSED) if ((reloc = v850_reloc_prefix (operand, &errmsg)) != BFD_RELOC_NONE)
{ {
/* This is a fake reloc, used to indicate an error condition. */ /* This is a fake reloc, used to indicate an error condition. */
if (reloc == BFD_RELOC_64) if (reloc == BFD_RELOC_64)
@ -2977,7 +2974,7 @@ md_assemble (char *str)
fixups[fc].exp = ex; fixups[fc].exp = ex;
fixups[fc].opindex = *opindex_ptr; fixups[fc].opindex = *opindex_ptr;
fixups[fc].reloc = BFD_RELOC_UNUSED; fixups[fc].reloc = BFD_RELOC_NONE;
++fc; ++fc;
break; break;
} }
@ -3239,7 +3236,7 @@ md_assemble (char *str)
reloc = fixups[i].reloc; reloc = fixups[i].reloc;
if (reloc != BFD_RELOC_UNUSED) if (reloc != BFD_RELOC_NONE)
{ {
reloc_howto_type *reloc_howto = reloc_howto_type *reloc_howto =
bfd_reloc_type_lookup (stdoutput, reloc); bfd_reloc_type_lookup (stdoutput, reloc);
@ -3634,15 +3631,18 @@ md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED)
/* Parse a cons expression. We have to handle hi(), lo(), etc /* Parse a cons expression. We have to handle hi(), lo(), etc
on the v850. */ on the v850. */
void bfd_reloc_code_real_type
parse_cons_expression_v850 (expressionS *exp) parse_cons_expression_v850 (expressionS *exp)
{ {
const char *errmsg; const char *errmsg;
bfd_reloc_code_real_type r;
/* See if there's a reloc prefix like hi() we have to handle. */ /* See if there's a reloc prefix like hi() we have to handle. */
hold_cons_reloc = v850_reloc_prefix (NULL, &errmsg); r = v850_reloc_prefix (NULL, &errmsg);
/* Do normal expression parsing. */ /* Do normal expression parsing. */
expression (exp); expression (exp);
return r;
} }
/* Create a fixup for a cons expression. If parse_cons_expression_v850 /* Create a fixup for a cons expression. If parse_cons_expression_v850
@ -3653,24 +3653,23 @@ void
cons_fix_new_v850 (fragS *frag, cons_fix_new_v850 (fragS *frag,
int where, int where,
int size, int size,
expressionS *exp) expressionS *exp,
bfd_reloc_code_real_type r)
{ {
if (hold_cons_reloc == BFD_RELOC_UNUSED) if (r == BFD_RELOC_NONE)
{ {
if (size == 4) if (size == 4)
hold_cons_reloc = BFD_RELOC_32; r = BFD_RELOC_32;
if (size == 2) if (size == 2)
hold_cons_reloc = BFD_RELOC_16; r = BFD_RELOC_16;
if (size == 1) if (size == 1)
hold_cons_reloc = BFD_RELOC_8; r = BFD_RELOC_8;
} }
if (exp != NULL) if (exp != NULL)
fix_new_exp (frag, where, size, exp, 0, hold_cons_reloc); fix_new_exp (frag, where, size, exp, 0, r);
else else
fix_new (frag, where, size, NULL, 0, 0, hold_cons_reloc); fix_new (frag, where, size, NULL, 0, 0, r);
hold_cons_reloc = BFD_RELOC_UNUSED;
} }
bfd_boolean bfd_boolean

View File

@ -58,10 +58,11 @@ extern int v850_force_relocation (struct fix *);
/* We need to handle lo(), hi(), etc etc in .hword, .word, etc /* We need to handle lo(), hi(), etc etc in .hword, .word, etc
directives, so we have to parse "cons" expressions ourselves. */ directives, so we have to parse "cons" expressions ourselves. */
#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_cons_expression_v850 (EXP) #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_cons_expression_v850 (EXP)
extern void parse_cons_expression_v850 (expressionS *); extern bfd_reloc_code_real_type parse_cons_expression_v850 (expressionS *);
#define TC_CONS_FIX_NEW cons_fix_new_v850 #define TC_CONS_FIX_NEW cons_fix_new_v850
extern void cons_fix_new_v850 (fragS *, int, int, expressionS *); extern void cons_fix_new_v850 (fragS *, int, int, expressionS *,
bfd_reloc_code_real_type);
#define TC_GENERIC_RELAX_TABLE md_relax_table #define TC_GENERIC_RELAX_TABLE md_relax_table
extern const struct relax_type md_relax_table[]; extern const struct relax_type md_relax_table[];

View File

@ -3264,12 +3264,11 @@ md_begin (void)
} }
} }
static char *vax_cons_special_reloc; bfd_reloc_code_real_type
void
vax_cons (expressionS *exp, int size) vax_cons (expressionS *exp, int size)
{ {
char *save; char *save;
char *vax_cons_special_reloc;
SKIP_WHITESPACE (); SKIP_WHITESPACE ();
vax_cons_special_reloc = NULL; vax_cons_special_reloc = NULL;
@ -3373,35 +3372,29 @@ vax_cons (expressionS *exp, int size)
} }
if (vax_cons_special_reloc == NULL) if (vax_cons_special_reloc == NULL)
expression (exp); expression (exp);
else
switch (size)
{
case 1: return BFD_RELOC_8_PCREL;
case 2: return BFD_RELOC_16_PCREL;
case 4: return BFD_RELOC_32_PCREL;
}
return BFD_RELOC_NONE;
} }
/* This is called by emit_expr via TC_CONS_FIX_NEW when creating a /* This is called by emit_expr via TC_CONS_FIX_NEW when creating a
reloc for a cons. */ reloc for a cons. */
void void
vax_cons_fix_new (fragS *frag, int where, unsigned int nbytes, expressionS *exp) vax_cons_fix_new (fragS *frag, int where, unsigned int nbytes, expressionS *exp,
bfd_reloc_code_real_type r)
{ {
bfd_reloc_code_real_type r; if (r == BFD_RELOC_NONE)
r = (nbytes == 1 ? BFD_RELOC_8
r = (nbytes == 1 ? BFD_RELOC_8 : : nbytes == 2 ? BFD_RELOC_16
(nbytes == 2 ? BFD_RELOC_16 : BFD_RELOC_32)); : BFD_RELOC_32);
if (vax_cons_special_reloc)
{
if (*vax_cons_special_reloc == 'p')
{
switch (nbytes)
{
case 1: r = BFD_RELOC_8_PCREL; break;
case 2: r = BFD_RELOC_16_PCREL; break;
case 4: r = BFD_RELOC_32_PCREL; break;
default: abort ();
}
}
}
fix_new_exp (frag, where, (int) nbytes, exp, 0, r); fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
vax_cons_special_reloc = NULL;
} }
char * char *

View File

@ -49,8 +49,9 @@
#ifdef OBJ_ELF #ifdef OBJ_ELF
#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) vax_cons (EXP, NBYTES) #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) vax_cons (EXP, NBYTES)
#define TC_CONS_FIX_NEW vax_cons_fix_new #define TC_CONS_FIX_NEW vax_cons_fix_new
void vax_cons (expressionS *, int); bfd_reloc_code_real_type vax_cons (expressionS *, int);
void vax_cons_fix_new (struct frag *, int, unsigned int, struct expressionS *); void vax_cons_fix_new (struct frag *, int, unsigned int, struct expressionS *,
bfd_reloc_code_real_type);
#endif #endif
extern const struct relax_type md_relax_table[]; extern const struct relax_type md_relax_table[];

View File

@ -193,10 +193,9 @@ void
xstormy16_cons_fix_new (fragS *f, xstormy16_cons_fix_new (fragS *f,
int where, int where,
int nbytes, int nbytes,
expressionS *exp) expressionS *exp,
bfd_reloc_code_real_type code)
{ {
bfd_reloc_code_real_type code;
if (exp->X_op == O_fptr_symbol) if (exp->X_op == O_fptr_symbol)
{ {
switch (nbytes) switch (nbytes)

View File

@ -57,7 +57,8 @@ extern int xstormy16_force_relocation (struct fix *);
extern long md_pcrel_from_section (struct fix *, segT); extern long md_pcrel_from_section (struct fix *, segT);
#define TC_CONS_FIX_NEW xstormy16_cons_fix_new #define TC_CONS_FIX_NEW xstormy16_cons_fix_new
extern void xstormy16_cons_fix_new (fragS *f, int, int, expressionS *); extern void xstormy16_cons_fix_new (fragS *f, int, int, expressionS *,
bfd_reloc_code_real_type);
#define md_cgen_record_fixup_exp xstormy16_cgen_record_fixup_exp #define md_cgen_record_fixup_exp xstormy16_cgen_record_fixup_exp

View File

@ -158,6 +158,10 @@
/* The maximum address skip amount that can be encoded with a special op. */ /* The maximum address skip amount that can be encoded with a special op. */
#define MAX_SPECIAL_ADDR_DELTA SPECIAL_ADDR(255) #define MAX_SPECIAL_ADDR_DELTA SPECIAL_ADDR(255)
#ifndef TC_PARSE_CONS_RETURN_NONE
#define TC_PARSE_CONS_RETURN_NONE BFD_RELOC_NONE
#endif
struct line_entry { struct line_entry {
struct line_entry *next; struct line_entry *next;
symbolS *label; symbolS *label;
@ -1144,13 +1148,13 @@ emit_fixed_inc_line_addr (int line_delta, addressT addr_delta, fragS *frag,
exp.X_op = O_symbol; exp.X_op = O_symbol;
exp.X_add_symbol = to_sym; exp.X_add_symbol = to_sym;
exp.X_add_number = 0; exp.X_add_number = 0;
emit_expr_fix (&exp, sizeof_address, frag, p); emit_expr_fix (&exp, sizeof_address, frag, p, TC_PARSE_CONS_RETURN_NONE);
p += sizeof_address; p += sizeof_address;
} }
else else
{ {
*p++ = DW_LNS_fixed_advance_pc; *p++ = DW_LNS_fixed_advance_pc;
emit_expr_fix (pexp, 2, frag, p); emit_expr_fix (pexp, 2, frag, p, TC_PARSE_CONS_RETURN_NONE);
p += 2; p += 2;
} }

View File

@ -3851,19 +3851,22 @@ parse_mri_cons (expressionS *exp, unsigned int nbytes);
#ifndef TC_PARSE_CONS_EXPRESSION #ifndef TC_PARSE_CONS_EXPRESSION
#ifdef BITFIELD_CONS_EXPRESSIONS #ifdef BITFIELD_CONS_EXPRESSIONS
#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_bitfield_cons (EXP, NBYTES) #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
(parse_bitfield_cons (EXP, NBYTES), TC_PARSE_CONS_RETURN_NONE)
static void static void
parse_bitfield_cons (expressionS *exp, unsigned int nbytes); parse_bitfield_cons (expressionS *exp, unsigned int nbytes);
#endif #endif
#ifdef REPEAT_CONS_EXPRESSIONS #ifdef REPEAT_CONS_EXPRESSIONS
#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_repeat_cons (EXP, NBYTES) #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
(parse_repeat_cons (EXP, NBYTES), TC_PARSE_CONS_RETURN_NONE)
static void static void
parse_repeat_cons (expressionS *exp, unsigned int nbytes); parse_repeat_cons (expressionS *exp, unsigned int nbytes);
#endif #endif
/* If we haven't gotten one yet, just call expression. */ /* If we haven't gotten one yet, just call expression. */
#ifndef TC_PARSE_CONS_EXPRESSION #ifndef TC_PARSE_CONS_EXPRESSION
#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) expression (EXP) #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
(expression (EXP), TC_PARSE_CONS_RETURN_NONE)
#endif #endif
#endif #endif
@ -3871,7 +3874,7 @@ void
do_parse_cons_expression (expressionS *exp, do_parse_cons_expression (expressionS *exp,
int nbytes ATTRIBUTE_UNUSED) int nbytes ATTRIBUTE_UNUSED)
{ {
TC_PARSE_CONS_EXPRESSION (exp, nbytes); (void) TC_PARSE_CONS_EXPRESSION (exp, nbytes);
} }
@ -3914,6 +3917,8 @@ cons_worker (int nbytes, /* 1=.byte, 2=.word, 4=.long. */
c = 0; c = 0;
do do
{ {
TC_PARSE_CONS_RETURN_TYPE ret = TC_PARSE_CONS_RETURN_NONE;
#ifdef TC_M68K #ifdef TC_M68K
if (flag_m68k_mri) if (flag_m68k_mri)
parse_mri_cons (&exp, (unsigned int) nbytes); parse_mri_cons (&exp, (unsigned int) nbytes);
@ -3926,7 +3931,7 @@ cons_worker (int nbytes, /* 1=.byte, 2=.word, 4=.long. */
ignore_rest_of_line (); ignore_rest_of_line ();
return; return;
} }
TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes); ret = TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
} }
if (rva) if (rva)
@ -3936,7 +3941,7 @@ cons_worker (int nbytes, /* 1=.byte, 2=.word, 4=.long. */
else else
as_fatal (_("rva without symbol")); as_fatal (_("rva without symbol"));
} }
emit_expr (&exp, (unsigned int) nbytes); emit_expr_with_reloc (&exp, (unsigned int) nbytes, ret);
++c; ++c;
} }
while (*input_line_pointer++ == ','); while (*input_line_pointer++ == ',');
@ -4079,6 +4084,14 @@ s_reloc (int ignore ATTRIBUTE_UNUSED)
void void
emit_expr (expressionS *exp, unsigned int nbytes) emit_expr (expressionS *exp, unsigned int nbytes)
{
emit_expr_with_reloc (exp, nbytes, TC_PARSE_CONS_RETURN_NONE);
}
void
emit_expr_with_reloc (expressionS *exp,
unsigned int nbytes,
TC_PARSE_CONS_RETURN_TYPE reloc)
{ {
operatorT op; operatorT op;
char *p; char *p;
@ -4221,6 +4234,12 @@ emit_expr (expressionS *exp, unsigned int nbytes)
p = frag_more ((int) nbytes); p = frag_more ((int) nbytes);
if (reloc != TC_PARSE_CONS_RETURN_NONE)
{
emit_expr_fix (exp, nbytes, frag_now, p, reloc);
return;
}
#ifndef WORKING_DOT_WORD #ifndef WORKING_DOT_WORD
/* If we have the difference of two symbols in a word, save it on /* If we have the difference of two symbols in a word, save it on
the broken_words list. See the code in write.c. */ the broken_words list. See the code in write.c. */
@ -4379,23 +4398,41 @@ emit_expr (expressionS *exp, unsigned int nbytes)
} }
} }
else else
emit_expr_fix (exp, nbytes, frag_now, p); emit_expr_fix (exp, nbytes, frag_now, p, TC_PARSE_CONS_RETURN_NONE);
} }
void void
emit_expr_fix (expressionS *exp, unsigned int nbytes, fragS *frag, char *p) emit_expr_fix (expressionS *exp, unsigned int nbytes, fragS *frag, char *p,
TC_PARSE_CONS_RETURN_TYPE r)
{ {
memset (p, 0, nbytes); int offset = 0;
unsigned int size = nbytes;
memset (p, 0, size);
/* Generate a fixS to record the symbol value. */ /* Generate a fixS to record the symbol value. */
#ifdef TC_CONS_FIX_NEW #ifdef TC_CONS_FIX_NEW
TC_CONS_FIX_NEW (frag, p - frag->fr_literal, nbytes, exp); TC_CONS_FIX_NEW (frag, p - frag->fr_literal + offset, size, exp, r);
#else #else
{ if (r != TC_PARSE_CONS_RETURN_NONE)
bfd_reloc_code_real_type r; {
reloc_howto_type *reloc_howto;
switch (nbytes) reloc_howto = bfd_reloc_type_lookup (stdoutput, r);
size = bfd_get_reloc_size (reloc_howto);
if (size > nbytes)
{
as_bad (_("%s relocations do not fit in %u bytes\n"),
reloc_howto->name, nbytes);
return;
}
else if (target_big_endian)
offset = nbytes - size;
}
else
switch (size)
{ {
case 1: case 1:
r = BFD_RELOC_8; r = BFD_RELOC_8;
@ -4413,13 +4450,11 @@ emit_expr_fix (expressionS *exp, unsigned int nbytes, fragS *frag, char *p)
r = BFD_RELOC_64; r = BFD_RELOC_64;
break; break;
default: default:
as_bad (_("unsupported BFD relocation size %u"), nbytes); as_bad (_("unsupported BFD relocation size %u"), size);
r = BFD_RELOC_32; return;
break;
} }
fix_new_exp (frag, p - frag->fr_literal, (int) nbytes, exp, fix_new_exp (frag, p - frag->fr_literal + offset, size,
0, r); exp, 0, r);
}
#endif #endif
} }
@ -4555,9 +4590,7 @@ parse_bitfield_cons (exp, nbytes)
#ifdef TC_M68K #ifdef TC_M68K
static void static void
parse_mri_cons (exp, nbytes) parse_mri_cons (expressionS *exp, unsigned int nbytes)
expressionS *exp;
unsigned int nbytes;
{ {
if (*input_line_pointer != '\'' if (*input_line_pointer != '\''
&& (input_line_pointer[1] != '\'' && (input_line_pointer[1] != '\''

View File

@ -93,6 +93,11 @@ enum linkonce_type {
extern char original_case_string[]; extern char original_case_string[];
#endif #endif
#ifndef TC_PARSE_CONS_RETURN_TYPE
#define TC_PARSE_CONS_RETURN_TYPE bfd_reloc_code_real_type
#define TC_PARSE_CONS_RETURN_NONE BFD_RELOC_NONE
#endif
extern void pop_insert (const pseudo_typeS *); extern void pop_insert (const pseudo_typeS *);
extern unsigned int get_stab_string_offset extern unsigned int get_stab_string_offset
(const char *string, const char *stabstr_secname); (const char *string, const char *stabstr_secname);
@ -109,7 +114,10 @@ extern void add_include_dir (char *path);
extern void cons (int nbytes); extern void cons (int nbytes);
extern void demand_empty_rest_of_line (void); extern void demand_empty_rest_of_line (void);
extern void emit_expr (expressionS *exp, unsigned int nbytes); extern void emit_expr (expressionS *exp, unsigned int nbytes);
extern void emit_expr_fix (expressionS *, unsigned int, fragS *, char *); extern void emit_expr_with_reloc (expressionS *exp, unsigned int nbytes,
TC_PARSE_CONS_RETURN_TYPE);
extern void emit_expr_fix (expressionS *, unsigned int, fragS *, char *,
TC_PARSE_CONS_RETURN_TYPE);
extern void equals (char *sym_name, int reassign); extern void equals (char *sym_name, int reassign);
extern void float_cons (int float_type); extern void float_cons (int float_type);
extern void ignore_rest_of_line (void); extern void ignore_rest_of_line (void);

View File

@ -1883,7 +1883,7 @@ write_object_file (void)
#ifdef TC_CONS_FIX_NEW #ifdef TC_CONS_FIX_NEW
TC_CONS_FIX_NEW (lie->frag, TC_CONS_FIX_NEW (lie->frag,
lie->word_goes_here - lie->frag->fr_literal, lie->word_goes_here - lie->frag->fr_literal,
2, &exp); 2, &exp, TC_PARSE_CONS_RETURN_NONE);
#else #else
fix_new_exp (lie->frag, fix_new_exp (lie->frag,
lie->word_goes_here - lie->frag->fr_literal, lie->word_goes_here - lie->frag->fr_literal,