Commit 01fa3508 by Jeffrey A Law Committed by Jeff Law

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

	* pa/pa-64.h (ASM_OUTPUT_SECTION_NAME): Use a hash table, not
	a list, to keep track of the sections.

From-SVN: r37843
parent 5662d533
Tue Nov 28 21:56:45 2000 Jeffrey A Law (law@cygnus.com)
* pa/pa-64.h (ASM_OUTPUT_SECTION_NAME): Use a hash table, not
a list, to keep track of the sections.
2000-11-28 Nick Clifton <nickc@redhat.com> 2000-11-28 Nick Clifton <nickc@redhat.com>
* config/arm/arm.md (pic_load_addr): Split into * config/arm/arm.md (pic_load_addr): Split into
......
...@@ -273,20 +273,28 @@ dtors_section () \ ...@@ -273,20 +273,28 @@ dtors_section () \
If DECL is NULL, no attributes are emitted. */ If DECL is NULL, no attributes are emitted. */
#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \ #define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
do { \ 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; \ enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type; \
} *sections; \ }; \
\
struct section_info *s; \ struct section_info *s; \
char *mode; \ const char *mode; \
enum sect_enum type; \ enum sect_enum type; \
PTR* slot; \
\ \
for (s = sections; s; s = s->next) \ /* The names we put in the hashtable will always be the unique \
if (!strcmp (NAME, s->name)) \ versions gived to us by the stringtable, so we can just use \
break; \ 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) \ if (DECL && TREE_CODE (DECL) == FUNCTION_DECL) \
type = SECT_EXEC, mode = "ax"; \ type = SECT_EXEC, mode = "ax"; \
...@@ -295,24 +303,28 @@ do { \ ...@@ -295,24 +303,28 @@ do { \
else \ else \
type = SECT_RW, mode = "aw"; \ 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 (struct section_info)); \ s = (struct section_info *) xmalloc (sizeof (* s)); \
s->name = xmalloc ((strlen (NAME) + 1) * sizeof (*NAME)); \
strcpy (s->name, NAME); \
s->type = type; \ s->type = type; \
s->next = sections; \ *slot = s; \
sections = s; \ fprintf (FILE, "\t.section\t%s,\"%s\",@progbits\n", \
fprintf (FILE, "\t.section\t%s,\"%s\",@progbits\n", NAME, mode); \ NAME, mode); \
} \ } \
else \ else \
{ \ { \
s = (struct section_info *) *slot; \
if (DECL && s->type != type) \ 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); \ fprintf (FILE, "\t.section\t%s\n", NAME); \
} \ } \
} while (0) } \
while (0)
#define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1) #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
#define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL)) #define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment