From f9e78c9f5a4a049340bf7c9e6856cdf1275aaeee Mon Sep 17 00:00:00 2001 From: mmitchel Date: Mon, 27 Nov 2000 04:25:32 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37776 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/config/elfos.h | 43 ++++++++++++++++++++++++++----------------- gcc/tm.texi | 7 +++++-- 3 files changed, 38 insertions(+), 19 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9e64dcd2146..b6e8264f7cf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2000-11-26 Mark Mitchell + + * 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 * cppmacro.c (cpp_scan_buffer_nooutput): Only scan the diff --git a/gcc/config/elfos.h b/gcc/config/elfos.h index 3a2f2925423..9925ff5cf33 100644 --- a/gcc/config/elfos.h +++ b/gcc/config/elfos.h @@ -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); \ } \ diff --git a/gcc/tm.texi b/gcc/tm.texi index cb923653c36..03249881daf 100644 --- a/gcc/tm.texi +++ b/gcc/tm.texi @@ -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. -- 2.11.0