* config/obj-ecoff.c (get_tag): Save tag name in permanent memory
authorIan Lance Taylor <ian@airs.com>
Mon, 2 Aug 1993 22:28:25 +0000 (22:28 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 2 Aug 1993 22:28:25 +0000 (22:28 +0000)
and in hash_ptr->string.

gas/ChangeLog
gas/config/obj-ecoff.c

index 0a3c0dce45b05a275e2ec9e2cc3cc1817320d435..9e8f3f2b022e0c4c91f30155a8eda4a22a3f0c8d 100644 (file)
@@ -1,5 +1,8 @@
 Mon Aug  2 17:35:48 1993  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
 
+       * config/obj-ecoff.c (get_tag): Save tag name in permanent memory
+       and in hash_ptr->string.
+
        * app.c (do_scrub_next_char): Reset state to 0 after .appline if
        file name is not seen.
 
index 30d292f234143d95f08854ab5bc0acb02562202c..e4f90c04b71af8a722ce86c721457ad4382be13b 100644 (file)
@@ -2108,11 +2108,16 @@ get_tag (tag, sym, basic_type)
 
   if (hash_ptr == (shash_t *) NULL)
     {
+      char *perm;
+
+      perm = xmalloc (strlen (tag) + 1);
+      strcpy (perm, tag);
       hash_ptr = allocate_shash ();
-      err = hash_insert (tag_hash, tag, (char *) hash_ptr);
+      err = hash_insert (tag_hash, perm, (char *) hash_ptr);
       if (*err != '\0')
        as_fatal ("Inserting \"%s\" into tag hash table: %s",
                  tag, err);
+      hash_ptr->string = perm;
     }
 
   tag_ptr = allocate_tag ();
@@ -3844,19 +3849,28 @@ ecoff_build_symbols (buf,
 
                      /* The value of a block start symbol is the
                         offset from the start of the procedure.  For
-                        other symbols we just use the gas value.  */
+                        other symbols we just use the gas value (but
+                        we must offset it by the vma of the section,
+                        just as BFD does, because BFD will not see
+                        this value).  */
                      if (sym_ptr->ecoff_sym.st == (int) st_Block
                          && sym_ptr->ecoff_sym.sc == (int) sc_Text)
                        {
+                         symbolS *begin_sym;
+
                          know (sym_ptr->proc_ptr != (proc_t *) NULL);
+                         begin_sym = sym_ptr->proc_ptr->sym->as_sym;
+                         if (S_GET_SEGMENT (as_sym)
+                             != S_GET_SEGMENT (begin_sym))
+                           as_warn (".begin/.bend in different segments");
                          sym_ptr->ecoff_sym.value =
-                           (bfd_asymbol_value (as_sym->bsym)
-                            - bfd_asymbol_value (sym_ptr->proc_ptr->sym
-                                                 ->as_sym->bsym));
+                           S_GET_VALUE (as_sym) - S_GET_VALUE (begin_sym);
                        }
                      else
                        sym_ptr->ecoff_sym.value =
-                         bfd_asymbol_value (as_sym->bsym);
+                         (S_GET_VALUE (as_sym)
+                          + bfd_get_section_vma (stdoutput,
+                                                 S_GET_SEGMENT (as_sym)));
 
                      /* Set st_Proc to st_StaticProc for local
                         functions.  */
@@ -4000,19 +4014,26 @@ ecoff_build_symbols (buf,
                        {
                          know (as_sym != (symbolS *) NULL);
                          know (begin_ptr->as_sym != (symbolS *) NULL);
+                         if (S_GET_SEGMENT (as_sym)
+                             != S_GET_SEGMENT (begin_ptr->as_sym))
+                           as_warn (".begin/.bend in different segments");
                          sym_ptr->ecoff_sym.value =
-                           (bfd_asymbol_value (as_sym->bsym)
-                            - bfd_asymbol_value (begin_ptr->as_sym->bsym));
+                           (S_GET_VALUE (as_sym)
+                            - S_GET_VALUE (begin_ptr->as_sym));
                        }
                      else if (begin_type == st_Block
                               && sym_ptr->ecoff_sym.sc != (int) sc_Info)
                        {
+                         symbolS *begin_sym;
+
                          know (as_sym != (symbolS *) NULL);
                          know (sym_ptr->proc_ptr != (proc_t *) NULL);
+                         begin_sym = sym_ptr->proc_ptr->sym->as_sym;
+                         if (S_GET_SEGMENT (as_sym)
+                             != S_GET_SEGMENT (begin_sym))
+                           as_warn (".begin/.bend in different segments");
                          sym_ptr->ecoff_sym.value =
-                           (bfd_asymbol_value (as_sym->bsym)
-                            - bfd_asymbol_value (sym_ptr->proc_ptr->sym
-                                                 ->as_sym->bsym));
+                           S_GET_VALUE (as_sym) - S_GET_VALUE (begin_sym);
                        }
                    }
 
@@ -4143,9 +4164,13 @@ ecoff_build_procs (buf, bufend, offset)
              proc_end = proc_ptr + proc_cnt;
              for (; proc_ptr < proc_end; proc_ptr++)
                {
+                 symbolS *adr_sym;
                  unsigned long adr;
 
-                 adr = bfd_asymbol_value (proc_ptr->sym->as_sym->bsym);
+                 adr_sym = proc_ptr->sym->as_sym;
+                 adr = (S_GET_VALUE (adr_sym)
+                        + bfd_get_section_vma (stdoutput,
+                                               S_GET_SEGMENT (adr_sym)));
                  if (first)
                    {
                      if (first_fil)
@@ -4499,7 +4524,7 @@ ecoff_frob_file ()
 
       cur_file_ptr = sym->ecoff_file;
       add_ecoff_symbol ((const char *) NULL, st_Nil, sc_Nil, sym,
-                       bfd_asymbol_value (sym->bsym), indexNil);
+                       S_GET_VALUE (sym), indexNil);
     }
   cur_proc_ptr = hold_proc_ptr;
   cur_file_ptr = hold_file_ptr;