aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1998-05-29 17:48:03 +0000
committerIan Lance Taylor <ian@airs.com>1998-05-29 17:48:03 +0000
commitdcb76edbb8b813ffc72b2e113d991ffc5de3aae9 (patch)
treecbe15e3a725bd0abcf1d5d42c5a4c242e7b3b146
parente5fc780949c7ad5e15f03f89179ef3b72320413c (diff)
downloadgdb-dcb76edbb8b813ffc72b2e113d991ffc5de3aae9.zip
gdb-dcb76edbb8b813ffc72b2e113d991ffc5de3aae9.tar.gz
gdb-dcb76edbb8b813ffc72b2e113d991ffc5de3aae9.tar.bz2
* config/tc-m68k.c (mri_assemble): New static function.
(build_mri_control_operand): Call mri_assemble rather than md_assemble. (s_mri_else, s_mri_break, s_mri_next, s_mri_for): Likewise. (s_mri_endf, s_mri_endw): Likewise.
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/config/tc-m68k.c67
2 files changed, 60 insertions, 15 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 449c66a..b5b1c98 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,11 @@
+Fri May 29 13:46:07 1998 Ian Lance Taylor <ian@cygnus.com>
+
+ * config/tc-m68k.c (mri_assemble): New static function.
+ (build_mri_control_operand): Call mri_assemble rather than
+ md_assemble.
+ (s_mri_else, s_mri_break, s_mri_next, s_mri_for): Likewise.
+ (s_mri_endf, s_mri_endw): Likewise.
+
start-sanitize-sky
Thu May 28 16:23:08 1998 Doug Evans <devans@canuck.cygnus.com>
diff --git a/gas/config/tc-m68k.c b/gas/config/tc-m68k.c
index b47df0a..ff5f4a0 100644
--- a/gas/config/tc-m68k.c
+++ b/gas/config/tc-m68k.c
@@ -784,7 +784,8 @@ tc_m68k_fix_adjustable (fixP)
fixS *fixP;
{
/* Prevent all adjustments to global symbols. */
- if (S_IS_EXTERNAL (fixP->fx_addsy))
+ if (S_IS_EXTERNAL (fixP->fx_addsy)
+ || S_IS_WEAK (fixP->fx_addsy))
return 0;
/* adjust_reloc_syms doesn't know about the GOT */
@@ -918,6 +919,19 @@ tc_gen_reloc (section, fixp)
#endif /* BFD_ASSEMBLER */
+/* Return zero if the reference to SYMBOL from within the same segment may
+ be relaxed. */
+#ifdef OBJ_ELF
+
+#define relaxable_symbol(symbol) \
+ (! S_IS_EXTERNAL (symbol) && ! S_IS_WEAK (symbol))
+
+#else
+
+#define relaxable_symbol(symbol) 1
+
+#endif
+
/* Handle of the OPCODE hash table. NULL means any use before
m68k_ip_begin() will crash. */
static struct hash_control *op_hash;
@@ -2305,6 +2319,7 @@ m68k_ip (instring)
&& opP->disp.pic_reloc == pic_none
#endif
&& S_GET_SEGMENT (adds (&opP->disp)) == now_seg
+ && relaxable_symbol (adds (&opP->disp))
&& HAVE_LONG_BRANCH(current_architecture)
&& !flag_long_jumps
&& !strchr ("~%&$?", s[0]))
@@ -4428,7 +4443,8 @@ md_estimate_size_before_relax (fragP, segment)
case TAB (PCREL, SZ_UNDEF):
{
- if (S_GET_SEGMENT (fragP->fr_symbol) == segment
+ if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
+ && relaxable_symbol (fragP->fr_symbol))
|| flag_short_refs
|| cpu_of_arch (current_architecture) < m68020
|| cpu_of_arch (current_architecture) == mcf5200)
@@ -4525,7 +4541,8 @@ md_estimate_size_before_relax (fragP, segment)
case TAB (PCLEA, SZ_UNDEF):
{
- if ((S_GET_SEGMENT (fragP->fr_symbol)) == segment
+ if (((S_GET_SEGMENT (fragP->fr_symbol)) == segment
+ && relaxable_symbol (fragP->fr_symbol))
|| flag_short_refs
|| cpu_of_arch (current_architecture) < m68020
|| cpu_of_arch (current_architecture) == mcf5200)
@@ -4542,7 +4559,8 @@ md_estimate_size_before_relax (fragP, segment)
} /* TAB(PCLEA,SZ_UNDEF) */
case TAB (PCINDEX, SZ_UNDEF):
- if (S_GET_SEGMENT (fragP->fr_symbol) == segment
+ if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
+ && relaxable_symbol (fragP->fr_symbol))
|| cpu_of_arch (current_architecture) < m68020
|| cpu_of_arch (current_architecture) == mcf5200)
{
@@ -5441,6 +5459,7 @@ static int mri_control_index;
/* Some function prototypes. */
+static void mri_assemble PARAMS ((char *));
static char *mri_control_label PARAMS ((void));
static struct mri_control_info *push_mri_control
PARAMS ((enum mri_control_type));
@@ -5456,6 +5475,24 @@ static void build_mri_control_operand
static void parse_mri_control_expression
PARAMS ((char *, int, const char *, const char *, int));
+/* Assemble an instruction for an MRI structured control directive. */
+
+static void
+mri_assemble (str)
+ char *str;
+{
+ char *s;
+
+ /* md_assemble expects the opcode to be in lower case. */
+ for (s = str; *s != ' ' && *s != '\0'; s++)
+ {
+ if (isupper ((unsigned char) *s))
+ *s = tolower ((unsigned char) *s);
+ }
+
+ md_assemble (str);
+}
+
/* Generate a new MRI label structured control directive label name. */
static char *
@@ -5748,7 +5785,7 @@ build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
memcpy (s, rightstart, rightstop - rightstart);
s += rightstop - rightstart;
*s = '\0';
- md_assemble (buf);
+ mri_assemble (buf);
free (buf);
}
@@ -5761,7 +5798,7 @@ build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
*s++ = extent;
*s++ = ' ';
strcpy (s, truelab);
- md_assemble (buf);
+ mri_assemble (buf);
free (buf);
}
@@ -6002,7 +6039,7 @@ s_mri_else (qual)
q[0] = qual;
q[1] = '\0';
sprintf (buf, "bra%s %s", q, mri_control_stack->bottom);
- md_assemble (buf);
+ mri_assemble (buf);
free (buf);
colon (mri_control_stack->next);
@@ -6075,7 +6112,7 @@ s_mri_break (extent)
ex[0] = extent;
ex[1] = '\0';
sprintf (buf, "bra%s %s", ex, n->bottom);
- md_assemble (buf);
+ mri_assemble (buf);
free (buf);
if (flag_mri)
@@ -6114,7 +6151,7 @@ s_mri_next (extent)
ex[0] = extent;
ex[1] = '\0';
sprintf (buf, "bra%s %s", ex, n->next);
- md_assemble (buf);
+ mri_assemble (buf);
free (buf);
if (flag_mri)
@@ -6303,7 +6340,7 @@ s_mri_for (qual)
memcpy (s, varstart, varstop - varstart);
s += varstop - varstart;
*s = '\0';
- md_assemble (buf);
+ mri_assemble (buf);
colon (n->top);
@@ -6321,7 +6358,7 @@ s_mri_for (qual)
memcpy (s, varstart, varstop - varstart);
s += varstop - varstart;
*s = '\0';
- md_assemble (buf);
+ mri_assemble (buf);
/* bcc bottom */
ex[0] = extent;
@@ -6330,7 +6367,7 @@ s_mri_for (qual)
sprintf (buf, "blt%s %s", ex, n->bottom);
else
sprintf (buf, "bgt%s %s", ex, n->bottom);
- md_assemble (buf);
+ mri_assemble (buf);
/* Put together the add or sub instruction used by ENDF. */
s = buf;
@@ -6375,10 +6412,10 @@ s_mri_endf (ignore)
colon (mri_control_stack->next);
- md_assemble (mri_control_stack->incr);
+ mri_assemble (mri_control_stack->incr);
sprintf (mri_control_stack->incr, "bra %s", mri_control_stack->top);
- md_assemble (mri_control_stack->incr);
+ mri_assemble (mri_control_stack->incr);
free (mri_control_stack->incr);
@@ -6518,7 +6555,7 @@ s_mri_endw (ignore)
buf = (char *) xmalloc (20 + strlen (mri_control_stack->next));
sprintf (buf, "bra %s", mri_control_stack->next);
- md_assemble (buf);
+ mri_assemble (buf);
free (buf);
colon (mri_control_stack->bottom);