* symbols.c: Replace CONST by const throughout.
authorAlan Modra <amodra@gmail.com>
Fri, 7 Jun 2002 14:57:50 +0000 (14:57 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 7 Jun 2002 14:57:50 +0000 (14:57 +0000)
(symbol_find_exact): Split out from..
(symbol_find_base): ..here.
* symbols.h: Replace CONST by const throughout.
(symbol_find_exact): Declare.
* config/obj-elf.c: #include "struc-symbol.h".
(elf_frob_file): If group name matches an exported symbol, use that
symbol for the signature and ".group" as the section name.

gas/ChangeLog
gas/config/obj-elf.c
gas/symbols.c
gas/symbols.h

index 44d33047b6fa19c37a6d12880ead96015d2d37af..eee61f51afe56ee5593feede60b0cf034919f139 100644 (file)
@@ -1,3 +1,14 @@
+2002-06-07  Alan Modra  <amodra@bigpond.net.au>
+
+       * symbols.c: Replace CONST by const throughout.
+       (symbol_find_exact): Split out from..
+       (symbol_find_base): ..here.
+       * symbols.h: Replace CONST by const throughout.
+       (symbol_find_exact): Declare.
+       * config/obj-elf.c: #include "struc-symbol.h".
+       (elf_frob_file): If group name matches an exported symbol, use that
+       symbol for the signature and ".group" as the section name.
+
 Thu Jun  6 17:42:12 2002  J"orn Rennecke <joern.rennecke@superh.com>
 
        * config/tc-sh.c (parse_at): @(symbol,pc) is A_DISP_PC again,
index ea8bd4d4669efdfc86412b4b4dba3319fbda592d..2266952c373e860c9add1ebad9da8c7d707be471 100644 (file)
@@ -24,6 +24,7 @@
 #include "safe-ctype.h"
 #include "subsegs.h"
 #include "obstack.h"
+#include "struc-symbol.h"
 
 #ifndef ECOFF_DEBUGGING
 #define ECOFF_DEBUGGING 0
@@ -2024,8 +2025,11 @@ elf_frob_file ()
   for (i = 0; i < list.num_group; i++)
     {
       const char *group_name = elf_group_name (list.head[i]);
+      const char *sec_name;
       asection *s;
       flagword flags;
+      struct symbol *sy;
+      int has_sym;
 
       flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_GROUP;
       for (s = list.head[i]; s != NULL; s = elf_next_in_group (s))
@@ -2040,7 +2044,18 @@ elf_frob_file ()
              }
          }
 
-      s = subseg_force_new (group_name, 0);
+      sec_name = group_name;
+      sy = symbol_find_exact (group_name);
+      has_sym = 0;
+      if (sy != NULL
+         && (sy == symbol_lastP
+             || (sy->sy_next != NULL
+                 && sy->sy_next->sy_previous == sy)))
+       {
+         has_sym = 1;
+         sec_name = ".group";
+       }
+      s = subseg_force_new (sec_name, 0);
       if (s == NULL
          || !bfd_set_section_flags (stdoutput, s, flags)
          || !bfd_set_section_alignment (stdoutput, s, 2))
@@ -2051,6 +2066,8 @@ elf_frob_file ()
 
       /* Pass a pointer to the first section in this group.  */
       elf_next_in_group (s) = list.head[i];
+      if (has_sym)
+       elf_group_id (s) = sy->bsym;
 
       s->_raw_size = 4 * (list.elt_count[i] + 1);
       s->contents = frag_more (s->_raw_size);
index d86c52a8ac03645dd53cce8fc27d9b91562392d6..58d0c0793ac0c51719a001d90073f92a5951c139 100644 (file)
@@ -1,6 +1,6 @@
 /* symbols.c -symbol table-
    Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001
+   1999, 2000, 2001, 2002
    Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
@@ -569,7 +569,7 @@ symbol_find_or_make (name)
 
 symbolS *
 symbol_make (name)
-     CONST char *name;
+     const char *name;
 {
   symbolS *symbolP;
 
@@ -589,7 +589,7 @@ symbol_make (name)
 
 symbolS *
 symbol_find (name)
-     CONST char *name;
+     const char *name;
 {
 #ifdef STRIP_UNDERSCORE
   return (symbol_find_base (name, 1));
@@ -598,9 +598,26 @@ symbol_find (name)
 #endif /* STRIP_UNDERSCORE */
 }
 
+symbolS *
+symbol_find_exact (name)
+     const char *name;
+{
+#ifdef BFD_ASSEMBLER
+  {
+    struct local_symbol *locsym;
+
+    locsym = (struct local_symbol *) hash_find (local_hash, name);
+    if (locsym != NULL)
+      return (symbolS *) locsym;
+  }
+#endif
+
+  return ((symbolS *) hash_find (sy_hash, name));
+}
+
 symbolS *
 symbol_find_base (name, strip_underscore)
-     CONST char *name;
+     const char *name;
      int strip_underscore;
 {
   if (strip_underscore && *name == '_')
@@ -633,17 +650,7 @@ symbol_find_base (name, strip_underscore)
       *copy = '\0';
     }
 
-#ifdef BFD_ASSEMBLER
-  {
-    struct local_symbol *locsym;
-
-    locsym = (struct local_symbol *) hash_find (local_hash, name);
-    if (locsym != NULL)
-      return (symbolS *) locsym;
-  }
-#endif
-
-  return ((symbolS *) hash_find (sy_hash, name));
+  return symbol_find_exact (name);
 }
 
 /* Once upon a time, symbols were kept in a singly linked list.  At
@@ -1816,7 +1823,7 @@ S_IS_STABD (s)
   return S_GET_NAME (s) == 0;
 }
 
-CONST char *
+const char *
 S_GET_NAME (s)
      symbolS *s;
 {
index a80ca8c7b50a344b03f5c5978baf78a243125caa..2fb0439679a29cd34dce1d3a5d914f8d4ab2da82 100644 (file)
@@ -1,6 +1,6 @@
 /* symbols.h -
-   Copyright 1987, 1990, 1992, 1993, 1994, 1995, 1997, 1999, 2000, 2001
-   Free Software Foundation, Inc.
+   Copyright 1987, 1990, 1992, 1993, 1994, 1995, 1997, 1999, 2000, 2001,
+   2002 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -48,13 +48,14 @@ extern int symbol_table_frozen;
 extern int symbols_case_sensitive;
 
 char *decode_local_label_name PARAMS ((char *s));
-symbolS *symbol_find PARAMS ((CONST char *name));
-symbolS *symbol_find_base PARAMS ((CONST char *name, int strip_underscore));
+symbolS *symbol_find PARAMS ((const char *name));
+symbolS *symbol_find_exact PARAMS ((const char *name));
+symbolS *symbol_find_base PARAMS ((const char *name, int strip_underscore));
 symbolS *symbol_find_or_make PARAMS ((const char *name));
-symbolS *symbol_make PARAMS ((CONST char *name));
-symbolS *symbol_new PARAMS ((CONST char *name, segT segment, valueT value,
+symbolS *symbol_make PARAMS ((const char *name));
+symbolS *symbol_new PARAMS ((const char *name, segT segment, valueT value,
                             fragS * frag));
-symbolS *symbol_create PARAMS ((CONST char *name, segT segment, valueT value,
+symbolS *symbol_create PARAMS ((const char *name, segT segment, valueT value,
                                fragS * frag));
 symbolS *colon PARAMS ((const char *sym_name));
 void local_colon PARAMS ((int n));
@@ -93,7 +94,7 @@ extern int S_IS_DEBUG PARAMS ((symbolS *));
 extern int S_IS_LOCAL PARAMS ((symbolS *));
 extern int S_IS_EXTERN PARAMS ((symbolS *));
 extern int S_IS_STABD PARAMS ((symbolS *));
-extern CONST char *S_GET_NAME PARAMS ((symbolS *));
+extern const char *S_GET_NAME PARAMS ((symbolS *));
 extern segT S_GET_SEGMENT PARAMS ((symbolS *));
 extern void S_SET_SEGMENT PARAMS ((symbolS *, segT));
 extern void S_SET_EXTERNAL PARAMS ((symbolS *));