OSDN Git Service

* config/elfos.h (ASM_OUTPUT_SECTION_NAME): Use a hash table, not
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 27 Nov 2000 04:25:32 +0000 (04:25 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 27 Nov 2000 04:25:32 +0000 (04:25 +0000)
a list, to keep track of the sections.
* tm.texi (ASM_OUTPUT_SECTION_NAME): Document the fact that the
parameter provided will always be a canonical string.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37776 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/elfos.h
gcc/tm.texi

index 9e64dcd..b6e8264 100644 (file)
@@ -1,3 +1,10 @@
+2000-11-26  Mark Mitchell  <mark@codesourcery.com>
+
+       * config/elfos.h (ASM_OUTPUT_SECTION_NAME): Use a hash table, not
+       a list, to keep track of the sections.
+       * tm.texi (ASM_OUTPUT_SECTION_NAME): Document the fact that the
+       parameter provided will always be a canonical string.
+
 2000-11-26  Neil Booth  <neilb@earthling.net>
 
         * cppmacro.c (cpp_scan_buffer_nooutput): Only scan the
index 3a2f292..9925ff5 100644 (file)
@@ -421,20 +421,27 @@ dtors_section ()                                          \
 #define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC)               \
   do                                                                   \
     {                                                                  \
-      static struct section_info                                       \
+      static htab_t htab;                                               \
+                                                                        \
+      struct section_info                                               \
       {                                                                        \
-       struct section_info *next;                                      \
-       char *name;                                                     \
        enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type;              \
-      } *sections;                                                     \
+      };                                                                \
+                                                                        \
       struct section_info *s;                                          \
       const char *mode;                                                        \
-      enum sect_enum type;                                             \
-                                                                       \
-      for (s = sections; s; s = s->next)                               \
-       if (!strcmp (NAME, s->name))                                    \
-         break;                                                        \
-                                                                       \
+      enum sect_enum type;                                              \
+      PTR* slot;                                                        \
+                                                                        \
+      /* The names we put in the hashtable will always be the unique    \
+        versions gived to us by the stringtable, so we can just use    \
+        their addresses as the keys.  */                               \
+      if (!htab)                                                        \
+       htab = htab_create (31,                                         \
+                           htab_hash_pointer,                          \
+                           htab_eq_pointer,                            \
+                           NULL);                                      \
+                                                                        \
       if (DECL && TREE_CODE (DECL) == FUNCTION_DECL)                   \
        type = SECT_EXEC, mode = "ax";                                  \
       else if (DECL && DECL_READONLY_SECTION (DECL, RELOC))            \
@@ -442,21 +449,23 @@ dtors_section ()                                          \
       else                                                             \
        type = SECT_RW, mode = "aw";                                    \
                                                                        \
-      if (s == 0)                                                      \
-       {                                                               \
+                                                                        \
+      /* See if we already have an entry for this section.  */          \
+      slot = htab_find_slot (htab, NAME, INSERT);                       \
+      if (!*slot)                                                       \
+       {                                                               \
          s = (struct section_info *) xmalloc (sizeof (* s));           \
-         s->name = xmalloc ((strlen (NAME) + 1) * sizeof (* NAME));    \
-         strcpy (s->name, NAME);                                       \
          s->type = type;                                               \
-         s->next = sections;                                           \
-         sections = s;                                                 \
+         *slot = s;                                                    \
          fprintf (FILE, "\t.section\t%s,\"%s\",@progbits\n",           \
                   NAME, mode);                                         \
        }                                                               \
       else                                                             \
        {                                                               \
+         s = (struct section_info *) *slot;                            \
          if (DECL && s->type != type)                                  \
-           error_with_decl (DECL, "%s causes a section type conflict");\
+           error_with_decl (DECL,                                      \
+                            "%s causes a section type conflict");      \
                                                                        \
          fprintf (FILE, "\t.section\t%s\n", NAME);                     \
        }                                                               \
index cb92365..0324988 100644 (file)
@@ -5439,8 +5439,11 @@ A C statement to output something to the assembler file to switch to section
 @var{name} for object @var{decl} which is either a @code{FUNCTION_DECL}, a
 @code{VAR_DECL} or @code{NULL_TREE}.  @var{reloc}
 indicates whether the initial value of @var{exp} requires link-time
-relocations.  Some target formats do not support
-arbitrary sections.  Do not define this macro in such cases.
+relocations.  The string given by @var{name} will always be the
+canonical version stored in the global stringpool.
+
+Some target formats do not support arbitrary sections.  Do not define
+this macro in such cases.
 
 At present this macro is only used to support section attributes.
 When this macro is undefined, section attributes are disabled.