This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Pop multiple instruction on the same line with a label on Blackfin


When pop multiple instruction has a label on the same line, Blackfin
gas would be confused and treat "(R7" as a label too.

foo: (R7:6,P5:3) = [SP++];

The attached patch should fix it. It also adds a test case for this bug.

When fixing this bug, I found two other targets: fr30 and m32c have the similar hack. TC_START_LABEL of these targets uses the variable 's' although its argument list doesn't have it. I think it might be better to make this argument explicitly on the argument list of TC_START_LABEL. So I changed all occurrences of this macro in this patch.

Is it OK?


Jie


	* read.c (TC_START_LABEL): Add a new augument.
	(read_a_source_file): Pass the beginning of the symbol through
	the new argument of TC_START_LABEL.
	* config/tc-arm.h (TC_START_LABEL): Add a new argument.
	* config/tc-bfin.c (bfin_start_label): Only search '(' and '['
	from the beginning of the symbol.
	* config/tc-bfin.h (TC_START_LABEL): Add the new argument.
	* config/tc-d30v.h (TC_START_LABEL): Likewise.
	* config/tc-fr30.h (TC_START_LABEL): Likewise.
	* config/tc-m32c.h (TC_START_LABEL): Likewise.
	* config/tc-m32r.h (TC_START_LABEL): Likewise.
	* config/tc-mep.h (TC_START_LABEL): Likewise.

	testsuite/
	* gas/bfin/stack2.s: Add pop multiple instruction with a label
	on the same line.
	* gas/bfin/stack2.d: Adjust accordingly.

Index: gas/read.c
===================================================================
RCS file: /cvs/src/src/gas/read.c,v
retrieving revision 1.140
diff -u -p -r1.140 read.c
--- gas/read.c	13 Mar 2008 10:51:33 -0000	1.140
+++ gas/read.c	14 Jul 2008 07:15:41 -0000
@@ -42,7 +42,7 @@
 #include "dw2gencfi.h"
 
 #ifndef TC_START_LABEL
-#define TC_START_LABEL(x,y) (x == ':')
+#define TC_START_LABEL(x,y,z) (x == ':')
 #endif
 
 /* Set by the object-format or the target.  */
@@ -759,7 +759,7 @@ read_a_source_file (char *name)
 		 S points to the beginning of the symbol.
 		   [In case of pseudo-op, s->'.'.]
 		 Input_line_pointer->'\0' where c was.  */
-	      if (TC_START_LABEL (c, input_line_pointer))
+	      if (TC_START_LABEL (c, s, input_line_pointer))
 		{
 		  if (flag_m68k_mri)
 		    {
Index: gas/config/tc-arm.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-arm.h,v
retrieving revision 1.46
diff -u -p -r1.46 tc-arm.h
--- gas/config/tc-arm.h	3 Jul 2007 11:01:04 -0000	1.46
+++ gas/config/tc-arm.h	14 Jul 2008 07:15:41 -0000
@@ -147,7 +147,7 @@ void arm_copy_symbol_attributes (symbolS
   (arm_copy_symbol_attributes (DEST, SRC))
 #endif
 
-#define TC_START_LABEL(C,STR)            (c == ':' || (c == '/' && arm_data_in_code ()))
+#define TC_START_LABEL(C,S,STR)            (C == ':' || (C == '/' && arm_data_in_code ()))
 #define tc_canonicalize_symbol_name(str) arm_canonicalize_symbol_name (str);
 #define obj_adjust_symtab() 		 arm_adjust_symtab ()
 
Index: gas/config/tc-bfin.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-bfin.c,v
retrieving revision 1.16
diff -u -p -r1.16 tc-bfin.c
--- gas/config/tc-bfin.c	23 Apr 2008 18:40:34 -0000	1.16
+++ gas/config/tc-bfin.c	14 Jul 2008 07:15:42 -0000
@@ -1943,15 +1943,14 @@ bfin_eol_in_insn (char *line)
 }
 
 bfd_boolean
-bfin_start_label (char *ptr)
+bfin_start_label (char *s, char *ptr)
 {
-  ptr--;
-  while (!ISSPACE (*ptr) && !is_end_of_line[(unsigned char) *ptr])
-    ptr--;
-
-  ptr++;
-  if (*ptr == '(' || *ptr == '[')
-    return FALSE;
+  while (s != ptr)
+    {
+      if (*s == '(' || *s == '[')
+	return FALSE;
+      s++;
+    }
 
   return TRUE;
 } 
Index: gas/config/tc-bfin.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-bfin.h,v
retrieving revision 1.5
diff -u -p -r1.5 tc-bfin.h
--- gas/config/tc-bfin.h	3 Jul 2007 11:01:04 -0000	1.5
+++ gas/config/tc-bfin.h	14 Jul 2008 07:15:44 -0000
@@ -40,7 +40,7 @@
 #define WORKING_DOT_WORD
 
 extern void bfin_start_line_hook PARAMS ((void));
-extern bfd_boolean bfin_start_label PARAMS ((char *));
+extern bfd_boolean bfin_start_label PARAMS ((char *, char *));
 
 #define md_start_line_hook()    bfin_start_line_hook()
 #define md_number_to_chars	number_to_chars_littleendian
@@ -61,7 +61,7 @@ extern bfd_boolean bfin_eol_in_insn PARA
 
 #define DOUBLESLASH_LINE_COMMENTS
 
-#define TC_START_LABEL(ch ,ptr) (ch == ':' && bfin_start_label (ptr))
+#define TC_START_LABEL(c, s, ptr) (c == ':' && bfin_start_label (s, ptr))
 #define tc_fix_adjustable(FIX) bfin_fix_adjustable (FIX)
 extern bfd_boolean bfin_fix_adjustable PARAMS ((struct fix *));
 
Index: gas/config/tc-d30v.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-d30v.h,v
retrieving revision 1.13
diff -u -p -r1.13 tc-d30v.h
--- gas/config/tc-d30v.h	3 Jul 2007 11:01:04 -0000	1.13
+++ gas/config/tc-d30v.h	14 Jul 2008 07:15:44 -0000
@@ -48,7 +48,7 @@ extern long md_pcrel_from_section (struc
 int d30v_cleanup (int);
 #define md_after_pass_hook()	     d30v_cleanup (FALSE)
 #define md_cleanup()		     d30v_cleanup (FALSE)
-#define TC_START_LABEL(ch, ptr)      (ch == ':' && d30v_cleanup (FALSE))
+#define TC_START_LABEL(ch, s, ptr)      (ch == ':' && d30v_cleanup (FALSE))
 void d30v_start_line (void);
 #define md_start_line_hook()	     d30v_start_line ()
 
Index: gas/config/tc-fr30.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-fr30.h,v
retrieving revision 1.13
diff -u -p -r1.13 tc-fr30.h
--- gas/config/tc-fr30.h	3 Jul 2007 11:01:04 -0000	1.13
+++ gas/config/tc-fr30.h	14 Jul 2008 07:15:44 -0000
@@ -59,12 +59,8 @@ extern const struct relax_type md_relax_
 
 /* We need a special version of the TC_START_LABEL macro so that we
    allow the LDI:8, LDI:20, LDI:32 and delay slot instructions to be
-   parsed as such.  Note - in a HORRIBLE HACK, we make use of the
-   knowledge that this marco is only ever evaluated in one place
-   (read_a_source_file in read.c) where we can access the local
-   variable 's' - the start of the symbol that was terminated by
-   'character'.  Also we need to be able to change the contents of
+   parsed as such. We need to be able to change the contents of
    the local variable 'c' which is passed to this macro as 'character'.  */
-#define TC_START_LABEL(character, i_l_p)			\
+#define TC_START_LABEL(character, s, i_l_p)				\
   ((character) != ':' ? 0 : (character = fr30_is_colon_insn (s)) ? 0 : ((character = ':'), 1))
 extern char fr30_is_colon_insn (char *);
Index: gas/config/tc-m32c.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-m32c.h,v
retrieving revision 1.5
diff -u -p -r1.5 tc-m32c.h
--- gas/config/tc-m32c.h	3 Jul 2007 11:01:04 -0000	1.5
+++ gas/config/tc-m32c.h	14 Jul 2008 07:15:44 -0000
@@ -77,12 +77,8 @@ extern long md_pcrel_from_section PARAMS
 
 /* We need a special version of the TC_START_LABEL macro so that we
    allow the :Z, :S, :Q and :G suffixes to be
-   parsed as such.  Note - in a HORRIBLE HACK, we make use of the
-   knowledge that this marco is only ever evaluated in one place
-   (read_a_source_file in read.c) where we can access the local
-   variable 's' - the start of the symbol that was terminated by
-   'character'.  Also we need to be able to change the contents of
+   parsed as such. We need to be able to change the contents of
    the local variable 'c' which is passed to this macro as 'character'.  */
-#define TC_START_LABEL(character, i_l_p)			\
+#define TC_START_LABEL(character, s, i_l_p)				\
   ((character) != ':' ? 0 : (character = m32c_is_colon_insn (s)) ? 0 : ((character = ':'), 1))
 extern char m32c_is_colon_insn PARAMS ((char *));
Index: gas/config/tc-m32r.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-m32r.h,v
retrieving revision 1.21
diff -u -p -r1.21 tc-m32r.h
--- gas/config/tc-m32r.h	3 Jul 2007 11:01:04 -0000	1.21
+++ gas/config/tc-m32r.h	14 Jul 2008 07:15:44 -0000
@@ -102,7 +102,7 @@ extern int m32r_force_relocation (struct
 /* Ensure insns at labels are aligned to 32 bit boundaries.  */
 int m32r_fill_insn (int);
 #define md_after_pass_hook()	m32r_fill_insn (1)
-#define TC_START_LABEL(ch, ptr)	(ch == ':' && m32r_fill_insn (0))
+#define TC_START_LABEL(ch, s, ptr)	(ch == ':' && m32r_fill_insn (0))
 
 #define md_cleanup                 m32r_elf_section_change_hook
 #define md_elf_section_change_hook m32r_elf_section_change_hook
Index: gas/config/tc-mep.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-mep.h,v
retrieving revision 1.3
diff -u -p -r1.3 tc-mep.h
--- gas/config/tc-mep.h	24 Jul 2007 12:38:35 -0000	1.3
+++ gas/config/tc-mep.h	14 Jul 2008 07:15:44 -0000
@@ -95,7 +95,7 @@ extern void mep_prepare_relax_scan (frag
 #define VTEXT_SECTION_NAME ".vtext"
 
 /* Needed to process pending instructions when a label is encountered.  */
-#define TC_START_LABEL(ch, ptr)    ((ch == ':') && mep_flush_pending_output ())
+#define TC_START_LABEL(ch, s, ptr)    ((ch == ':') && mep_flush_pending_output ())
 
 #define tc_unrecognized_line(c) mep_unrecognized_line (c)
 extern int mep_unrecognized_line (int);
Index: gas/testsuite/gas/bfin/stack2.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/bfin/stack2.d,v
retrieving revision 1.2
diff -u -p -r1.2 stack2.d
--- gas/testsuite/gas/bfin/stack2.d	26 Mar 2008 16:48:32 -0000	1.2
+++ gas/testsuite/gas/bfin/stack2.d	14 Jul 2008 07:15:47 -0000
@@ -81,3 +81,5 @@ Disassembly of section .text:
   94:	00 e8 02 00 	LINK 0x8;.*
   98:	00 e8 ff ff 	LINK 0x3fffc;.*
   9c:	01 e8 00 00 	UNLINK;
+  a0:	b3 05       	\(R7:6, P5:3\) = \[SP\+\+\];
+	\.\.\.
Index: gas/testsuite/gas/bfin/stack2.s
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/bfin/stack2.s,v
retrieving revision 1.2
diff -u -p -r1.2 stack2.s
--- gas/testsuite/gas/bfin/stack2.s	14 Jul 2008 03:54:27 -0000	1.2
+++ gas/testsuite/gas/bfin/stack2.s	14 Jul 2008 07:15:47 -0000
@@ -123,3 +123,5 @@ LINK 0X8;
 LINK 0x3FFFC;
 
 UNLINK ; /* de-allocate the stack frame (b)*/
+
+L$L$foo:  (R7:6,P5:3) = [SP++]; /* Pop multiple on the same line with a label */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]