]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
* ecoff.c (localsym_t): Add addend field.
authorIan Lance Taylor <ian@airs.com>
Mon, 29 Jan 1996 17:25:26 +0000 (17:25 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 29 Jan 1996 17:25:26 +0000 (17:25 +0000)
(add_ecoff_symbol): Add addend argument.  Change all callers.
(coff_sym_value): Make static.
(coff_sym_addend): New static variable.
(ecoff_directive_def): Initialize coff_sym_addend.
(ecoff_directive_val): Accept symbol + constant.
(ecoff_directive_endef): Pass coff_sym_addend to add_ecoff_symbol.
(ecoff_build_symbols): Include the addend in the symbol value.

gas/ChangeLog
gas/ecoff.c

index f3257481051b55c6f00a9f06f33c5121bd29fe19..22561c8ca71c5503f1b49cf1cf7d8de36b4a6b95 100644 (file)
@@ -1,3 +1,14 @@
+Mon Jan 29 12:21:30 1996  Ian Lance Taylor  <ian@cygnus.com>
+
+       * ecoff.c (localsym_t): Add addend field.
+       (add_ecoff_symbol): Add addend argument.  Change all callers.
+       (coff_sym_value): Make static.
+       (coff_sym_addend): New static variable.
+       (ecoff_directive_def): Initialize coff_sym_addend.
+       (ecoff_directive_val): Accept symbol + constant.
+       (ecoff_directive_endef): Pass coff_sym_addend to add_ecoff_symbol.
+       (ecoff_build_symbols): Include the addend in the symbol value.
+
 Fri Jan 26 19:28:52 1996  Kim Knuttila  <krk@cygnus.com>
 
        * config/tc-ppc.c (md_assemble): Ignore overflow on 
index 51d5c659317442e7121dd73ef851e3c8c7556cdb..0d70ba3b930754405efdcde3e20cfdc0036e0a56 100644 (file)
@@ -1,5 +1,5 @@
 /* ECOFF debugging support.
-   Copyright (C) 1993 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1994, 1995, 1996 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
@@ -18,8 +18,9 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with GAS; see the file COPYING.  If not, write to
-   the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   along with GAS; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA.  */
 
 #include "as.h"
 
@@ -832,6 +833,7 @@ typedef struct scope {
 typedef struct localsym {
   const char *name;            /* symbol name */
   symbolS *as_sym;             /* symbol as seen by gas */
+  bfd_vma addend;              /* addend to as_sym value */
   struct efdr *file_ptr;       /* file pointer */
   struct ecoff_proc *proc_ptr; /* proc pointer */
   struct localsym *begin_ptr;  /* symbol at start of block */
@@ -1425,7 +1427,7 @@ static symint_t add_string PARAMS ((varray_t *vp,
                                    shash_t **ret_hash));
 static localsym_t *add_ecoff_symbol PARAMS ((const char *str, st_t type,
                                             sc_t storage, symbolS *sym,
-                                            symint_t value,
+                                            bfd_vma addend, symint_t value,
                                             symint_t indx));
 static symint_t add_aux_sym_symint PARAMS ((symint_t aux_word));
 static symint_t add_aux_sym_rndx PARAMS ((int file_index,
@@ -1600,11 +1602,12 @@ add_string (vp, hash_tbl, str, ret_hash)
 /* Add debugging information for a symbol.  */
 
 static localsym_t *
-add_ecoff_symbol (str, type, storage, sym_value, value, indx)
+add_ecoff_symbol (str, type, storage, sym_value, addend, value, indx)
      const char *str;                  /* symbol name */
      st_t type;                                /* symbol type */
      sc_t storage;                     /* storage class */
      symbolS *sym_value;               /* associated symbol.  */
+     bfd_vma addend;                   /* addend to sym_value.  */
      symint_t value;                   /* value of symbol */
      symint_t indx;                    /* index to local/aux. syms */
 {
@@ -1634,6 +1637,7 @@ add_ecoff_symbol (str, type, storage, sym_value, value, indx)
   psym->as_sym = sym_value;
   if (sym_value != (symbolS *) NULL)
     sym_value->ecoff_symbol = psym;
+  psym->addend = addend;
   psym->file_ptr = cur_file_ptr;
   psym->proc_ptr = cur_proc_ptr;
   psym->begin_ptr = (localsym_t *) NULL;
@@ -2104,6 +2108,7 @@ add_unknown_tag (ptag)
                          st_Block,
                          sc_Info,
                          (symbolS *) NULL,
+                         (bfd_vma) 0,
                          (symint_t) 0,
                          (symint_t) 0);
 
@@ -2111,6 +2116,7 @@ add_unknown_tag (ptag)
                           st_End,
                           sc_Info,
                           (symbolS *) NULL,
+                          (bfd_vma) 0,
                           (symint_t) 0,
                           (symint_t) 0);
 
@@ -2157,7 +2163,8 @@ add_procedure (func)
   /* Push the start of the function.  */
   new_proc_ptr->sym = add_ecoff_symbol ((const char *) NULL, st_Proc, sc_Text,
                                        symbol_find_or_make (func),
-                                       (symint_t) 0, (symint_t) 0);
+                                       (bfd_vma) 0, (symint_t) 0,
+                                       (symint_t) 0);
 
   ++proc_cnt;
 
@@ -2225,7 +2232,7 @@ add_file (file_name, indx, fake)
                               symbol_new ("L0\001", now_seg,
                                           (valueT) frag_now_fix (),
                                           frag_now),
-                              0, ECOFF_MARK_STAB (N_SOL));
+                              (bfd_vma) 0, 0, ECOFF_MARK_STAB (N_SOL));
       return;
     }
 
@@ -2292,7 +2299,7 @@ add_file (file_name, indx, fake)
       /* Push the start of the filename. We assume that the filename
          will be stored at string offset 1.  */
       (void) add_ecoff_symbol (file_name, st_File, sc_Text,
-                              (symbolS *) NULL,
+                              (symbolS *) NULL, (bfd_vma) 0,
                               (symint_t) 0, (symint_t) 0);
       fil_ptr->fdr.rss = 1;
       fil_ptr->name = &fil_ptr->strings.last->datum->byte[1];
@@ -2321,9 +2328,9 @@ add_file (file_name, indx, fake)
                                   symbol_new ("L0\001", now_seg,
                                               (valueT) frag_now_fix (),
                                               frag_now),
-                                  0, ECOFF_MARK_STAB (N_SO));
+                                  (bfd_vma) 0, 0, ECOFF_MARK_STAB (N_SO));
           (void) add_ecoff_symbol ("void:t1=1", st_Nil, sc_Nil,
-                                  (symbolS *) NULL, 0,
+                                  (symbolS *) NULL, (bfd_vma) 0, 0,
                                   ECOFF_MARK_STAB (N_LSYM));
        }
 #endif
@@ -2438,7 +2445,7 @@ ecoff_directive_begin (ignore)
 
   (void) add_ecoff_symbol ((const char *) NULL, st_Block, sc_Text,
                           symbol_find_or_make (name),
-                          (symint_t) 0, (symint_t) 0);
+                          (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
 
   *input_line_pointer = name_end;
 
@@ -2483,7 +2490,7 @@ ecoff_directive_bend (ignore)
     as_warn (".bend directive names unknown symbol");
   else
     (void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text, endsym,
-                            (symint_t) 0, (symint_t) 0);
+                            (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
 
   *input_line_pointer = name_end;
 
@@ -2503,7 +2510,8 @@ static st_t coff_symbol_typ;
 static int coff_is_function;
 static char *coff_tag;
 static valueT coff_value;
-symbolS *coff_sym_value;
+static symbolS *coff_sym_value;
+static bfd_vma coff_sym_addend;
 static int coff_inside_enumeration;
 
 /* Handle a .def directive: start defining a symbol.  */
@@ -2541,6 +2549,7 @@ ecoff_directive_def (ignore)
       coff_tag = (char *) NULL;
       coff_value = 0;
       coff_sym_value = (symbolS *) NULL;
+      coff_sym_addend = 0;
     }
 
   *input_line_pointer = name_end;
@@ -2779,6 +2788,8 @@ void
 ecoff_directive_val (ignore)
      int ignore;
 {
+  expressionS exp;
+
   if (coff_sym_name == (char *) NULL)
     {
       as_warn (".val pseudo-op used outside of .def/.endef; ignored");
@@ -2786,26 +2797,20 @@ ecoff_directive_val (ignore)
       return;
     }
 
-  if (! is_name_beginner ((unsigned char) *input_line_pointer))
-    coff_value = get_absolute_expression ();
-  else
+  expression (&exp);
+  if (exp.X_op != O_constant && exp.X_op != O_symbol)
     {
-      char *name;
-      char name_end;
-
-      name = input_line_pointer;
-      name_end = get_symbol_end ();
-
-      if (strcmp (name, ".") == 0)
-       as_warn ("`.val .' not supported");
-      else
-       coff_sym_value = symbol_find_or_make (name);
-
-      *input_line_pointer = name_end;
+      as_bad (".val expression is too copmlex");
+      demand_empty_rest_of_line ();
+      return;
+    }
 
-      /* FIXME: gcc can generate address expressions here in unusual
-        cases (search for "obscure" in sdbout.c), although this is
-        very unlikely for a MIPS chip.  */
+  if (exp.X_op == O_constant)
+    coff_value = exp.X_add_number;
+  else
+    {
+      coff_sym_value = exp.X_add_symbol;
+      coff_sym_addend = exp.X_add_number;
     }
 
   demand_empty_rest_of_line ();
@@ -2967,6 +2972,7 @@ ecoff_directive_endef (ignore)
                          coff_symbol_typ,
                          coff_storage_class,
                          coff_sym_value,
+                         coff_sym_addend,
                          (symint_t) coff_value,
                          indx);
 
@@ -3036,10 +3042,10 @@ ecoff_directive_end (ignore)
   else
     {
       (void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text,
-                            symbol_new ("L0\001", now_seg,
-                                        (valueT) frag_now_fix (),
-                                        frag_now),
-                            (symint_t) 0, (symint_t) 0);
+                              symbol_new ("L0\001", now_seg,
+                                          (valueT) frag_now_fix (),
+                                          frag_now),
+                              (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
 
       if (stabs_seen && generate_asm_lineno)
        {
@@ -3049,7 +3055,8 @@ ecoff_directive_end (ignore)
          strcpy (n, name);
          strcat (n, ":F1");
          (void) add_ecoff_symbol ((const char *) n, stGlobal, scText, 
-                               ent, 0, ECOFF_MARK_STAB (N_FUN));
+                                  ent, (bfd_vma) 0, 0,
+                                  ECOFF_MARK_STAB (N_FUN));
        }
     }
 
@@ -3304,7 +3311,7 @@ ecoff_directive_loc (ignore)
                               symbol_new ("L0\001", now_seg,
                                           (valueT) frag_now_fix (),
                                           frag_now),
-                              0, lineno);
+                              (bfd_vma) 0, 0, lineno);
       return;
     }
 
@@ -3348,7 +3355,8 @@ mark_stabs (ignore)
       stabs_seen = 1;
       (void) add_ecoff_symbol (stabs_symbol, stNil, scInfo,
                               (symbolS *) NULL,
-                              (symint_t) -1, ECOFF_MARK_STAB (0));
+                              (bfd_vma) 0, (symint_t) -1,
+                              ECOFF_MARK_STAB (0));
     }
 }
 \f
@@ -3539,23 +3547,23 @@ ecoff_stab (sec, what, string, type, other, desc)
        {
          char *name;
          char name_end;
-
-         name = input_line_pointer;
-         name_end = get_symbol_end ();
-
-         sym = symbol_find_or_make (name);
+         expressionS exp;
 
          sc = sc_Nil;
          st = st_Nil;
          value = 0;
 
-         *input_line_pointer = name_end;
-         if (name_end == '+' || name_end == '-')
+         if (string == NULL)
+           {
+             name = input_line_pointer;
+             name_end = get_symbol_end ();
+             sym = symbol_find_or_make (name);
+             *input_line_pointer = name_end;
+           }
+         else
            {
-             ++input_line_pointer;
-             value = get_absolute_expression ();
-             if (name_end == '-')
-               value = - value;
+             sym = symbol_find_or_make (string);
+             expression (&sym->sy_value);
            }
        }
 
@@ -3568,7 +3576,7 @@ ecoff_stab (sec, what, string, type, other, desc)
   if (sym != (symbolS *) NULL)
     hold = sym->ecoff_symbol;
 
-  (void) add_ecoff_symbol (string, st, sc, sym, value, indx);
+  (void) add_ecoff_symbol (string, st, sc, sym, (bfd_vma) 0, value, indx);
 
   if (sym != (symbolS *) NULL)
     sym->ecoff_symbol = hold;
@@ -3585,8 +3593,8 @@ ecoff_frob_symbol (sym)
      symbolS *sym;
 {
   if (S_IS_COMMON (sym)
-          && S_GET_VALUE (sym) > 0
-          && S_GET_VALUE (sym) <= bfd_get_gp_size (stdoutput))
+      && S_GET_VALUE (sym) > 0
+      && S_GET_VALUE (sym) <= bfd_get_gp_size (stdoutput))
     {
       static asection scom_section;
       static asymbol scom_symbol;
@@ -3606,6 +3614,14 @@ ecoff_frob_symbol (sym)
        }
       S_SET_SEGMENT (sym, &scom_section);
     }
+
+  /* Double check weak symbols.  */
+  if (sym->bsym->flags & BSF_WEAK)
+    {
+      if (S_IS_COMMON (sym))
+       as_bad ("Symbol `%s' can not be both weak and common",
+               S_GET_NAME (sym));
+    }
 }
 \f
 /* Add bytes to the symbolic information buffer.  */
@@ -3984,7 +4000,8 @@ ecoff_build_symbols (backend, buf, bufend, offset)
                        sym_ptr->ecoff_sym.asym.value =
                          (S_GET_VALUE (as_sym)
                           + bfd_get_section_vma (stdoutput,
-                                                 S_GET_SEGMENT (as_sym)));
+                                                 S_GET_SEGMENT (as_sym))
+                          + sym_ptr->addend);
 
                      sym_ptr->ecoff_sym.weakext = S_IS_WEAK (as_sym);
 
@@ -4329,7 +4346,7 @@ ecoff_build_aux (backend, buf, bufend, offset)
   long iaux;
   vlinks_t *file_link;
 
-  bigendian = stdoutput->xvec->header_byteorder_big_p;
+  bigendian = bfd_big_endian (stdoutput);
 
   aux_out = (union aux_ext *) (*buf + offset);
 
@@ -4642,7 +4659,7 @@ ecoff_build_debug (hdr, bufp, backend)
 
       cur_file_ptr = sym->ecoff_file;
       add_ecoff_symbol ((const char *) NULL, st_Nil, sc_Nil, sym,
-                       S_GET_VALUE (sym), indexNil);
+                       (bfd_vma) 0, S_GET_VALUE (sym), indexNil);
     }
   cur_proc_ptr = hold_proc_ptr;
   cur_file_ptr = hold_file_ptr;
@@ -4670,6 +4687,7 @@ ecoff_build_debug (hdr, bufp, backend)
        (void) add_ecoff_symbol ((const char *) NULL,
                                 st_End, sc_Text,
                                 (symbolS *) NULL,
+                                (bfd_vma) 0,
                                 (symint_t) 0,
                                 (symint_t) 0);
     }
@@ -5247,7 +5265,7 @@ generate_ecoff_stab (what, string, type, other, desc)
   if (sym != (symbolS *) NULL)
     hold = sym->ecoff_symbol;
 
-  (void) add_ecoff_symbol (string, st, sc, sym, value, indx);
+  (void) add_ecoff_symbol (string, st, sc, sym, (bfd_vma) 0, value, indx);
 
   if (sym != (symbolS *) NULL)
     sym->ecoff_symbol = hold;