top level:

* c-common.c (declare_function_name): Use func_id_node,
	function_id_node, and pretty_function_id_node.  Do not make
	__func__ visible at file scope.
	* c-common.h (c_tree_index): Add CTI_FUNCTION_ID,
	CTI_PRETTY_FUNCTION_ID, and CTI_FUNC_ID.
	(function_id_node, pretty_function_id_node, func_id_node): New
	macros.
	* c-decl.c (init_decl_processing): Initialize function_id_node,
	pretty_function_id_node, and func_id_node.
	(c_make_fname_decl): Correct comment.

	* tree.h (struct tree_identifier): Constify pointer member.

	* c-decl.c (pushdecl, implicit_decl_warning): Constify a char *.
	* c-pragma.h (struct weak_syms): Constify name and value members.
	(add_weak): Constify arguments.

	* calls.c (special_function_p): Constify a char *.
	(expand_call): Remove variable which is initialized and then
	never used.
	* dependence.c (struct def_use, struct induction, struct subscript):
	Constify 'variable' member.
	(get_low_bound, have_induction_variable): Constify char * argument.
	(find_induction_variable): Add braces to avoid dangling else.
	(classify_dependence): Constify char * arrays.
	* profile.c (output_func_start_profiler): Constify a char *.
	* stor-layout.c (finalize_record_size): Constify a char *.
	* tree.c (is_attribute_p): Constify a char *.
	* varasm.c (add_weak, remove_from_pending_weak_list): Constify argument.

	* varasm.c (make_function_rtl, make_decl_rtl): Rearrange code
	for comprehensibility.  Do not call get_identifier if we did
	not change the DECL_ASSEMBLER_NAME of the decl.  Use alloca to
	create temporary string constants, not ggc_alloc_string.  No
	need to copy result of ASM_FORMAT_PRIVATE_NAME.  Use const
	char * to hold IDENTIFIER_POINTERs.
ch:
	* inout.c (add_enum_to_list): Use DECL_NAME directly, don't get
	its IDENTIFIER_POINTER and immediately call get_identifier on it.
	* lex.c (yywrap): Constify a char *.
cp:
	* class.c (build_secondary_vtable): Constify a char *.
	* decl.c (init_decl_processing): Initialize function_id_node,
	pretty_function_id_node, and func_id_node.
	* input.c (struct input_source): Constify 'str'.
	(feed_input): Constify first argument.
	* mangle.c (write_identifier): Constify argument.
	* pt.c (mangle_class_name_for_template): Constify argument.
f:
	* ansify.c: Use #line, not # <number>.
java:
	* jcf-parse.c (set_source_filename): Constify a char *.
	* jcf-write.c (append_innerclasses_attribute,
	make_class_file_name): Constify a char *.  Don't recycle a
	variable for an unrelated purpose.
	* parse.y: (build_alias_initializer_parameter_list): Constify a char *.
	(breakdown_qualified): Do not modify IDENTIFIER_POINTER strings.

From-SVN: r36055
This commit is contained in:
Zack Weinberg 2000-08-29 21:39:49 +00:00 committed by Zack Weinberg
parent cee58bc005
commit 63ad61edae
27 changed files with 330 additions and 242 deletions

View File

@ -1,3 +1,42 @@
2000-08-29 Zack Weinberg <zack@wolery.cumb.org>
* c-common.c (declare_function_name): Use func_id_node,
function_id_node, and pretty_function_id_node. Do not make
__func__ visible at file scope.
* c-common.h (c_tree_index): Add CTI_FUNCTION_ID,
CTI_PRETTY_FUNCTION_ID, and CTI_FUNC_ID.
(function_id_node, pretty_function_id_node, func_id_node): New
macros.
* c-decl.c (init_decl_processing): Initialize function_id_node,
pretty_function_id_node, and func_id_node.
(c_make_fname_decl): Correct comment.
* tree.h (struct tree_identifier): Constify pointer member.
* c-decl.c (pushdecl, implicit_decl_warning): Constify a char *.
* c-pragma.h (struct weak_syms): Constify name and value members.
(add_weak): Constify arguments.
* calls.c (special_function_p): Constify a char *.
(expand_call): Remove variable which is initialized and then
never used.
* dependence.c (struct def_use, struct induction, struct subscript):
Constify 'variable' member.
(get_low_bound, have_induction_variable): Constify char * argument.
(find_induction_variable): Add braces to avoid dangling else.
(classify_dependence): Constify char * arrays.
* profile.c (output_func_start_profiler): Constify a char *.
* stor-layout.c (finalize_record_size): Constify a char *.
* tree.c (is_attribute_p): Constify a char *.
* varasm.c (add_weak, remove_from_pending_weak_list): Constify argument.
* varasm.c (make_function_rtl, make_decl_rtl): Rearrange code
for comprehensibility. Do not call get_identifier if we did
not change the DECL_ASSEMBLER_NAME of the decl. Use alloca to
create temporary string constants, not ggc_alloc_string. No
need to copy result of ASM_FORMAT_PRIVATE_NAME. Use const
char * to hold IDENTIFIER_POINTERs.
2000-08-29 Richard Henderson <rth@cygnus.com>
* config/ia64/ia64.md (muldi3): Use grfr_register_operand

View File

@ -130,6 +130,12 @@ enum cpp_token cpp_token;
tree void_list_node;
The identifiers __FUNCTION__, __PRETTY_FUNCTION__, and __func__.
tree function_id_node;
tree pretty_function_id_node;
tree func_id_node;
*/
tree c_global_trees[CTI_MAX];
@ -271,13 +277,14 @@ declare_function_name ()
else
name = "";
printable_name = (*decl_printable_name) (current_function_decl, 2);
/* ISO C99 defines __func__, which is a variable, not a string
constant, and which is not a defined symbol at file scope. */
(*make_fname_decl) (func_id_node, name, 0);
}
(*make_fname_decl) (get_identifier ("__FUNCTION__"), name, 0);
(*make_fname_decl) (get_identifier ("__PRETTY_FUNCTION__"), printable_name, 1);
/* The ISO C people "of course" couldn't use __FUNCTION__ in the
ISO C 99 standard; instead a new variable is invented. */
(*make_fname_decl) (get_identifier ("__func__"), name, 0);
(*make_fname_decl) (function_id_node, name, 0);
(*make_fname_decl) (pretty_function_id_node, printable_name, 1);
}
/* Given a chain of STRING_CST nodes,

View File

@ -118,6 +118,11 @@ enum c_tree_index
CTI_G77_LONGINT_TYPE,
CTI_G77_ULONGINT_TYPE,
/* These are not types, but we have to look them up all the time. */
CTI_FUNCTION_ID,
CTI_PRETTY_FUNCTION_ID,
CTI_FUNC_ID,
CTI_MAX
};
@ -153,6 +158,10 @@ enum c_tree_index
#define g77_longint_type_node c_global_trees[CTI_G77_LONGINT_TYPE]
#define g77_ulongint_type_node c_global_trees[CTI_G77_ULONGINT_TYPE]
#define function_id_node c_global_trees[CTI_FUNCTION_ID]
#define pretty_function_id_node c_global_trees[CTI_PRETTY_FUNCTION_ID]
#define func_id_node c_global_trees[CTI_FUNC_ID]
extern tree c_global_trees[CTI_MAX];
typedef enum c_language_kind

View File

@ -2439,7 +2439,7 @@ pushdecl (x)
/* No shadow warnings for vars made for inlining. */
&& ! DECL_FROM_INLINE (x))
{
char *id = IDENTIFIER_POINTER (name);
const char *id = IDENTIFIER_POINTER (name);
if (TREE_CODE (x) == PARM_DECL
&& current_binding_level->level_chain->parm_flag)
@ -2560,7 +2560,7 @@ void
implicit_decl_warning (id)
tree id;
{
char *name = IDENTIFIER_POINTER (id);
const char *name = IDENTIFIER_POINTER (id);
if (mesg_implicit_function_declaration == 2)
error ("implicit declaration of function `%s'", name);
else if (mesg_implicit_function_declaration == 1)
@ -3187,7 +3187,11 @@ init_decl_processing ()
pedantic_lvalues = pedantic;
/* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__. */
/* Create the global bindings for __FUNCTION__, __PRETTY_FUNCTION__,
and __func__. */
function_id_node = get_identifier ("__FUNCTION__");
pretty_function_id_node = get_identifier ("__PRETTY_FUNCTION__");
func_id_node = get_identifier ("__func__");
make_fname_decl = c_make_fname_decl;
declare_function_name ();
@ -3217,7 +3221,7 @@ init_decl_processing ()
delayed emission of static data, we mark the decl as emitted
so it is not placed in the output. Anything using it must therefore pull
out the STRING_CST initializer directly. This does mean that these names
are string merging candidates, which C99 does not permit. */
are string merging candidates, which is wrong for C99's __func__. FIXME. */
static tree
c_make_fname_decl (id, name, type_dep)

View File

@ -47,14 +47,14 @@ Boston, MA 02111-1307, USA. */
struct weak_syms
{
struct weak_syms * next;
char * name;
char * value;
const char * name;
const char * value;
};
/* Declared in varasm.c */
extern struct weak_syms * weak_decls;
extern int add_weak PARAMS ((char *, char *));
extern int add_weak PARAMS ((const char *, const char *));
#endif /* HANDLE_PRAGMA_WEAK */

View File

@ -683,8 +683,8 @@ special_function_p (fndecl, flags)
think they are. */
&& DECL_CONTEXT (fndecl) == NULL_TREE && TREE_PUBLIC (fndecl))
{
char *name = IDENTIFIER_POINTER (DECL_NAME (fndecl));
char *tname = name;
const char *name = IDENTIFIER_POINTER (DECL_NAME (fndecl));
const char *tname = name;
/* We assume that alloca will always be called by name. It
makes no sense to pass it as a pointer-to-function to
@ -2070,7 +2070,6 @@ expand_call (exp, target, ignore)
/* Declaration of the function being called,
or 0 if the function is computed (not known by name). */
tree fndecl = 0;
char *name = 0;
rtx insn;
int try_tail_call = 1;
int try_tail_recursion = 1;
@ -2289,9 +2288,6 @@ expand_call (exp, target, ignore)
return temp;
}
if (fndecl && DECL_NAME (fndecl))
name = IDENTIFIER_POINTER (DECL_NAME (fndecl));
/* Figure out the amount to which the stack should be aligned. */
#ifdef PREFERRED_STACK_BOUNDARY
preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;

View File

@ -1,3 +1,9 @@
2000-08-29 Zack Weinberg <zack@wolery.cumb.org>
* inout.c (add_enum_to_list): Use DECL_NAME directly, don't get
its IDENTIFIER_POINTER and immediately call get_identifier on it.
* lex.c (yywrap): Constify a char *.
2000-08-24 Mark Mitchell <mark@codesourcery.com>
* Make-lang.in (cc1chill): Don't depend on c-iterate.o.

View File

@ -130,8 +130,7 @@ static tree add_enum_to_list (type, context)
if (wrk->context == context && wrk->type == type)
{
/* yes, found. look if the ptrdecl is valid in this scope */
char *name = IDENTIFIER_POINTER (DECL_NAME (wrk->ptrdecl));
tree var = get_identifier (name);
tree var = DECL_NAME (wrk->ptrdecl);
tree decl = lookup_name (var);
if (decl == NULL_TREE)

View File

@ -2158,7 +2158,7 @@ yywrap ()
if (next_file_to_seize && !grant_only_flag)
{
FILE *grt_in = NULL;
char *seizefile_name_chars
const char *seizefile_name_chars
= IDENTIFIER_POINTER (TREE_VALUE (next_file_to_seize));
/* find a seize file, open it. If it's not at the path the

View File

@ -1,3 +1,13 @@
2000-08-29 Zack Weinberg <zack@wolery.cumb.org>
* class.c (build_secondary_vtable): Constify a char *.
* decl.c (init_decl_processing): Initialize function_id_node,
pretty_function_id_node, and func_id_node.
* input.c (struct input_source): Constify 'str'.
(feed_input): Constify first argument.
* mangle.c (write_identifier): Constify argument.
* pt.c (mangle_class_name_for_template): Constify argument.
2000-08-29 Mark Mitchell <mark@codesourcery.com>
* typeck.c (mark_addressable): Remove code that pokes around in

View File

@ -855,7 +855,8 @@ build_secondary_vtable (binfo, for_type)
tree new_decl;
tree offset;
tree path = binfo;
char *buf, *buf2;
char *buf;
const char *buf2;
char joiner = '_';
int i;

View File

@ -6671,6 +6671,10 @@ init_decl_processing ()
flag_weak = 0;
/* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__. */
function_id_node = get_identifier ("__FUNCTION__");
pretty_function_id_node = get_identifier ("__PRETTY_FUNCTION__");
func_id_node = get_identifier ("__func__");
make_fname_decl = cp_make_fname_decl;
declare_function_name ();

View File

@ -45,7 +45,7 @@ static struct putback_buffer putback = {NULL, 0, -1};
struct input_source {
/* saved string */
char *str;
const char *str;
int length;
/* current position, when reading as input */
int offset;
@ -67,7 +67,7 @@ extern unsigned char *yy_cur, *yy_lim;
extern int yy_get_token ();
#endif
extern void feed_input PARAMS ((char *, int, const char *, int));
extern void feed_input PARAMS ((const char *, int, const char *, int));
extern void put_input PARAMS ((int));
extern void put_back PARAMS ((int));
extern int getch PARAMS ((void));
@ -109,7 +109,7 @@ free_input (inp)
inline
void
feed_input (str, len, file, line)
char *str;
const char *str;
int len;
const char *file;
int line;

View File

@ -156,7 +156,7 @@ static void write_source_name PARAMS ((tree));
static void write_number PARAMS ((unsigned HOST_WIDE_INT, int,
unsigned int));
static void write_integer_cst PARAMS ((tree));
static void write_identifier PARAMS ((char *));
static void write_identifier PARAMS ((const char *));
static void write_special_name_constructor PARAMS ((tree));
static void write_special_name_destructor PARAMS ((tree));
static void write_type PARAMS ((tree));
@ -1053,7 +1053,7 @@ write_integer_cst (cst)
static void
write_identifier (identifier)
char *identifier;
const char *identifier;
{
MANGLE_TRACE ("identifier", identifier);
write_string (identifier);

View File

@ -103,7 +103,7 @@ static void add_pending_template PARAMS ((tree));
static int push_tinst_level PARAMS ((tree));
static void reopen_tinst_level PARAMS ((tree));
static tree classtype_mangled_name PARAMS ((tree));
static char *mangle_class_name_for_template PARAMS ((char *, tree, tree));
static char *mangle_class_name_for_template PARAMS ((const char *, tree, tree));
static tree tsubst_initializer_list PARAMS ((tree, tree));
static int list_eq PARAMS ((tree, tree));
static tree get_class_bindings PARAMS ((tree, tree, tree));
@ -3504,7 +3504,7 @@ comp_template_args (oldargs, newargs)
static char *
mangle_class_name_for_template (name, parms, arglist)
char *name;
const char *name;
tree parms, arglist;
{
static struct obstack scratch_obstack;

View File

@ -89,7 +89,7 @@ typedef struct def_use
/* this expression */
tree expression;
/* our name */
char *variable;
const char *variable;
/* def or use */
enum def_use_type type;
/* status flags */
@ -126,7 +126,7 @@ typedef struct loop
typedef struct induction
{
/* our name */
char *variable;
const char *variable;
/* increment. Currently only +1 or -1 */
int increment;
/* lower bound */
@ -161,7 +161,7 @@ typedef struct subscript
/* Y in X * i + Y */
int offset;
/* our name */
char *variable;
const char *variable;
/* next subscript term. Currently null. */
struct subscript *next;
} subscript;
@ -186,8 +186,8 @@ void init_dependence_analysis PARAMS ((tree));
static void build_def_use PARAMS ((tree, enum def_use_type));
static loop* add_loop PARAMS ((tree, tree, int));
static int find_induction_variable PARAMS ((tree, tree, tree, loop*));
static int get_low_bound PARAMS ((tree, char*));
static int have_induction_variable PARAMS ((tree, char*));
static int get_low_bound PARAMS ((tree, const char*));
static int have_induction_variable PARAMS ((tree, const char*));
static void link_loops PARAMS ((void));
static void get_node_dependence PARAMS ((void));
static void check_node_dependence PARAMS ((def_use*));
@ -518,17 +518,23 @@ find_induction_variable (init_node, cond_node, incr_node, loop_def)
if (TREE_CODE (TREE_OPERAND (cond_node, 0)) == VAR_DECL
&& IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (cond_node, 0)))
== ind_ptr->variable)
if (TREE_CODE (TREE_OPERAND (cond_node, 1)) == INTEGER_CST)
ind_ptr->high_bound = TREE_INT_CST_LOW (TREE_OPERAND (cond_node, 1));
else
ind_ptr->high_bound = ind_ptr->increment < 0 ? INT_MIN : INT_MAX;
{
if (TREE_CODE (TREE_OPERAND (cond_node, 1)) == INTEGER_CST)
ind_ptr->high_bound =
TREE_INT_CST_LOW (TREE_OPERAND (cond_node, 1));
else
ind_ptr->high_bound = ind_ptr->increment < 0 ? INT_MIN : INT_MAX;
}
else if (TREE_CODE (TREE_OPERAND (cond_node, 1)) == VAR_DECL
&& IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (cond_node, 1)))
== ind_ptr->variable)
if (TREE_CODE (TREE_OPERAND (cond_node, 0)) == INTEGER_CST)
ind_ptr->high_bound = TREE_INT_CST_LOW (TREE_OPERAND (cond_node, 0));
else
ind_ptr->high_bound = ind_ptr->increment < 0 ? INT_MIN : INT_MAX;
{
if (TREE_CODE (TREE_OPERAND (cond_node, 0)) == INTEGER_CST)
ind_ptr->high_bound =
TREE_INT_CST_LOW (TREE_OPERAND (cond_node, 0));
else
ind_ptr->high_bound = ind_ptr->increment < 0 ? INT_MIN : INT_MAX;
}
ind_ptr->next = 0;
return 1;
}
@ -540,7 +546,7 @@ find_induction_variable (init_node, cond_node, incr_node, loop_def)
static int
get_low_bound (node, variable)
tree node;
char *variable;
const char *variable;
{
if (TREE_CODE (node) == SCOPE_STMT)
@ -577,7 +583,7 @@ get_low_bound (node, variable)
static int
have_induction_variable (outer_loop, ind_var)
tree outer_loop;
char *ind_var;
const char *ind_var;
{
induction *ind_ptr;
loop *loop_ptr;
@ -981,8 +987,8 @@ classify_dependence (icoefficients, ocoefficients, complexity, separability,
int *separability;
int count;
{
char *iiv_used [MAX_SUBSCRIPTS];
char *oiv_used [MAX_SUBSCRIPTS];
const char *iiv_used [MAX_SUBSCRIPTS];
const char *oiv_used [MAX_SUBSCRIPTS];
int ocoeff [MAX_SUBSCRIPTS];
int icoeff [MAX_SUBSCRIPTS];
int idx, cidx;

View File

@ -1,3 +1,7 @@
2000-08-29 Zack Weinberg <zack@wolery.cumb.org>
* ansify.c: Use #line, not # <number>.
2000-08-24 Greg McGary <greg@mcgary.org>
* intdoc.c (ARRAY_SIZE): Remove macro.

View File

@ -47,7 +47,7 @@ main(int argc, char **argv)
printf ("\
/* This file is automatically generated from `%s',\n\
which you should modify instead. */\n\
# 1 \"%s\"\n\
#line 1 \"%s\"\n\
",
argv[1], argv[1]);

View File

@ -1,3 +1,12 @@
2000-08-29 Zack Weinberg <zack@wolery.cumb.org>
* jcf-parse.c (set_source_filename): Constify a char *.
* jcf-write.c (append_innerclasses_attribute,
make_class_file_name): Constify a char *. Don't recycle a
variable for an unrelated purpose.
* parse.y: (build_alias_initializer_parameter_list): Constify a char *.
(breakdown_qualified): Do not modify IDENTIFIER_POINTER strings.
2000-08-29 Alexandre Petit-Bianco <apbianco@cygnus.com>
* expr.c (can_widen_reference_to): Fixed indentation.

View File

@ -99,7 +99,7 @@ set_source_filename (jcf, index)
int index;
{
tree sfname_id = get_name_constant (jcf, index);
char *sfname = IDENTIFIER_POINTER (sfname_id);
const char *sfname = IDENTIFIER_POINTER (sfname_id);
if (input_filename != NULL)
{
int old_len = strlen (input_filename);

View File

@ -3161,7 +3161,7 @@ append_innerclasses_attribute (state, class)
process: itself, up and down. */
while (class && INNER_CLASS_TYPE_P (class))
{
char *n;
const char *n;
decl = TYPE_NAME (class);
n = IDENTIFIER_POINTER (DECL_NAME (decl)) +
@ -3218,8 +3218,8 @@ static char *
make_class_file_name (clas)
tree clas;
{
const char *dname, *slash;
char *cname, *r;
const char *dname, *cname, *slash;
char *r;
struct stat sb;
cname = IDENTIFIER_POINTER (identifier_subst (DECL_NAME (TYPE_NAME (clas)),
@ -3261,10 +3261,10 @@ make_class_file_name (clas)
dname = r + (slash - dname) + 1;
while (1)
{
cname = strchr (dname, DIR_SEPARATOR);
if (cname == NULL)
char *s = strchr (dname, DIR_SEPARATOR);
if (s == NULL)
break;
*cname = '\0';
*s = '\0';
if (stat (r, &sb) == -1)
{
/* Try to make it. */
@ -3275,9 +3275,9 @@ make_class_file_name (clas)
return NULL;
}
}
*cname = DIR_SEPARATOR;
*s = DIR_SEPARATOR;
/* Skip consecutive separators. */
for (dname = cname + 1; *dname && *dname == DIR_SEPARATOR; ++dname)
for (dname = s + 1; *dname && *dname == DIR_SEPARATOR; ++dname)
;
}

View File

@ -5014,7 +5014,7 @@ build_alias_initializer_parameter_list (mode, class_type, parm, artificial)
for (field = TYPE_FIELDS (class_type); field; field = TREE_CHAIN (field))
if (FIELD_LOCAL_ALIAS (field))
{
char *buffer = IDENTIFIER_POINTER (DECL_NAME (field));
const char *buffer = IDENTIFIER_POINTER (DECL_NAME (field));
tree purpose = NULL_TREE, value = NULL_TREE, name = NULL_TREE;
switch (mode)
@ -10746,12 +10746,14 @@ static int
breakdown_qualified (left, right, source)
tree *left, *right, source;
{
char *p = IDENTIFIER_POINTER (source), *base;
char *p, *base;
int l = IDENTIFIER_LENGTH (source);
base = alloca (l + 1);
memcpy (base, IDENTIFIER_POINTER (source), l + 1);
/* Breakdown NAME into REMAINDER . IDENTIFIER */
base = p;
p += (l-1);
p = base + l - 1;
while (*p != '.' && p != base)
p--;
@ -10762,8 +10764,7 @@ breakdown_qualified (left, right, source)
*p = '\0';
if (right)
*right = get_identifier (p+1);
*left = get_identifier (IDENTIFIER_POINTER (source));
*p = '.';
*left = get_identifier (base);
return 0;
}

View File

@ -1069,7 +1069,8 @@ void
output_func_start_profiler ()
{
tree fnname, fndecl;
char *name, *cfnname;
char *name;
const char *cfnname;
rtx table_address;
enum machine_mode mode = mode_for_size (LONG_TYPE_SIZE, MODE_INT, 0);
int save_flag_inline_functions = flag_inline_functions;

View File

@ -991,7 +991,7 @@ finalize_record_size (rli)
if (TYPE_NAME (rli->t))
{
char *name;
const char *name;
if (TREE_CODE (TYPE_NAME (rli->t)) == IDENTIFIER_NODE)
name = IDENTIFIER_POINTER (TYPE_NAME (rli->t));

View File

@ -3786,7 +3786,7 @@ is_attribute_p (attr, ident)
tree ident;
{
int ident_len, attr_len;
char *p;
const char *p;
if (TREE_CODE (ident) != IDENTIFIER_NODE)
return 0;

View File

@ -737,7 +737,7 @@ struct tree_identifier
{
struct tree_common common;
int length;
char *pointer;
const char *pointer;
};
/* In a TREE_LIST node. */

View File

@ -175,7 +175,7 @@ static int output_addressed_constants PARAMS ((tree));
static void output_after_function_constants PARAMS ((void));
static void output_constructor PARAMS ((tree, int));
#ifdef ASM_WEAKEN_LABEL
static void remove_from_pending_weak_list PARAMS ((char *));
static void remove_from_pending_weak_list PARAMS ((const char *));
#endif
#ifdef ASM_OUTPUT_BSS
static void asm_output_bss PARAMS ((FILE *, tree, const char *, int, int));
@ -519,56 +519,10 @@ void
make_function_rtl (decl)
tree decl;
{
char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
char *new_name = name;
const char *name;
const char *new_name;
/* Rename a nested function to avoid conflicts, unless it's a member of
a local class, in which case the class name is already unique. */
if (decl_function_context (decl) != 0
&& ! TYPE_P (DECL_CONTEXT (decl))
&& DECL_INITIAL (decl) != 0
&& DECL_RTL (decl) == 0)
{
char *label;
name = IDENTIFIER_POINTER (DECL_NAME (decl));
ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
name = ggc_alloc_string (label, -1);
var_labelno++;
}
else
{
/* When -fprefix-function-name is used, every function name is
prefixed. Even static functions are prefixed because they
could be declared latter. Note that a nested function name
is not prefixed. */
if (flag_prefix_function_name)
{
size_t name_len = strlen (name);
new_name = ggc_alloc_string (NULL, name_len + CHKR_PREFIX_SIZE);
memcpy (new_name, CHKR_PREFIX, CHKR_PREFIX_SIZE);
memcpy (new_name + CHKR_PREFIX_SIZE, name, name_len + 1);
name = new_name;
}
}
if (DECL_RTL (decl) == 0)
{
DECL_ASSEMBLER_NAME (decl) = get_identifier (name);
DECL_RTL (decl)
= gen_rtx_MEM (DECL_MODE (decl),
gen_rtx_SYMBOL_REF (Pmode, name));
/* Optionally set flags or add text to the name to record
information such as that it is a function name. If the name
is changed, the macro ASM_OUTPUT_LABELREF will have to know
how to strip this information. */
#ifdef ENCODE_SECTION_INFO
ENCODE_SECTION_INFO (decl);
#endif
}
else
if (DECL_RTL (decl) != 0)
{
/* ??? Another way to do this would be to do what halfpic.c does
and maintain a hashed table of such critters. */
@ -581,9 +535,59 @@ make_function_rtl (decl)
if (REDO_SECTION_INFO_P (decl))
ENCODE_SECTION_INFO (decl);
#endif
return;
}
name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
new_name = name;
/* Rename a nested function to avoid conflicts, unless it's a member of
a local class, in which case the class name is already unique. */
if (decl_function_context (decl) != 0
&& ! TYPE_P (DECL_CONTEXT (decl))
&& DECL_INITIAL (decl) != 0
&& DECL_RTL (decl) == 0)
{
char *label;
ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
var_labelno++;
new_name = label;
}
/* When -fprefix-function-name is used, every function name is
prefixed. Even static functions are prefixed because they
could be declared latter. Note that a nested function name
is not prefixed. */
else if (flag_prefix_function_name)
{
size_t name_len = IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (decl));
char *pname;
pname = alloca (name_len + CHKR_PREFIX_SIZE + 1);
memcpy (pname, CHKR_PREFIX, CHKR_PREFIX_SIZE);
memcpy (pname + CHKR_PREFIX_SIZE, name, name_len + 1);
new_name = pname;
}
if (name != new_name)
{
DECL_ASSEMBLER_NAME (decl) = get_identifier (new_name);
name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
}
DECL_RTL (decl)
= gen_rtx_MEM (DECL_MODE (decl),
gen_rtx_SYMBOL_REF (Pmode, name));
/* Optionally set flags or add text to the name to record
information such as that it is a function name. If the name
is changed, the macro ASM_OUTPUT_LABELREF will have to know
how to strip this information. */
#ifdef ENCODE_SECTION_INFO
ENCODE_SECTION_INFO (decl);
#endif
}
/* Given NAME, a putative register name, discard any customary prefixes. */
static const char *
@ -673,54 +677,57 @@ make_decl_rtl (decl, asmspec, top_level)
const char *asmspec;
int top_level;
{
register char *name = 0;
const char *name = 0;
const char *new_name = 0;
int reg_number;
reg_number = decode_reg_name (asmspec);
if (DECL_ASSEMBLER_NAME (decl) != NULL_TREE)
name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
if (reg_number == -2)
{
/* ASMSPEC is given, and not the name of a register. */
size_t len = strlen (asmspec);
name = ggc_alloc_string (NULL, len + 1);
name[0] = '*';
memcpy (&name[1], asmspec, len + 1);
}
/* For a duplicate declaration, we can be called twice on the
same DECL node. Don't discard the RTL already made. */
if (DECL_RTL (decl) == 0)
if (DECL_RTL (decl) != 0)
{
/* If the old RTL had the wrong mode, fix the mode. */
if (GET_MODE (DECL_RTL (decl)) != DECL_MODE (decl))
{
rtx rtl = DECL_RTL (decl);
PUT_MODE (rtl, DECL_MODE (decl));
}
/* ??? Another way to do this would be to do what halfpic.c does
and maintain a hashed table of such critters. */
/* ??? Another way to do this would be to pass a flag bit to
ENCODE_SECTION_INFO saying whether this is a new decl or not. */
/* Let the target reassign the RTL if it wants.
This is necessary, for example, when one machine specific
decl attribute overrides another. */
#ifdef REDO_SECTION_INFO_P
if (REDO_SECTION_INFO_P (decl))
ENCODE_SECTION_INFO (decl);
#endif
return;
}
new_name = name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
reg_number = decode_reg_name (asmspec);
if (reg_number == -2)
/* ASMSPEC is given, and not the name of a register. */
new_name = asmspec;
if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
{
/* First detect errors in declaring global registers. */
if (TREE_CODE (decl) != FUNCTION_DECL
&& DECL_REGISTER (decl) && reg_number == -1)
error_with_decl (decl,
"register name not specified for `%s'");
else if (TREE_CODE (decl) != FUNCTION_DECL
&& DECL_REGISTER (decl) && reg_number < 0)
error_with_decl (decl,
"invalid register name for `%s'");
else if ((reg_number >= 0 || reg_number == -3)
&& (TREE_CODE (decl) == FUNCTION_DECL
&& ! DECL_REGISTER (decl)))
error_with_decl (decl,
"register name given for non-register variable `%s'");
else if (TREE_CODE (decl) != FUNCTION_DECL
&& DECL_REGISTER (decl)
&& TYPE_MODE (TREE_TYPE (decl)) == BLKmode)
if (reg_number == -1)
error_with_decl (decl, "register name not specified for `%s'");
else if (reg_number < 0)
error_with_decl (decl, "invalid register name for `%s'");
else if (TYPE_MODE (TREE_TYPE (decl)) == BLKmode)
error_with_decl (decl,
"data type of `%s' isn't suitable for a register");
else if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl)
&& ! HARD_REGNO_MODE_OK (reg_number,
TYPE_MODE (TREE_TYPE (decl))))
else if (! HARD_REGNO_MODE_OK (reg_number, TYPE_MODE (TREE_TYPE (decl))))
error_with_decl (decl,
"register number for `%s' isn't suitable for data type");
"register specified for `%s' isn't suitable for data type");
/* Now handle properly declared static register variables. */
else if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
else
{
int nregs;
@ -754,96 +761,81 @@ make_decl_rtl (decl, asmspec, top_level)
while (nregs > 0)
globalize_reg (reg_number + --nregs);
}
}
/* Specifying a section attribute on a variable forces it into a
non-.bss section, and thus it cannot be common. */
else if (TREE_CODE (decl) == VAR_DECL
&& DECL_SECTION_NAME (decl) != NULL_TREE
&& DECL_INITIAL (decl) == NULL_TREE
&& DECL_COMMON (decl))
DECL_COMMON (decl) = 0;
/* Now handle ordinary static variables and functions (in memory).
Also handle vars declared register invalidly. */
if (DECL_RTL (decl) == 0)
{
/* Can't use just the variable's own name for a variable
whose scope is less than the whole file, unless it's a member
of a local class (which will already be unambiguous).
Concatenate a distinguishing number. */
if (!top_level && !TREE_PUBLIC (decl)
&& ! (DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl)))
&& asmspec == 0)
{
char *label;
ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
name = ggc_alloc_string (label, -1);
var_labelno++;
}
if (name == 0)
abort ();
/* When -fprefix-function-name is used, the functions
names are prefixed. Only nested function names are not
prefixed. */
if (flag_prefix_function_name && TREE_CODE (decl) == FUNCTION_DECL)
{
size_t name_len = strlen (name);
char *new_name;
new_name = ggc_alloc_string (NULL, name_len + CHKR_PREFIX_SIZE);
memcpy (new_name, CHKR_PREFIX, CHKR_PREFIX_SIZE);
memcpy (new_name + CHKR_PREFIX_SIZE, name, name_len + 1);
name = new_name;
}
/* If this variable is to be treated as volatile, show its
tree node has side effects. */
if ((flag_volatile_global && TREE_CODE (decl) == VAR_DECL
&& TREE_PUBLIC (decl))
|| ((flag_volatile_static && TREE_CODE (decl) == VAR_DECL
&& (TREE_PUBLIC (decl) || TREE_STATIC (decl)))))
TREE_SIDE_EFFECTS (decl) = 1;
DECL_ASSEMBLER_NAME (decl)
= get_identifier (name[0] == '*' ? name + 1 : name);
DECL_RTL (decl) = gen_rtx_MEM (DECL_MODE (decl),
gen_rtx_SYMBOL_REF (Pmode, name));
if (TREE_CODE (decl) != FUNCTION_DECL)
set_mem_attributes (DECL_RTL (decl), decl, 1);
/* Optionally set flags or add text to the name to record information
such as that it is a function name.
If the name is changed, the macro ASM_OUTPUT_LABELREF
will have to know how to strip this information. */
#ifdef ENCODE_SECTION_INFO
ENCODE_SECTION_INFO (decl);
#endif
/* As a register variable, it has no section. */
return;
}
}
else
/* Now handle ordinary static variables and functions (in memory).
Also handle vars declared register invalidly. */
if (reg_number >= 0 || reg_number == -3)
error_with_decl (decl,
"register name given for non-register variable `%s'");
/* Specifying a section attribute on a variable forces it into a
non-.bss section, and thus it cannot be common. */
if (TREE_CODE (decl) == VAR_DECL
&& DECL_SECTION_NAME (decl) != NULL_TREE
&& DECL_INITIAL (decl) == NULL_TREE
&& DECL_COMMON (decl))
DECL_COMMON (decl) = 0;
/* Can't use just the variable's own name for a variable
whose scope is less than the whole file, unless it's a member
of a local class (which will already be unambiguous).
Concatenate a distinguishing number. */
if (!top_level && !TREE_PUBLIC (decl)
&& ! (DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl)))
&& asmspec == 0)
{
/* If the old RTL had the wrong mode, fix the mode. */
if (GET_MODE (DECL_RTL (decl)) != DECL_MODE (decl))
{
rtx rtl = DECL_RTL (decl);
PUT_MODE (rtl, DECL_MODE (decl));
}
/* ??? Another way to do this would be to do what halfpic.c does
and maintain a hashed table of such critters. */
/* ??? Another way to do this would be to pass a flag bit to
ENCODE_SECTION_INFO saying whether this is a new decl or not. */
/* Let the target reassign the RTL if it wants.
This is necessary, for example, when one machine specific
decl attribute overrides another. */
#ifdef REDO_SECTION_INFO_P
if (REDO_SECTION_INFO_P (decl))
ENCODE_SECTION_INFO (decl);
#endif
char *label;
ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
var_labelno++;
new_name = label;
}
/* When -fprefix-function-name is used, the functions
names are prefixed. Only nested function names are not
prefixed. */
else if (flag_prefix_function_name && TREE_CODE (decl) == FUNCTION_DECL)
{
size_t name_len = IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (decl));
char *pname;
pname = alloca (name_len + CHKR_PREFIX_SIZE + 1);
memcpy (pname, CHKR_PREFIX, CHKR_PREFIX_SIZE);
memcpy (pname + CHKR_PREFIX_SIZE, name, name_len + 1);
new_name = pname;
}
if (name != new_name)
{
DECL_ASSEMBLER_NAME (decl) = get_identifier (new_name);
name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
}
/* If this variable is to be treated as volatile, show its
tree node has side effects. */
if ((flag_volatile_global && TREE_CODE (decl) == VAR_DECL
&& TREE_PUBLIC (decl))
|| ((flag_volatile_static && TREE_CODE (decl) == VAR_DECL
&& (TREE_PUBLIC (decl) || TREE_STATIC (decl)))))
TREE_SIDE_EFFECTS (decl) = 1;
DECL_RTL (decl) = gen_rtx_MEM (DECL_MODE (decl),
gen_rtx_SYMBOL_REF (Pmode, name));
if (TREE_CODE (decl) != FUNCTION_DECL)
set_mem_attributes (DECL_RTL (decl), decl, 1);
/* Optionally set flags or add text to the name to record information
such as that it is a function name.
If the name is changed, the macro ASM_OUTPUT_LABELREF
will have to know how to strip this information. */
#ifdef ENCODE_SECTION_INFO
ENCODE_SECTION_INFO (decl);
#endif
}
/* Make the rtl for variable VAR be volatile.
@ -4656,8 +4648,8 @@ output_constructor (exp, size)
int
add_weak (name, value)
char *name;
char *value;
const char *name;
const char *value;
{
struct weak_syms *weak;
@ -4724,7 +4716,7 @@ weak_finish ()
#ifdef ASM_WEAKEN_LABEL
static void
remove_from_pending_weak_list (name)
char *name ATTRIBUTE_UNUSED;
const char *name ATTRIBUTE_UNUSED;
{
#ifdef HANDLE_PRAGMA_WEAK
if (HANDLE_PRAGMA_WEAK)