gas: allow disabling dollar-as-line-separator for AVR target

Message ID 0522332B-DE74-48C6-81DB-3FB2F96B687D@me.com
State New
Headers show
Series
  • gas: allow disabling dollar-as-line-separator for AVR target
Related show

Commit Message

Alan Modra via Binutils July 27, 2021, 3:50 a.m.
Some frontends, like the gcc Objective-C frontend, emit symbols with $ 
characters in them.  The AVR target code in gas treats $ as a line separator, 
so the code doesn’t assemble correctly.

Provide a machine-specific option to disable treating $ as a line separator.

I don't have commit access, so if this patch is suitable, I'd need someone else
to commit it for me.  Thanks.

gas/ChangeLog:

2021-07-26  Matt Jacobson  <mhjacobson@me.com>

	* config/tc-avr.c (enum options): Add option flag.
	(struct option): Add option -mno-dollar-line-separator.
	(md_parse_option): Adjust treatment of $ when option is present.
	* config/tc-avr.h: Use avr_line_separator_chars.

Comments

Alan Modra via Binutils Aug. 11, 2021, 9:07 a.m. | #1
Hi Matt,

> 	* config/tc-avr.c (enum options): Add option flag.

> 	(struct option): Add option -mno-dollar-line-separator.

> 	(md_parse_option): Adjust treatment of $ when option is present.

> 	* config/tc-avr.h: Use avr_line_separator_chars.


Approved and applied.

Note - you missed a couple of things:

   * The usage() function in tc-avr.c is used to add AVR specific
     output to the assembler's --help command line option.  So it
     needed to be updated to mention the new option.

   * The gas/doc/c-avr.texi file documents the AVR specific command
     line options, as well as the special characters, so this too
     needed updating.

To save you the trouble however I have taken care of both of these
issues.

Cheers
   Nick

Patch

diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c
index 397f22d5502..20d92c6e8c4 100644
--- a/gas/config/tc-avr.c
+++ b/gas/config/tc-avr.c
@@ -157,7 +157,9 @@  static struct avr_opcodes_s *avr_gccisr_opcode;
 
 const char comment_chars[] = ";";
 const char line_comment_chars[] = "#";
-const char line_separator_chars[] = "$";
+
+const char *avr_line_separator_chars = "$";
+static const char *avr_line_separator_chars_no_dollar = "";
 
 const char *md_shortopts = "m:";
 struct mcu_type_s
@@ -565,7 +567,8 @@  enum options
   OPTION_ISA_RMW,
   OPTION_LINK_RELAX,
   OPTION_NO_LINK_RELAX,
-  OPTION_HAVE_GCCISR
+  OPTION_HAVE_GCCISR,
+  OPTION_NO_DOLLAR_LINE_SEPARATOR,
 };
 
 struct option md_longopts[] =
@@ -578,6 +581,7 @@  struct option md_longopts[] =
   { "mlink-relax",  no_argument, NULL, OPTION_LINK_RELAX  },
   { "mno-link-relax",  no_argument, NULL, OPTION_NO_LINK_RELAX  },
   { "mgcc-isr",     no_argument, NULL, OPTION_HAVE_GCCISR },
+  { "mno-dollar-line-separator", no_argument, NULL, OPTION_NO_DOLLAR_LINE_SEPARATOR },
   { NULL, no_argument, NULL, 0 }
 };
 
@@ -756,6 +760,10 @@  md_parse_option (int c, const char *arg)
     case OPTION_HAVE_GCCISR:
       avr_opt.have_gccisr = 1;
       return 1;
+    case OPTION_NO_DOLLAR_LINE_SEPARATOR:
+      avr_line_separator_chars = avr_line_separator_chars_no_dollar;
+      lex_type['$'] = LEX_NAME | LEX_BEGIN_NAME;
+      return 1;
     }
 
   return 0;
diff --git a/gas/config/tc-avr.h b/gas/config/tc-avr.h
index 0f85099abf7..58626970fa8 100644
--- a/gas/config/tc-avr.h
+++ b/gas/config/tc-avr.h
@@ -143,7 +143,7 @@  extern int avr_force_relocation (struct fix *);
    would print `12 34 56 78'.  The default value is 4.  */
 #define LISTING_WORD_SIZE 2
 
-/* AVR port uses `$' as a logical line separator.  */
+/* AVR port uses `$' as a logical line separator by default. */
 #define LEX_DOLLAR 0
 
 /* An `.lcomm' directive with no explicit alignment parameter will
@@ -244,3 +244,6 @@  struct avr_frag_data
 #define TC_FRAG_TYPE			struct avr_frag_data
 #define TC_FRAG_INIT(frag, max_bytes)	avr_frag_init (frag)
 extern void avr_frag_init (fragS *);
+
+#define tc_line_separator_chars avr_line_separator_chars
+extern const char *avr_line_separator_chars;