* config/i386/xm-go32.h (HOST_LONG_DOUBLE_FORMAT): Define.
[deliverable/binutils-gdb.git] / gas / ecoff.c
index f8e538f0f16bbc0c7894c5e4d973adf0167f494e..436c8c4af56a60a5c2c3b02c2adec2bb96f5a10e 100644 (file)
@@ -1,5 +1,5 @@
 /* ECOFF debugging support.
-   Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
+   Copyright (C) 1993, 94, 95, 96, 97, 98, 1999 Free Software Foundation, Inc.
    Contributed by Cygnus Support.
    This file was put together by Ian Lance Taylor <ian@cygnus.com>.  A
    good deal of it comes directly from mips-tfile.c, by Michael
    ECOFF debugging information (e.g., MIPS ECOFF, MIPS ELF, Alpha
    ECOFF).  */
 
+#include "ecoff.h"
+
 #ifdef ECOFF_DEBUGGING
 
 #include "coff/internal.h"
 #include "coff/symconst.h"
-#include "ecoff.h"
 #include "aout/stab_gnu.h"
 
 #include <ctype.h>
@@ -1513,6 +1514,8 @@ void
 ecoff_symbol_new_hook (symbolP)
      symbolS *symbolP;
 {
+  OBJ_SYMFIELD_TYPE *obj;
+
   /* Make sure that we have a file pointer, but only if we have seen a
      file.  If we haven't seen a file, then this is a probably special
      symbol created by md_begin which may required special handling at
@@ -1521,9 +1524,10 @@ ecoff_symbol_new_hook (symbolP)
   if (cur_file_ptr == (efdr_t *) NULL
       && seen_at_least_1_file ())
     add_file ((const char *) NULL, 0, 1);
-  symbolP->ecoff_file = cur_file_ptr;
-  symbolP->ecoff_symbol = NULL;
-  symbolP->ecoff_extern_size = 0;
+  obj = symbol_get_obj (symbolP);
+  obj->ecoff_file = cur_file_ptr;
+  obj->ecoff_symbol = NULL;
+  obj->ecoff_extern_size = 0;
 }
 \f
 /* Add a page to a varray object.  */
@@ -1643,7 +1647,7 @@ add_ecoff_symbol (str, type, storage, sym_value, addend, value, indx)
     psym->name = str;
   psym->as_sym = sym_value;
   if (sym_value != (symbolS *) NULL)
-    sym_value->ecoff_symbol = psym;
+    symbol_get_obj (sym_value)->ecoff_symbol = psym;
   psym->addend = addend;
   psym->file_ptr = cur_file_ptr;
   psym->proc_ptr = cur_proc_ptr;
@@ -2170,7 +2174,7 @@ add_procedure (func)
 
   /* Set the BSF_FUNCTION flag for the symbol.  */
   sym = symbol_find_or_make (func);
-  sym->bsym->flags |= BSF_FUNCTION;
+  symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
 
   /* Push the start of the function.  */
   new_proc_ptr->sym = add_ecoff_symbol ((const char *) NULL, st_Proc, sc_Text,
@@ -2195,6 +2199,12 @@ add_procedure (func)
       noproc_lineno = (lineno_list_t *) NULL;
     }
 }
+
+symbolS *
+ecoff_get_cur_proc_sym ()
+{
+  return (cur_proc_ptr ? cur_proc_ptr->sym->as_sym : NULL);
+}
 \f
 /* Add a new filename, and set up all of the file relative
    virtual arrays (strings, symbols, aux syms, etc.).  Record
@@ -3116,7 +3126,8 @@ ecoff_directive_ent (ignore)
       ++input_line_pointer;
       SKIP_WHITESPACE ();
     }
-  if (isdigit (*input_line_pointer) || *input_line_pointer == '-')
+  if (isdigit ((unsigned char) *input_line_pointer)
+      || *input_line_pointer == '-')
     (void) get_absolute_expression ();
 
   demand_empty_rest_of_line ();
@@ -3144,7 +3155,7 @@ ecoff_directive_extern (ignore)
     ++input_line_pointer;
   size = get_absolute_expression ();
 
-  symbolp->ecoff_extern_size = size;
+  symbol_get_obj (symbolp)->ecoff_extern_size = size;
 }
 \f
 /* Parse .file directives.  */
@@ -3426,7 +3437,7 @@ ecoff_directive_weakext (ignore)
              ignore_rest_of_line();
              return;
            }
-         symbolP->sy_value = exp;
+         symbol_set_value_expression (symbolP, &exp);
        }
     }
 
@@ -3559,7 +3570,7 @@ ecoff_stab (sec, what, string, type, other, desc)
        listing_source_file (string);
 #endif
 
-      if (isdigit (*input_line_pointer)
+      if (isdigit ((unsigned char) *input_line_pointer)
          || *input_line_pointer == '-'
          || *input_line_pointer == '+')
        {
@@ -3609,12 +3620,12 @@ ecoff_stab (sec, what, string, type, other, desc)
      ECOFF symbol.  We want to compute the type of the ECOFF symbol
      independently.  */
   if (sym != (symbolS *) NULL)
-    hold = sym->ecoff_symbol;
+    hold = symbol_get_obj (sym)->ecoff_symbol;
 
   (void) add_ecoff_symbol (string, st, sc, sym, addend, value, indx);
 
   if (sym != (symbolS *) NULL)
-    sym->ecoff_symbol = hold;
+    symbol_get_obj (sym)->ecoff_symbol = hold;
 
   /* Restore normal file type.  */
   cur_file_ptr = save_file_ptr;
@@ -3651,7 +3662,7 @@ ecoff_frob_symbol (sym)
     }
 
   /* Double check weak symbols.  */
-  if (sym->bsym->flags & BSF_WEAK)
+  if (S_IS_WEAK (sym))
     {
       if (S_IS_COMMON (sym))
        as_bad (_("Symbol `%s' can not be both weak and common"),
@@ -3730,6 +3741,7 @@ ecoff_build_lineno (backend, buf, bufend, offset, linecntptr)
   long iline;
   long totcount;
   lineno_list_t first;
+  lineno_list_t *local_first_lineno = first_lineno;
 
   if (linecntptr != (long *) NULL)
     *linecntptr = 0;
@@ -3749,25 +3761,29 @@ ecoff_build_lineno (backend, buf, bufend, offset, linecntptr)
      embedded PIC code, it will put strings in the .text section
      before the first procedure.  We cope by inserting a dummy line if
      the address of the first procedure is not 0.  Hopefully this
-     won't screw things up too badly.  */
-  if (first_proc_ptr != (proc_t *) NULL
-      && first_lineno != (lineno_list_t *) NULL
+     won't screw things up too badly.  
+
+     Don't do this for ECOFF assembly source line numbers.  They work
+     without this extra attention.  */
+  if (debug_type != DEBUG_ECOFF
+      && first_proc_ptr != (proc_t *) NULL
+      && local_first_lineno != (lineno_list_t *) NULL
       && ((S_GET_VALUE (first_proc_ptr->sym->as_sym)
           + bfd_get_section_vma (stdoutput,
                                  S_GET_SEGMENT (first_proc_ptr->sym->as_sym)))
          != 0))
     {
-      first.file = first_lineno->file;
-      first.proc = first_lineno->proc;
+      first.file = local_first_lineno->file;
+      first.proc = local_first_lineno->proc;
       first.frag = &zero_address_frag;
       first.paddr = 0;
       first.lineno = 0;
 
-      first.next = first_lineno;
-      first_lineno = &first;
+      first.next = local_first_lineno;
+      local_first_lineno = &first;
     }
 
-  for (l = first_lineno; l != (lineno_list_t *) NULL; l = l->next)
+  for (l = local_first_lineno; l != (lineno_list_t *) NULL; l = l->next)
     {
       long count;
       long delta;
@@ -4072,7 +4088,8 @@ ecoff_build_symbols (backend, buf, bufend, offset)
                                  || S_IS_WEAK (as_sym)
                                  || ! S_IS_DEFINED (as_sym)))
                            {
-                             if ((as_sym->bsym->flags & BSF_FUNCTION) != 0)
+                             if ((symbol_get_bfdsym (as_sym)->flags
+                                  & BSF_FUNCTION) != 0)
                                st = st_Proc;
                              else
                                st = st_Global;
@@ -4084,18 +4101,19 @@ ecoff_build_symbols (backend, buf, bufend, offset)
 
                          if (! S_IS_DEFINED (as_sym))
                            {
-                             if (as_sym->ecoff_extern_size == 0
-                                 || (as_sym->ecoff_extern_size
-                                     > bfd_get_gp_size (stdoutput)))
+                             valueT s;
+
+                             s = symbol_get_obj (as_sym)->ecoff_extern_size;
+                             if (s == 0
+                                 || s > bfd_get_gp_size (stdoutput))
                                sc = sc_Undefined;
                              else
                                {
                                  sc = sc_SUndefined;
-                                 sym_ptr->ecoff_sym.asym.value =
-                                   as_sym->ecoff_extern_size;
+                                 sym_ptr->ecoff_sym.asym.value = s;
                                }
 #ifdef S_SET_SIZE
-                             S_SET_SIZE (as_sym, as_sym->ecoff_extern_size);
+                             S_SET_SIZE (as_sym, s);
 #endif
                            }
                          else if (S_IS_COMMON (as_sym))
@@ -4278,7 +4296,7 @@ ecoff_build_symbols (backend, buf, bufend, offset)
                     case this is an external symbol.  Note that this
                     destroys the asym.index field.  */
                  if (as_sym != (symbolS *) NULL
-                     && as_sym->ecoff_symbol == sym_ptr)
+                     && symbol_get_obj (as_sym)->ecoff_symbol == sym_ptr)
                    {
                      if ((sym_ptr->ecoff_sym.asym.st == st_Proc
                           || sym_ptr->ecoff_sym.asym.st == st_StaticProc)
@@ -4647,7 +4665,7 @@ ecoff_setup_ext ()
 
   for (sym = symbol_rootP; sym != (symbolS *) NULL; sym = symbol_next (sym))
     {
-      if (sym->ecoff_symbol == NULL)
+      if (symbol_get_obj (sym)->ecoff_symbol == NULL)
        continue;
 
       /* If this is a local symbol, then force the fields to zero.  */
@@ -4655,13 +4673,16 @@ ecoff_setup_ext ()
          && ! S_IS_WEAK (sym)
          && S_IS_DEFINED (sym))
        {
-         sym->ecoff_symbol->ecoff_sym.asym.value = 0;
-         sym->ecoff_symbol->ecoff_sym.asym.st = (int) st_Nil;
-         sym->ecoff_symbol->ecoff_sym.asym.sc = (int) sc_Nil;
-         sym->ecoff_symbol->ecoff_sym.asym.index = indexNil;
+         struct localsym *lsym;
+
+         lsym = symbol_get_obj (sym)->ecoff_symbol;
+         lsym->ecoff_sym.asym.value = 0;
+         lsym->ecoff_sym.asym.st = (int) st_Nil;
+         lsym->ecoff_sym.asym.sc = (int) sc_Nil;
+         lsym->ecoff_sym.asym.index = indexNil;
        }
 
-      obj_ecoff_set_ext (sym, &sym->ecoff_symbol->ecoff_sym);
+      obj_ecoff_set_ext (sym, &symbol_get_obj (sym)->ecoff_symbol->ecoff_sym);
     }
 }
 
@@ -4711,12 +4732,12 @@ ecoff_build_debug (hdr, bufp, backend)
   cur_proc_ptr = (proc_t *) NULL;
   for (sym = symbol_rootP; sym != (symbolS *) NULL; sym = symbol_next (sym))
     {
-      if (sym->ecoff_symbol != NULL
-         || sym->ecoff_file == (efdr_t *) NULL
-         || (sym->bsym->flags & BSF_SECTION_SYM) != 0)
+      if (symbol_get_obj (sym)->ecoff_symbol != NULL
+         || symbol_get_obj (sym)->ecoff_file == (efdr_t *) NULL
+         || (symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) != 0)
        continue;
 
-      cur_file_ptr = sym->ecoff_file;
+      cur_file_ptr = symbol_get_obj (sym)->ecoff_file;
       add_ecoff_symbol ((const char *) NULL, st_Nil, sc_Nil, sym,
                        (bfd_vma) 0, S_GET_VALUE (sym), indexNil);
     }
@@ -5243,12 +5264,14 @@ ecoff_no_current_file ()
 }
 
 void
-ecoff_generate_asm_lineno (filename, lineno)
-     const char *filename;
-     int lineno;
+ecoff_generate_asm_lineno ()
 {
+  unsigned int lineno;
+  char *filename;
   lineno_list_t *list;
 
+  as_where (&filename, &lineno);
+
   if (current_stabs_filename == (char *)NULL
       || strcmp (current_stabs_filename, filename))
     add_file (filename, 0, 1);
@@ -5285,4 +5308,11 @@ ecoff_generate_asm_lineno (filename, lineno)
     }
 }
 
+#else
+
+void
+ecoff_generate_asm_lineno ()
+{
+}
+
 #endif /* ECOFF_DEBUGGING */
This page took 0.027277 seconds and 4 git commands to generate.