* read.c (get_line_sb): Accept any eol marker while scanning macros.
authorRichard Henderson <rth@redhat.com>
Wed, 15 Oct 1997 03:56:30 +0000 (03:56 +0000)
committerRichard Henderson <rth@redhat.com>
Wed, 15 Oct 1997 03:56:30 +0000 (03:56 +0000)
gas/ChangeLog
gas/read.c

index 010e832b954374b19d13d20709d1748b5fb2308a..ef6a516705c2ebeb517d8c4c464e8a38ee428ee9 100644 (file)
@@ -1,3 +1,7 @@
+Tue Oct 14 20:50:58 1997  Richard Henderson  <rth@cygnus.com>
+
+       * read.c (get_line_sb): Accept any eol marker while scanning macros.
+
 Tue Oct 14 19:12:45 1997  Richard Henderson  <rth@cygnus.com>
 
        * config/tc-alpha.h (DIFF_EXPR_OK): Define.
index bdd88644d3dffdc5180ec5198324f667d1a36081..5c96735b12c65eb900f11fcd3a2a160ca6a94375 100644 (file)
@@ -1551,7 +1551,8 @@ s_app_file (appfile)
       /* If this is a fake .appfile, a fake newline was inserted into
         the buffer.  Passing -2 to new_logical_line tells it to
         account for it.  */
-      new_logical_line (s, appfile ? -2 : -1);
+      int may_omit
+       = (! new_logical_line (s, appfile ? -2 : -1) && appfile);
 
       /* In MRI mode, the preprocessor may have inserted an extraneous
          backquote.  */
@@ -1561,15 +1562,18 @@ s_app_file (appfile)
        ++input_line_pointer;
 
       demand_empty_rest_of_line ();
+      if (! may_omit)
+       {
 #ifdef LISTING
-      if (listing)
-       listing_source_file (s);
+         if (listing)
+           listing_source_file (s);
 #endif
-      register_dependency (s);
-    }
+         register_dependency (s);
 #ifdef obj_app_file
-  obj_app_file (s);
+         obj_app_file (s);
 #endif
+       }
+    }
 }
 
 /* Handle the .appline pseudo-op.  This is automatically generated by
@@ -2181,7 +2185,8 @@ get_line_sb (line)
        }
       sb_add_char (line, *input_line_pointer++);
     }
-  while (input_line_pointer < buffer_limit && *input_line_pointer == '\n')
+  while (input_line_pointer < buffer_limit
+        && is_end_of_line[(unsigned char) *input_line_pointer])
     {
       if (input_line_pointer[-1] == '\n')
        bump_line_counters ();
@@ -3236,6 +3241,31 @@ emit_expr (exp, nbytes)
   if (need_pass_2)
     return;
 
+#ifndef NO_LISTING
+#ifdef OBJ_ELF
+  /* When gcc emits DWARF 1 debugging pseudo-ops, a line number will
+     appear as a four byte positive constant in the .line section,
+     followed by a 2 byte 0xffff.  Look for that case here.  */
+  {
+    static int dwarf_line = -1;
+
+    if (strcmp (segment_name (now_seg), ".line") != 0)
+      dwarf_line = -1;
+    else if (dwarf_line >= 0
+            && nbytes == 2
+            && exp->X_op == O_constant
+            && (exp->X_add_number == -1 || exp->X_add_number == 0xffff))
+      listing_source_line ((unsigned int) dwarf_line);
+    else if (nbytes == 4
+            && exp->X_op == O_constant
+            && exp->X_add_number >= 0)
+      dwarf_line = exp->X_add_number;
+    else
+      dwarf_line = -1;
+  }
+#endif
+#endif
+
   op = exp->X_op;
 
   /* Allow `.word 0' in the absolute section.  */
@@ -4254,6 +4284,7 @@ stringer (append_zero)            /* Worker to do .ascii etc statements. */
      register int append_zero; /* 0: don't append '\0', else 1 */
 {
   register unsigned int c;
+  char *start;
 
 #ifdef md_flush_pending_output
   md_flush_pending_output ();
@@ -4283,6 +4314,7 @@ stringer (append_zero)            /* Worker to do .ascii etc statements. */
        {
        case '\"':
          ++input_line_pointer; /*->1st char of string. */
+         start = input_line_pointer;
          while (is_a_char (c = next_char_of_string ()))
            {
              FRAG_APPEND_1_CHAR (c);
@@ -4292,6 +4324,24 @@ stringer (append_zero)           /* Worker to do .ascii etc statements. */
              FRAG_APPEND_1_CHAR (0);
            }
          know (input_line_pointer[-1] == '\"');
+
+#ifndef NO_LISTING
+#ifdef OBJ_ELF
+         /* In ELF, when gcc is emitting DWARF 1 debugging output, it
+             will emit .string with a filename in the .debug_sfnames
+             section to indicate a file name.  I don't know if this
+             will work for compilers other than gcc, and I don't know
+             if it will work for DWARF 2.  */
+         if (strcmp (segment_name (now_seg), ".debug_sfnames") == 0)
+           {
+             c = input_line_pointer[-1];
+             input_line_pointer[-1] = '\0';
+             listing_source_file (start);
+             input_line_pointer[-1] = c;
+           }
+#endif
+#endif
+
          break;
        case '<':
          input_line_pointer++;