Commit eff784fe by Michael Hayes Committed by Michael Hayes

c4x.h (ASM_GLOBALIZE_LABEL): Use c4x_global_label.

	* config/c4x/c4x.h (ASM_GLOBALIZE_LABEL): Use c4x_global_label.
	(ASM_OUTPUT_EXTERNAL): Use c4x_external_ref.
	(ASM_OUTPUT_EXTERNAL_LIBCALL): Likewise.
	(ASM_FILE_END): Use c4x_file_end.
	* config/c4x/c4x.c (c4x_global_label): New function.
 	(c4x_external_ref, c4x_file_end): Likewise.
	* config/c4x/c4x-protos.h (c4x_global_label): Add prototype.
 	(c4x_external_ref, c4x_end_file): Likewise.

From-SVN: r31909
parent cf4ed945
2000-02-11 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
* config/c4x/c4x.h (ASM_GLOBALIZE_LABEL): Use c4x_global_label.
(ASM_OUTPUT_EXTERNAL): Use c4x_external_ref.
(ASM_OUTPUT_EXTERNAL_LIBCALL): Likewise.
(ASM_FILE_END): Use c4x_file_end.
* config/c4x/c4x.c (c4x_global_label): New function.
(c4x_external_ref, c4x_file_end): Likewise.
* config/c4x/c4x-protos.h (c4x_global_label): Add prototype.
(c4x_external_ref, c4x_end_file): Likewise.
2000-02-10 Zack Weinberg <zack@wolery.cumb.org>
* cppexp.c: Don't include cpphash.h.
......
......@@ -37,6 +37,12 @@ extern int c4x_handle_pragma PARAMS ((int (* p_getc) (void),
void (* p_ungetc) (int),
char *));
extern void c4x_global_label (char *);
extern void c4x_external_ref (char *);
extern void c4x_file_end (FILE *);
#ifdef TREE_CODE
extern void c4x_set_default_attributes PARAMS ((tree, tree *));
......
......@@ -4396,19 +4396,122 @@ c4x_handle_pragma (p_getc, p_ungetc, pname)
}
struct name_list
{
struct name_list *next;
char *name;
};
static struct name_list *global_head;
static struct name_list *extern_head;
/* Add NAME to list of global symbols and remove from external list if
present on external list. */
void
c4x_global_label (name)
char *name;
{
struct name_list *p, *last;
/* Do not insert duplicate names, so linearly search through list of
existing names. */
p = global_head;
while (p)
{
if (strcmp (p->name, name) == 0)
return;
p = p->next;
}
p = (struct name_list *) permalloc (sizeof *p);
p->next = global_head;
p->name = name;
global_head = p;
/* Remove this name from ref list if present. */
last = NULL;
p = extern_head;
while (p)
{
if (strcmp (p->name, name) == 0)
{
if (last)
last->next = p->next;
else
extern_head = p->next;
break;
}
last = p;
p = p->next;
}
}
/* Add NAME to list of external symbols. */
void
c4x_external_ref (name)
char *name;
{
struct name_list *p;
/* Do not insert duplicate names. */
p = extern_head;
while (p)
{
if (strcmp (p->name, name) == 0)
return;
p = p->next;
}
/* Do not insert ref if global found. */
p = global_head;
while (p)
{
if (strcmp (p->name, name) == 0)
return;
p = p->next;
}
p = (struct name_list *) permalloc (sizeof *p);
p->next = extern_head;
p->name = name;
extern_head = p;
}
void
c4x_file_end (fp)
FILE *fp;
{
struct name_list *p;
/* Output all external names that are not global. */
p = extern_head;
while (p)
{
fprintf (fp, "\t.ref\t");
assemble_name (fp, p->name);
fprintf (fp, "\n");
p = p->next;
}
fprintf (fp, "\t.end\n");
}
static void
c4x_check_attribute(attrib, list, decl, attributes)
c4x_check_attribute (attrib, list, decl, attributes)
char *attrib;
tree list, decl, *attributes;
{
while (list != NULL_TREE
&& IDENTIFIER_POINTER (TREE_PURPOSE (list))
!= IDENTIFIER_POINTER (DECL_NAME (decl)))
list = TREE_CHAIN(list);
list = TREE_CHAIN (list);
if (list)
*attributes = chainon (*attributes,
build_tree_list (get_identifier (attrib),
TREE_VALUE(list)));
TREE_VALUE (list)));
}
......
......@@ -2127,8 +2127,6 @@ dtors_section () \
fprintf (FILE, "\n"); \
}
#define ASM_FILE_END(FILE) fprintf (FILE, "\t.end\n")
/* We need to have a data section we can identify so that we can set
the DP register back to a data pointer in the small memory model.
This is only required for ISRs if we are paranoid that someone
......@@ -2211,25 +2209,21 @@ do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0);
fprintf (FILE, "\t.global\t"); \
assemble_name (FILE, NAME); \
fputs ("\n", FILE); \
c4x_global_label (NAME); \
} while (0);
#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \
do { \
fprintf (FILE, "\t.ref\t"); \
assemble_name (FILE, NAME); \
fputc ('\n', FILE); \
} while (0);
#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \
c4x_external_ref (NAME)
/* A C statement to output on FILE an assembler pseudo-op to
declare a library function named external.
(Only needed to keep asm30 happy for ___divqf3 etc.) */
#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
do { \
fprintf (FILE, "\t.ref\t"); \
assemble_name (FILE, XSTR (FUN, 0)); \
fprintf (FILE, "\n"); \
} while (0);
#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
c4x_external_ref (XSTR (FUN, 0))
#define ASM_FILE_END(FILE) \
c4x_file_end (FILE)
/* The prefix to add to user-visible assembler symbols. */
......
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