* dwarf2dbg.c (dwarf2_gen_line_info): Early out for no line number.
authorRichard Henderson <rth@redhat.com>
Fri, 17 Nov 2000 18:07:33 +0000 (18:07 +0000)
committerRichard Henderson <rth@redhat.com>
Fri, 17 Nov 2000 18:07:33 +0000 (18:07 +0000)
        * config/obj-elf.h (ECOFF_DEBUGGING) [TC_ALPHA]: Adjust for
        tri-state definition of alpha_flag_mdebug.
        * config/tc-alpha.c (alpha_flag_mdebug): Init to -1.
        (s_alpha_file): Store first .file directive.
        (s_alpha_stab): New.
        (md_pseudo_table): Add stabs and stabn.

gas/ChangeLog
gas/config/obj-elf.h
gas/config/tc-alpha.c
gas/dwarf2dbg.c

index 18be139bb91d1f1b8086e9afeb39a9006b2c3014..8ac23d58715f9f45a3a2c8caf1342c43f06aad3d 100644 (file)
@@ -1,3 +1,13 @@
+2000-11-17  Richard Henderson  <rth@redhat.com>
+
+       * dwarf2dbg.c (dwarf2_gen_line_info): Early out for no line number.
+       * config/obj-elf.h (ECOFF_DEBUGGING) [TC_ALPHA]: Adjust for 
+       tri-state definition of alpha_flag_mdebug.
+       * config/tc-alpha.c (alpha_flag_mdebug): Init to -1.
+       (s_alpha_file): Store first .file directive.
+       (s_alpha_stab): New.
+       (md_pseudo_table): Add stabs and stabn.
+
 2000-11-17  Richard Henderson  <rth@redhat.com>
 
        * config/tc-i386.c (md_assemble): Call dwarf2_emit_insn.
index 37004d7432396a0c77563dd25b84529f17df6f7a..42d5b499b68394fed8fd06b8e69e20f749e49294 100644 (file)
@@ -42,7 +42,7 @@
 #include "targ-cpu.h"
 
 #ifdef TC_ALPHA
-#define ECOFF_DEBUGGING alpha_flag_mdebug
+#define ECOFF_DEBUGGING (alpha_flag_mdebug > 0)
 extern int alpha_flag_mdebug;
 #endif
 
index 66d208b88f296a27b909c7c84979b661627b47c5..d6d41c6db22afdec411addce69bb22362b2f01ed 100644 (file)
@@ -248,6 +248,7 @@ static void s_alpha_frame PARAMS ((int));
 static void s_alpha_prologue PARAMS ((int));
 static void s_alpha_file PARAMS ((int));
 static void s_alpha_loc PARAMS ((int));
+static void s_alpha_stab PARAMS ((int));
 static void s_alpha_coff_wrapper PARAMS ((int));
 #endif
 #ifdef OBJ_EVAX
@@ -435,7 +436,7 @@ static int alpha_debug;
 
 #ifdef OBJ_ELF
 /* Whether we are emitting an mdebug section.  */
-int alpha_flag_mdebug = 1;
+int alpha_flag_mdebug = -1;
 #endif
 
 /* Don't fully resolve relocations, allowing code movement in the linker.  */
@@ -4578,10 +4579,29 @@ s_alpha_prologue (ignore)
     }
 }
 
+static char * first_file_directive;
+
 static void
 s_alpha_file (ignore)
      int ignore ATTRIBUTE_UNUSED;
 {
+  /* Save the first .file directive we see, so that we can change our
+     minds about whether ecoff debugging should or shouldn't be enabled.  */
+  if (alpha_flag_mdebug < 0 && ! first_file_directive)
+    {
+      char *start = input_line_pointer;
+      size_t len;
+
+      discard_rest_of_line ();
+
+      len = input_line_pointer - start;
+      first_file_directive = xmalloc (len + 1);
+      memcpy (first_file_directive, start, len);
+      first_file_directive[len] = '\0';
+
+      input_line_pointer = start;
+    }
+
   if (ECOFF_DEBUGGING)
     ecoff_directive_file (0);
   else
@@ -4598,6 +4618,33 @@ s_alpha_loc (ignore)
     dwarf2_directive_loc (0);
 }
 
+static void
+s_alpha_stab (n)
+     int n;
+{
+  /* If we've been undecided about mdebug, make up our minds in favour.  */
+  if (alpha_flag_mdebug < 0)
+    {
+      segT sec = subseg_new(".mdebug", 0);
+      bfd_set_section_flags(stdoutput, sec, SEC_HAS_CONTENTS|SEC_READONLY);
+      bfd_set_section_alignment(stdoutput, sec, 3);
+
+      ecoff_read_begin_hook ();
+
+      if (first_file_directive)
+       {
+         char *save_ilp = input_line_pointer;
+          input_line_pointer = first_file_directive;
+         ecoff_directive_file (0);
+         input_line_pointer = save_ilp;
+         free (first_file_directive);
+       }
+
+      alpha_flag_mdebug = 1;
+    }
+  s_stab (n);
+}
+
 static void
 s_alpha_coff_wrapper (which)
      int which;
@@ -5474,6 +5521,8 @@ const pseudo_typeS md_pseudo_table[] =
   {"prologue", s_alpha_prologue, 0},
   {"file", s_alpha_file, 5},
   {"loc", s_alpha_loc, 9},
+  {"stabs", s_alpha_stab, 's'},
+  {"stabn", s_alpha_stab, 'n'},
   /* COFF debugging related pseudos.  */
   {"begin", s_alpha_coff_wrapper, 0},
   {"bend", s_alpha_coff_wrapper, 1},
index faa9ceeaa55278ff8e135e9fac8856e9e2b72488..b09b8dbc2e376b17a52efde7028f484bb6eff23c 100644 (file)
@@ -444,6 +444,10 @@ dwarf2_gen_line_info (addr, l)
     /* No filename, no filnum => no play.  */
     return;
 
+  /* Early out for as-yet incomplete location information.  */
+  if (l->line == 0)
+    return;
+
   /* Must save these before the subseg_new call, as that call will change
      them.  */
   saved_seg = now_seg;