aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/config/tc-arc.c7
-rw-r--r--gas/config/tc-avr.c6
-rw-r--r--gas/config/tc-cr16.c12
-rw-r--r--gas/config/tc-cris.c3
-rw-r--r--gas/config/tc-crx.c12
-rw-r--r--gas/config/tc-d10v.c2
-rw-r--r--gas/config/tc-d30v.c2
-rw-r--r--gas/config/tc-ft32.c5
-rw-r--r--gas/config/tc-h8300.c3
-rw-r--r--gas/config/tc-m68hc11.c2
-rw-r--r--gas/config/tc-mmix.c3
-rw-r--r--gas/config/tc-mn10200.c9
-rw-r--r--gas/config/tc-nds32.c3
-rw-r--r--gas/config/tc-ppc.c10
-rw-r--r--gas/config/tc-pru.c5
-rw-r--r--gas/config/tc-riscv.c3
-rw-r--r--gas/config/tc-s12z.c2
-rw-r--r--gas/config/tc-s390.c5
-rw-r--r--gas/config/tc-spu.c11
-rw-r--r--gas/config/tc-tilegx.c2
-rw-r--r--gas/config/tc-tilepro.c2
-rw-r--r--gas/config/tc-v850.c3
-rw-r--r--gas/config/tc-vax.c2
-rw-r--r--gas/config/tc-xc16x.c5
-rw-r--r--gas/config/tc-xgate.c2
-rw-r--r--gas/config/tc-xstormy16.c2
-rw-r--r--gas/config/tc-xtensa.c2
-rw-r--r--gas/config/tc-z80.c2
-rw-r--r--gas/testsuite/gas/i386/ifunc-2.l120
-rw-r--r--gas/testsuite/gas/mips/lui-2.l4
-rw-r--r--gas/testsuite/gas/tic6x/reloc-bad-1.l2
-rw-r--r--gas/write.c16
-rw-r--r--gas/write.h1
33 files changed, 121 insertions, 149 deletions
diff --git a/gas/config/tc-arc.c b/gas/config/tc-arc.c
index 3cd33da..d03dc72 100644
--- a/gas/config/tc-arc.c
+++ b/gas/config/tc-arc.c
@@ -2936,12 +2936,7 @@ md_apply_fix (fixS *fixP,
}
else
{
- as_bad_where (fixP->fx_file, fixP->fx_line,
- _("can't resolve `%s' {%s section} - `%s' {%s section}"),
- fx_addsy ? S_GET_NAME (fx_addsy) : "0",
- segment_name (add_symbol_segment),
- S_GET_NAME (fx_subsy),
- segment_name (sub_symbol_segment));
+ as_bad_subtract (fixP);
return;
}
}
diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c
index 397f22d..40dcce7 100644
--- a/gas/config/tc-avr.c
+++ b/gas/config/tc-avr.c
@@ -1548,7 +1548,7 @@ md_apply_fix (fixS *fixP, valueT * valP, segT seg)
fixP->fx_r_type = BFD_RELOC_AVR_DIFF32;
break;
default:
- as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
+ as_bad_subtract (fixP);
break;
}
@@ -1560,7 +1560,7 @@ md_apply_fix (fixS *fixP, valueT * valP, segT seg)
}
/* We don't actually support subtracting a symbol. */
if (fixP->fx_subsy != (symbolS *) NULL)
- as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
+ as_bad_subtract (fixP);
/* For the DIFF relocs, write the value into the object file while still
keeping fx_done FALSE, as both the difference (recorded in the object file)
@@ -1824,7 +1824,7 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED,
if (fixp->fx_subsy != NULL)
{
- as_bad_where (fixp->fx_file, fixp->fx_line, _("expression too complex"));
+ as_bad_subtract (fixp);
return NULL;
}
diff --git a/gas/config/tc-cr16.c b/gas/config/tc-cr16.c
index cbe113e..8925650 100644
--- a/gas/config/tc-cr16.c
+++ b/gas/config/tc-cr16.c
@@ -573,14 +573,10 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS * fixP)
else
{
/* We only resolve difference expressions in the same section. */
- as_bad_where (fixP->fx_file, fixP->fx_line,
- _("can't resolve `%s' {%s section} - `%s' {%s section}"),
- fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0",
- segment_name (fixP->fx_addsy
- ? S_GET_SEGMENT (fixP->fx_addsy)
- : absolute_section),
- S_GET_NAME (fixP->fx_subsy),
- segment_name (S_GET_SEGMENT (fixP->fx_addsy)));
+ as_bad_subtract (fixP);
+ free (reloc->sym_ptr_ptr);
+ free (reloc);
+ return NULL;
}
}
#ifdef OBJ_ELF
diff --git a/gas/config/tc-cris.c b/gas/config/tc-cris.c
index 94a32e3..02ce2ac 100644
--- a/gas/config/tc-cris.c
+++ b/gas/config/tc-cris.c
@@ -4050,8 +4050,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg)
/* We can't actually support subtracting a symbol. */
if (fixP->fx_subsy != (symbolS *) NULL)
- as_bad_where (fixP->fx_file, fixP->fx_line,
- _("expression too complex"));
+ as_bad_subtract (fixP);
/* This operand-type is scaled. */
if (fixP->fx_r_type == BFD_RELOC_CRIS_LAPCQ_OFFSET)
diff --git a/gas/config/tc-crx.c b/gas/config/tc-crx.c
index d33a0bf..ebf38f6 100644
--- a/gas/config/tc-crx.c
+++ b/gas/config/tc-crx.c
@@ -317,14 +317,10 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS * fixP)
else
{
/* We only resolve difference expressions in the same section. */
- as_bad_where (fixP->fx_file, fixP->fx_line,
- _("can't resolve `%s' {%s section} - `%s' {%s section}"),
- fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0",
- segment_name (fixP->fx_addsy
- ? S_GET_SEGMENT (fixP->fx_addsy)
- : absolute_section),
- S_GET_NAME (fixP->fx_subsy),
- segment_name (S_GET_SEGMENT (fixP->fx_addsy)));
+ as_bad_subtract (fixP);
+ free (reloc->sym_ptr_ptr);
+ free (reloc);
+ return NULL;
}
}
diff --git a/gas/config/tc-d10v.c b/gas/config/tc-d10v.c
index 1d92f34..b6437b1 100644
--- a/gas/config/tc-d10v.c
+++ b/gas/config/tc-d10v.c
@@ -1503,7 +1503,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
/* We don't actually support subtracting a symbol. */
if (fixP->fx_subsy != (symbolS *) NULL)
- as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
+ as_bad_subtract (fixP);
op_type = fixP->fx_r_type;
if (op_type & 2048)
diff --git a/gas/config/tc-d30v.c b/gas/config/tc-d30v.c
index 957182a..c48e4a3 100644
--- a/gas/config/tc-d30v.c
+++ b/gas/config/tc-d30v.c
@@ -1906,7 +1906,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
/* We don't support subtracting a symbol. */
if (fixP->fx_subsy != (symbolS *) NULL)
- as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
+ as_bad_subtract (fixP);
/* Fetch the instruction, insert the fully resolved operand
value, and stuff the instruction back again. */
diff --git a/gas/config/tc-ft32.c b/gas/config/tc-ft32.c
index 91b8c36..928920f 100644
--- a/gas/config/tc-ft32.c
+++ b/gas/config/tc-ft32.c
@@ -570,8 +570,7 @@ md_apply_fix (fixS *fixP ATTRIBUTE_UNUSED,
fixP->fx_r_type = BFD_RELOC_FT32_DIFF32;
break;
default:
- as_bad_where (fixP->fx_file, fixP->fx_line,
- _("expression too complex"));
+ as_bad_subtract (fixP);
break;
}
@@ -584,7 +583,7 @@ md_apply_fix (fixS *fixP ATTRIBUTE_UNUSED,
/* We don't actually support subtracting a symbol. */
if (fixP->fx_subsy != (symbolS *) NULL)
- as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
+ as_bad_subtract (fixP);
switch (fixP->fx_r_type)
{
diff --git a/gas/config/tc-h8300.c b/gas/config/tc-h8300.c
index e1f359a..545c15e 100644
--- a/gas/config/tc-h8300.c
+++ b/gas/config/tc-h8300.c
@@ -2298,8 +2298,7 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
|| S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
{
- as_bad_where (fixp->fx_file, fixp->fx_line,
- _("Difference of symbols in different sections is not supported"));
+ as_bad_subtract (fixp);
return NULL;
}
}
diff --git a/gas/config/tc-m68hc11.c b/gas/config/tc-m68hc11.c
index b31f5ca..a6e876c 100644
--- a/gas/config/tc-m68hc11.c
+++ b/gas/config/tc-m68hc11.c
@@ -4334,7 +4334,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
/* We don't actually support subtracting a symbol. */
if (fixP->fx_subsy != (symbolS *) NULL)
- as_bad_where (fixP->fx_file, fixP->fx_line, _("Expression too complex."));
+ as_bad_subtract (fixP);
/* Patch the instruction with the resolved operand. Elf relocation
info will also be generated to take care of linker/loader fixups.
diff --git a/gas/config/tc-mmix.c b/gas/config/tc-mmix.c
index d51a019..04a799a 100644
--- a/gas/config/tc-mmix.c
+++ b/gas/config/tc-mmix.c
@@ -3742,8 +3742,7 @@ mmix_frob_file (void)
/* This case isn't doable in general anyway, methinks. */
if (fixP->fx_subsy != NULL)
{
- as_bad_where (fixP->fx_file, fixP->fx_line,
- _("GREG expression too complicated"));
+ as_bad_subtract (fixP);
continue;
}
diff --git a/gas/config/tc-mn10200.c b/gas/config/tc-mn10200.c
index 6323e54..cbec565 100644
--- a/gas/config/tc-mn10200.c
+++ b/gas/config/tc-mn10200.c
@@ -762,14 +762,7 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
/* FIXME: We should try more ways to resolve difference expressions
here. At least this is better than silently ignoring the
subtrahend. */
- as_bad_where (fixp->fx_file, fixp->fx_line,
- _("can't resolve `%s' {%s section} - `%s' {%s section}"),
- fixp->fx_addsy ? S_GET_NAME (fixp->fx_addsy) : "0",
- segment_name (fixp->fx_addsy
- ? S_GET_SEGMENT (fixp->fx_addsy)
- : absolute_section),
- S_GET_NAME (fixp->fx_subsy),
- segment_name (S_GET_SEGMENT (fixp->fx_addsy)));
+ as_bad_subtract (fixp);
}
reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
diff --git a/gas/config/tc-nds32.c b/gas/config/tc-nds32.c
index 4ff667c..0ab436c 100644
--- a/gas/config/tc-nds32.c
+++ b/gas/config/tc-nds32.c
@@ -7825,8 +7825,7 @@ nds32_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
/* cvt_frag_to_fill () has called output_leb128 () for us. */
break;
default:
- as_bad_where (fixP->fx_file, fixP->fx_line,
- _("expression too complex"));
+ as_bad_subtract (fixP);
return;
}
}
diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c
index 567f801..3eaeb89 100644
--- a/gas/config/tc-ppc.c
+++ b/gas/config/tc-ppc.c
@@ -7476,7 +7476,7 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
}
reloc->addend = fixp->fx_addnumber;
- if (fixp->fx_subsy && fixp->fx_addsy)
+ if (fixp->fx_subsy != NULL)
{
relocs[1] = reloc = XNEW (arelent);
relocs[2] = NULL;
@@ -7490,9 +7490,11 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
if (reloc->howto == (reloc_howto_type *) NULL)
{
- as_bad_where (fixp->fx_file, fixp->fx_line,
- _("reloc %d not supported by object file format"),
- BFD_RELOC_PPC_NEG);
+ as_bad_subtract (fixp);
+ free (relocs[1]->sym_ptr_ptr);
+ free (relocs[1]);
+ free (relocs[0]->sym_ptr_ptr);
+ free (relocs[0]);
relocs[0] = NULL;
}
}
diff --git a/gas/config/tc-pru.c b/gas/config/tc-pru.c
index 14876f4..16678b1 100644
--- a/gas/config/tc-pru.c
+++ b/gas/config/tc-pru.c
@@ -742,8 +742,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
diffval /= 4;
break;
default:
- as_bad_where (fixP->fx_file, fixP->fx_line,
- _("expression too complex"));
+ as_bad_subtract (fixP);
break;
}
@@ -753,7 +752,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
}
/* We don't actually support subtracting a symbol. */
if (fixP->fx_subsy != (symbolS *) NULL)
- as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
+ as_bad_subtract (fixP);
/* For the DIFF relocs, write the value into the object file while still
keeping fx_done FALSE, as both the difference (recorded in the object file)
diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index df37579..460667e 100644
--- a/gas/config/tc-riscv.c
+++ b/gas/config/tc-riscv.c
@@ -3201,8 +3201,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
}
if (fixP->fx_subsy != NULL)
- as_bad_where (fixP->fx_file, fixP->fx_line,
- _("unsupported symbol subtraction"));
+ as_bad_subtract (fixP);
/* Add an R_RISCV_RELAX reloc if the reloc is relaxable. */
if (relaxable && fixP->fx_tcbit && fixP->fx_addsy != NULL)
diff --git a/gas/config/tc-s12z.c b/gas/config/tc-s12z.c
index 6ec4d5c..11a412d 100644
--- a/gas/config/tc-s12z.c
+++ b/gas/config/tc-s12z.c
@@ -3933,7 +3933,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
/* We don't actually support subtracting a symbol. */
if (fixP->fx_subsy != (symbolS *) NULL)
- as_bad_where (fixP->fx_file, fixP->fx_line, _("Expression too complex."));
+ as_bad_subtract (fixP);
/*
Patch the instruction with the resolved operand. Elf relocation
diff --git a/gas/config/tc-s390.c b/gas/config/tc-s390.c
index 064dd33..a203436 100644
--- a/gas/config/tc-s390.c
+++ b/gas/config/tc-s390.c
@@ -2254,10 +2254,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
where = fixP->fx_frag->fr_literal + fixP->fx_where;
if (fixP->fx_subsy != NULL)
- as_bad_where (fixP->fx_file, fixP->fx_line,
- _("cannot emit relocation %s against subsy symbol %s"),
- bfd_get_reloc_code_name (fixP->fx_r_type),
- S_GET_NAME (fixP->fx_subsy));
+ as_bad_subtract (fixP);
if (fixP->fx_addsy != NULL)
{
diff --git a/gas/config/tc-spu.c b/gas/config/tc-spu.c
index f9055a5..11fafa1 100644
--- a/gas/config/tc-spu.c
+++ b/gas/config/tc-spu.c
@@ -868,12 +868,7 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
arelent *reloc;
reloc = XNEW (arelent);
reloc->sym_ptr_ptr = XNEW (asymbol *);
- if (fixp->fx_addsy)
- *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
- else if (fixp->fx_subsy)
- *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy);
- else
- abort ();
+ *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
if (reloc->howto == (reloc_howto_type *) NULL)
@@ -881,6 +876,8 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
as_bad_where (fixp->fx_file, fixp->fx_line,
_("reloc %d not supported by object file format"),
(int) fixp->fx_r_type);
+ free (reloc->sym_ptr_ptr);
+ free (reloc);
return NULL;
}
reloc->addend = fixp->fx_addnumber;
@@ -957,7 +954,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
if (fixP->fx_subsy != (symbolS *) NULL)
{
/* We can't actually support subtracting a symbol. */
- as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
+ as_bad_subtract (fixP);
}
if (fixP->fx_addsy != NULL)
diff --git a/gas/config/tc-tilegx.c b/gas/config/tc-tilegx.c
index e041b4a..97062c0 100644
--- a/gas/config/tc-tilegx.c
+++ b/gas/config/tc-tilegx.c
@@ -1476,7 +1476,7 @@ md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
if (fixP->fx_subsy != (symbolS *) NULL)
{
/* We can't actually support subtracting a symbol. */
- as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
+ as_bad_subtract (fixP);
}
/* Correct relocation types for pc-relativeness. */
diff --git a/gas/config/tc-tilepro.c b/gas/config/tc-tilepro.c
index 365b621..11893bc 100644
--- a/gas/config/tc-tilepro.c
+++ b/gas/config/tc-tilepro.c
@@ -1334,7 +1334,7 @@ md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
if (fixP->fx_subsy != (symbolS *) NULL)
{
/* We can't actually support subtracting a symbol. */
- as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
+ as_bad_subtract (fixP);
}
/* Correct relocation types for pc-relativeness. */
diff --git a/gas/config/tc-v850.c b/gas/config/tc-v850.c
index 5bfebba..81449d0 100644
--- a/gas/config/tc-v850.c
+++ b/gas/config/tc-v850.c
@@ -3447,8 +3447,7 @@ md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED)
value -= S_GET_VALUE (fixP->fx_subsy);
else
/* We don't actually support subtracting a symbol. */
- as_bad_where (fixP->fx_file, fixP->fx_line,
- _("expression too complex"));
+ as_bad_subtract (fixP);
}
fixP->fx_addnumber = value;
}
diff --git a/gas/config/tc-vax.c b/gas/config/tc-vax.c
index f439f1b..efffc7d 100644
--- a/gas/config/tc-vax.c
+++ b/gas/config/tc-vax.c
@@ -279,7 +279,7 @@ md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED)
valueT value = * valueP;
if (fixP->fx_subsy != (symbolS *) NULL)
- as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
+ as_bad_subtract (fixP);
if (fixP->fx_addsy == NULL)
fixP->fx_done = 1;
diff --git a/gas/config/tc-xc16x.c b/gas/config/tc-xc16x.c
index 7d89a37..12d9070 100644
--- a/gas/config/tc-xc16x.c
+++ b/gas/config/tc-xc16x.c
@@ -283,13 +283,12 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
arelent *rel;
bfd_reloc_code_real_type r_type;
- if (fixp->fx_addsy && fixp->fx_subsy)
+ if (fixp->fx_subsy)
{
if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
|| S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
{
- as_bad_where (fixp->fx_file, fixp->fx_line,
- _("Difference of symbols in different sections is not supported"));
+ as_bad_subtract (fixp);
return NULL;
}
}
diff --git a/gas/config/tc-xgate.c b/gas/config/tc-xgate.c
index 5f5d165..f97540a 100644
--- a/gas/config/tc-xgate.c
+++ b/gas/config/tc-xgate.c
@@ -660,7 +660,7 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
/* We don't actually support subtracting a symbol. */
if (fixP->fx_subsy != (symbolS *) NULL)
- as_bad_where (fixP->fx_file, fixP->fx_line, _("Expression too complex."));
+ as_bad_subtract (fixP);
where = fixP->fx_frag->fr_literal + fixP->fx_where;
opcode = bfd_getl16 (where);
diff --git a/gas/config/tc-xstormy16.c b/gas/config/tc-xstormy16.c
index 3edf384..deb1081 100644
--- a/gas/config/tc-xstormy16.c
+++ b/gas/config/tc-xstormy16.c
@@ -479,7 +479,7 @@ xstormy16_md_apply_fix (fixS * fixP,
/* We don't actually support subtracting a symbol. */
if (fixP->fx_subsy != (symbolS *) NULL)
- as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
+ as_bad_subtract (fixP);
if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
{
diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c
index 452d4a7..b8634f7 100644
--- a/gas/config/tc-xtensa.c
+++ b/gas/config/tc-xtensa.c
@@ -6006,7 +6006,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg)
if (fixP->fx_subsy && !(linkrelax && (fixP->fx_r_type == BFD_RELOC_32
|| fixP->fx_r_type == BFD_RELOC_16
|| fixP->fx_r_type == BFD_RELOC_8)))
- as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
+ as_bad_subtract (fixP);
switch (fixP->fx_r_type)
{
diff --git a/gas/config/tc-z80.c b/gas/config/tc-z80.c
index 303296b..052982f 100644
--- a/gas/config/tc-z80.c
+++ b/gas/config/tc-z80.c
@@ -3853,7 +3853,7 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED , fixS *fixp)
if (fixp->fx_subsy != NULL)
{
- as_bad_where (fixp->fx_file, fixp->fx_line, _("expression too complex"));
+ as_bad_subtract (fixp);
return NULL;
}
diff --git a/gas/testsuite/gas/i386/ifunc-2.l b/gas/testsuite/gas/i386/ifunc-2.l
index 0ed314b..280a0c6 100644
--- a/gas/testsuite/gas/i386/ifunc-2.l
+++ b/gas/testsuite/gas/i386/ifunc-2.l
@@ -1,61 +1,61 @@
.*/ifunc-2\.s: Assembler messages:
-.*/ifunc-2\.s:4: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
-.*/ifunc-2\.s:5: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
-.*/ifunc-2\.s:6: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:7: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:8: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:9: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:10: Error: can't resolve `bar1' {\.text\.1 section} - `abs1' {\*ABS\* section}
-.*/ifunc-2\.s:11: Error: can't resolve `abs1' {\*ABS\* section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:12: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:19: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
-.*/ifunc-2\.s:20: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
-.*/ifunc-2\.s:21: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:22: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:23: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:24: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:25: Error: can't resolve `bar1' {\.text\.1 section} - `abs1' {\*ABS\* section}
-.*/ifunc-2\.s:26: Error: can't resolve `abs1' {\*ABS\* section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:27: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:34: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
-.*/ifunc-2\.s:35: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
-.*/ifunc-2\.s:36: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:37: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:38: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:39: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:40: Error: can't resolve `bar1' {\.text\.1 section} - `abs1' {\*ABS\* section}
-.*/ifunc-2\.s:41: Error: can't resolve `abs1' {\*ABS\* section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:42: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:44: Error: can't resolve `abs1' {\*ABS\* section} - `abs2' {\*ABS\* section}
-.*/ifunc-2\.s:45: Error: can't resolve `abs2' {\*ABS\* section} - `abs1' {\*ABS\* section}
-.*/ifunc-2\.s:50: Error: can't resolve `abs1' {\*ABS\* section} - `abs2' {\*ABS\* section}
-.*/ifunc-2\.s:51: Error: can't resolve `abs2' {\*ABS\* section} - `abs1' {\*ABS\* section}
-.*/ifunc-2\.s:56: Error: can't resolve `abs1' {\*ABS\* section} - `abs2' {\*ABS\* section}
-.*/ifunc-2\.s:57: Error: can't resolve `abs2' {\*ABS\* section} - `abs1' {\*ABS\* section}
-.*/ifunc-2\.s:62: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
-.*/ifunc-2\.s:63: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
-.*/ifunc-2\.s:64: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:65: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:66: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:67: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:68: Error: can't resolve `bar2' {\.text\.2 section} - `abs1' {\*ABS\* section}
-.*/ifunc-2\.s:69: Error: can't resolve `abs1' {\*ABS\* section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:70: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:77: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
-.*/ifunc-2\.s:78: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
-.*/ifunc-2\.s:79: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:80: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:81: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:82: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:83: Error: can't resolve `bar2' {\.text\.2 section} - `abs1' {\*ABS\* section}
-.*/ifunc-2\.s:84: Error: can't resolve `abs1' {\*ABS\* section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:85: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:92: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
-.*/ifunc-2\.s:93: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
-.*/ifunc-2\.s:94: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:95: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:96: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar1' {\.text\.1 section}
-.*/ifunc-2\.s:97: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:98: Error: can't resolve `bar2' {\.text\.2 section} - `abs1' {\*ABS\* section}
-.*/ifunc-2\.s:99: Error: can't resolve `abs1' {\*ABS\* section} - `bar2' {\.text\.2 section}
-.*/ifunc-2\.s:100: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:4: Error: can't resolve bar1 - foo1
+.*/ifunc-2\.s:5: Error: can't resolve bar2 - foo2
+.*/ifunc-2\.s:6: Error: can't resolve bar1 - bar2
+.*/ifunc-2\.s:7: Error: can't resolve bar2 - bar1
+.*/ifunc-2\.s:8: Error: can't resolve \.text\.1 - bar1
+.*/ifunc-2\.s:9: Error: can't resolve \.text\.1 - bar2
+.*/ifunc-2\.s:10: Error: can't resolve bar1 - abs1
+.*/ifunc-2\.s:11: Error: can't resolve abs1 - bar1
+.*/ifunc-2\.s:12: Error: can't resolve \.text\.1 - bar1
+.*/ifunc-2\.s:19: Error: can't resolve bar1 - foo1
+.*/ifunc-2\.s:20: Error: can't resolve bar2 - foo2
+.*/ifunc-2\.s:21: Error: can't resolve bar1 - bar2
+.*/ifunc-2\.s:22: Error: can't resolve bar2 - bar1
+.*/ifunc-2\.s:23: Error: can't resolve \.text\.1 - bar1
+.*/ifunc-2\.s:24: Error: can't resolve \.text\.1 - bar2
+.*/ifunc-2\.s:25: Error: can't resolve bar1 - abs1
+.*/ifunc-2\.s:26: Error: can't resolve abs1 - bar1
+.*/ifunc-2\.s:27: Error: can't resolve \.text\.1 - bar1
+.*/ifunc-2\.s:34: Error: can't resolve bar1 - foo1
+.*/ifunc-2\.s:35: Error: can't resolve bar2 - foo2
+.*/ifunc-2\.s:36: Error: can't resolve bar1 - bar2
+.*/ifunc-2\.s:37: Error: can't resolve bar2 - bar1
+.*/ifunc-2\.s:38: Error: can't resolve \.text\.1 - bar1
+.*/ifunc-2\.s:39: Error: can't resolve \.text\.1 - bar2
+.*/ifunc-2\.s:40: Error: can't resolve bar1 - abs1
+.*/ifunc-2\.s:41: Error: can't resolve abs1 - bar1
+.*/ifunc-2\.s:42: Error: can't resolve \.text\.1 - bar1
+.*/ifunc-2\.s:44: Error: can't resolve abs1 - abs2
+.*/ifunc-2\.s:45: Error: can't resolve abs2 - abs1
+.*/ifunc-2\.s:50: Error: can't resolve abs1 - abs2
+.*/ifunc-2\.s:51: Error: can't resolve abs2 - abs1
+.*/ifunc-2\.s:56: Error: can't resolve abs1 - abs2
+.*/ifunc-2\.s:57: Error: can't resolve abs2 - abs1
+.*/ifunc-2\.s:62: Error: can't resolve bar1 - foo1
+.*/ifunc-2\.s:63: Error: can't resolve bar2 - foo2
+.*/ifunc-2\.s:64: Error: can't resolve bar1 - bar2
+.*/ifunc-2\.s:65: Error: can't resolve bar2 - bar1
+.*/ifunc-2\.s:66: Error: can't resolve \.text\.2 - bar1
+.*/ifunc-2\.s:67: Error: can't resolve \.text\.2 - bar2
+.*/ifunc-2\.s:68: Error: can't resolve bar2 - abs1
+.*/ifunc-2\.s:69: Error: can't resolve abs1 - bar2
+.*/ifunc-2\.s:70: Error: can't resolve \.text\.2 - bar2
+.*/ifunc-2\.s:77: Error: can't resolve bar1 - foo1
+.*/ifunc-2\.s:78: Error: can't resolve bar2 - foo2
+.*/ifunc-2\.s:79: Error: can't resolve bar1 - bar2
+.*/ifunc-2\.s:80: Error: can't resolve bar2 - bar1
+.*/ifunc-2\.s:81: Error: can't resolve \.text\.2 - bar1
+.*/ifunc-2\.s:82: Error: can't resolve \.text\.2 - bar2
+.*/ifunc-2\.s:83: Error: can't resolve bar2 - abs1
+.*/ifunc-2\.s:84: Error: can't resolve abs1 - bar2
+.*/ifunc-2\.s:85: Error: can't resolve \.text\.2 - bar2
+.*/ifunc-2\.s:92: Error: can't resolve bar1 - foo1
+.*/ifunc-2\.s:93: Error: can't resolve bar2 - foo2
+.*/ifunc-2\.s:94: Error: can't resolve bar1 - bar2
+.*/ifunc-2\.s:95: Error: can't resolve bar2 - bar1
+.*/ifunc-2\.s:96: Error: can't resolve \.text\.2 - bar1
+.*/ifunc-2\.s:97: Error: can't resolve \.text\.2 - bar2
+.*/ifunc-2\.s:98: Error: can't resolve bar2 - abs1
+.*/ifunc-2\.s:99: Error: can't resolve abs1 - bar2
+.*/ifunc-2\.s:100: Error: can't resolve \.text\.2 - bar2
diff --git a/gas/testsuite/gas/mips/lui-2.l b/gas/testsuite/gas/mips/lui-2.l
index 635f97d..713bd79 100644
--- a/gas/testsuite/gas/mips/lui-2.l
+++ b/gas/testsuite/gas/mips/lui-2.l
@@ -1,5 +1,5 @@
.*\.s: Assembler messages:
.*\.s:10: Error: invalid operands \(\*UND\* and \*UND\* sections\) for `/'
.*\.s:7: Error: PC-relative reference to a different section
-.*\.s:8: Error: can't resolve `baz' {\*UND\* section} - `bar' {\*UND\* section}
-.*\.s:9: Error: can't resolve `\.text' {\.text section} - `baz' {\*UND\* section}
+.*\.s:8: Error: can't resolve baz - bar
+.*\.s:9: Error: can't resolve \.text - baz
diff --git a/gas/testsuite/gas/tic6x/reloc-bad-1.l b/gas/testsuite/gas/tic6x/reloc-bad-1.l
index 9a94d3e..2927212 100644
--- a/gas/testsuite/gas/tic6x/reloc-bad-1.l
+++ b/gas/testsuite/gas/tic6x/reloc-bad-1.l
@@ -1,2 +1,2 @@
[^:]*: Assembler messages:
-[^:]*:8: Error: can't resolve `a' \{\*UND\* section\} - `b' \{\*UND\* section\}
+[^:]*:8: Error: can't resolve a - b
diff --git a/gas/write.c b/gas/write.c
index 2d67f16..253dfc4 100644
--- a/gas/write.c
+++ b/gas/write.c
@@ -899,6 +899,15 @@ adjust_reloc_syms (bfd *abfd ATTRIBUTE_UNUSED,
dump_section_relocs (abfd, sec, stderr);
}
+void
+as_bad_subtract (fixS *fixp)
+{
+ as_bad_where (fixp->fx_file, fixp->fx_line,
+ _("can't resolve %s - %s"),
+ fixp->fx_addsy ? S_GET_NAME (fixp->fx_addsy) : "0",
+ S_GET_NAME (fixp->fx_subsy));
+}
+
/* fixup_segment()
Go through all the fixS's in a segment and see which ones can be
@@ -1021,12 +1030,7 @@ fixup_segment (fixS *fixP, segT this_segment)
as_bad_where (fixP->fx_file, fixP->fx_line,
_("register value used as expression"));
else
- as_bad_where (fixP->fx_file, fixP->fx_line,
- _("can't resolve `%s' {%s section} - `%s' {%s section}"),
- fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0",
- segment_name (add_symbol_segment),
- S_GET_NAME (fixP->fx_subsy),
- segment_name (sub_symbol_segment));
+ as_bad_subtract (fixP);
}
else if (sub_symbol_segment != undefined_section
&& ! bfd_is_com_section (sub_symbol_segment)
diff --git a/gas/write.h b/gas/write.h
index dc61c88..74d07bf 100644
--- a/gas/write.h
+++ b/gas/write.h
@@ -184,5 +184,6 @@ extern fixS *fix_at_start (fragS *, unsigned long, symbolS *,
extern fixS *fix_new_exp (fragS *, unsigned long, unsigned long,
expressionS *, int, bfd_reloc_code_real_type);
extern void write_print_statistics (FILE *);
+extern void as_bad_subtract (fixS *);
#endif /* __write_h__ */