PR gas/15602
authorNick Clifton <nickc@redhat.com>
Thu, 13 Jun 2013 08:53:35 +0000 (08:53 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 13 Jun 2013 08:53:35 +0000 (08:53 +0000)
* config/tc-m68k.h (TC_CHECK_ADJUSTED_BROKEN_DOT_WORD): Define.
* config/tc-m68k.c (tc_m68k_check_adjusted_broken_word): New
function.  Generates an error if the adjusted offset is out of a
16-bit range.

gas/ChangeLog
gas/config/tc-m68k.c
gas/config/tc-m68k.h

index 8c5165b..2113356 100644 (file)
@@ -1,3 +1,11 @@
+2013-06-13  Nick Clifton  <nickc@redhat.com>
+
+       PR gas/15602
+       * config/tc-m68k.h (TC_CHECK_ADJUSTED_BROKEN_DOT_WORD): Define.
+       * config/tc-m68k.c (tc_m68k_check_adjusted_broken_word): New
+       function.  Generates an error if the adjusted offset is out of a
+       16-bit range.
+
 2013-06-12  Sandra Loosemore  <sandra@codesourcery.com>
 
        * config/tc-nios2.c (md_apply_fix):  Mask constant
index ea47ba4..d16b5d9 100644 (file)
@@ -8133,3 +8133,17 @@ tc_m68k_frame_initial_instructions (void)
   cfi_add_CFA_def_cfa (sp_regno, -DWARF2_CIE_DATA_ALIGNMENT);
   cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN, DWARF2_CIE_DATA_ALIGNMENT);
 }
+
+/* Check and emit error if broken-word handling has failed to fix up a
+   case-table. This is called from write.c, after doing everything it
+   knows about how to handle broken words.  */
+
+void
+tc_m68k_check_adjusted_broken_word (offsetT new_offset, struct broken_word *brokwP)
+{
+  if (new_offset > 32767 || new_offset < -32768)
+    as_bad_where (brokwP->frag->fr_file, brokwP->frag->fr_line,
+                 _("Adjusted signed .word (%#lx) overflows: `switch'-statement too large."),
+                 (long) new_offset);
+}
+
index bcf4607..bf938f2 100644 (file)
@@ -188,3 +188,9 @@ extern void tc_m68k_frame_initial_instructions (void);
 /* However, follow compiler's guidance when it specifies encoding for LSDA.  */
 # define CFI_DIFF_LSDA_OK 1
 #endif
+
+struct broken_word;
+#define TC_CHECK_ADJUSTED_BROKEN_DOT_WORD(new_offset, brokw) \
+  tc_m68k_check_adjusted_broken_word ((offsetT) (new_offset), (brokw))
+extern void tc_m68k_check_adjusted_broken_word (offsetT,
+                                               struct broken_word *);