elfos.h (ASM_OUTPUT_SECTION_NAME): Use a hash table, not a list, to keep track of the sections.

* 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.

From-SVN: r37776
This commit is contained in:
Mark Mitchell 2000-11-27 04:25:32 +00:00 committed by Mark Mitchell
parent a4c9b97e26
commit 231db5f4ec
3 changed files with 38 additions and 19 deletions

View 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

View 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); \
} \

View 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.