summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/elfos.h43
-rw-r--r--gcc/tm.texi7
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 <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
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.