3b304f5b7d
* Makefile.in (WARN_CFLAGS): Add -Wwrite-strings. (tree.o): Depend on output.h. * c-decl.c (pending_invalid_xref_file, current_function_prototype_file): Constify. (pushdecl): Constify a local char *. (define_label): Constify filename parameter. * c-lex.c (init_parse): Constify parameter and return value. * c-typeck.c (c_expand_asm_operands): Constify filename parameter. * c-tree.h: Update prototypes. * c-parse.in: Constify filename member of %union, and if_stmt_file. * c-parse.y, c-parse.c, c-parse.h, objc/objc-parse.y, objc/objc-parse.c: Regenerate. * dwarfout.c (dwarfout_init): Constify main_input_filename parameter. * dwarfout.h: Update prototypes. * expr.c (expand_expr): Constify a local char *. * flags.h: Constify main_input_filename. * function.c (expand_function_end): Constify filename parameter. * genrecog.c (make_insn_sequence): Use a character array for c_test_pos. (main): Remove unused variables. * input.h: Constify input_filename, main_input_filename, and file_stack.name. Update prototypes. * output.h: Declare first_global_object_name and weak_global_object_name here, as const char *. * stmt.c (expand_asm_operands): Constify filename parameter. * toplev.c (compile_file, push_srcloc, debug_start_source_file): Constify filename parameter. (input_filename, main_input_filename): Constify. * toplev.h: Update prototypes. * tree.c: Include output.h. Don't declare first_global_object_name or weak_global_object_name. Clean up string bashing in get_file_function_name_long. * tree.h (struct tree_decl): Constify filename member. (input_filename): Constify. Update prototypes. * varasm.c (first_global_object_name, weak_global_object_name): Constify. (assemble_start_function, assemble_variable): Clean up string bashing. * gcc.c: Constify all spec-related strings initialized, transitively, from string constants. Constify all strings and string variables related to multilibs. (set_spec, read_specs): Cast argument to free to PTR. (used_arg): Do not modify multilib_matches. Use strncmp plus length comparison to compare multilib switches. * genmultilib: Constify everything declared in multilib.h. ch: * ch-tree.h: Update prototypes. Remove prototypes for functions declared elsewhere. * decl.c (define_label): Constify filename parameter. * grant.c (globalize_decl, set_default_grant_file): Constify local char * variables. Don't declare first_global_object_name or asm_out_file. * lang.c (chill_real_input_filename): Constify. * lex.c (init_parse): Constify parameter and return value. * parse.c: Don't declare input_filename. (ch_expand_asm_operands): Constify filename parameter. (parse_multi_dimension_case_action): Constify local char *. * satisfy.c (safe_satisfy_decl): Constify local char *. cp: * cp-tree.h: Constify tree_srcloc.filename, tinst_level.file, and pending_inline.filename. Update prototypes. * decl.c (define_label): Constify filename parameter. * decl2.c (warn_if_unknown_interface): Constify local char *. * input.c Constify input_source.filename. Don't declare input_filename or lineno. Constify filename parameter to feed_input. * lex.c (init_parse): Constify parameter and return value. (cp_pragma_interface, cp_pragma_implementation): Constify filename argument. (reinit_parse_for_method, reinit_parse_for_block, reinit_parse_for_expr, feed_defarg, handle_cp_pragma): Constify local char *. * pt.c: Don't declare lineno or input_filename. (print_template_context, tsubst_friend_function, tsubst_decl, tsubst, instantiate_decl): Constify local char *. * semantics.c (expand_body): Constify local char *. * tree.c (build_srcloc): Constify filename parameter. * typeck.c (c_expand_asm_operands): Constify filename parameter. f: * com.c (ffecom_subscript_check_): Constify array_name parameter. Clean up string bashing. (ffecom_arrayref_, ffecom_char_args_x_): Constify array_name parameter. (ffecom_do_entry_, ffecom_gen_sfuncdef_, ffecom_start_progunit_, ffecom_sym_transform_, ffecom_sym_transform_assign_): Constify local char *. (init_parse): Constify parameter and return value. * lex.c: Include dwarfout.h instead of prototyping dwarfout_* functions here. (ffelex_file_pop_, ffelex_file_push_): Constify filename parameter. (ffelex_hash_, ffelex_include_): Constify local char *. * std.c (ffestd_exec_end): Constify local char *. * where.c (ffewhere_file_new): Constify filename parameter. * where.h: Update prototypes. java: * check_init.c (check_init): Constify local char *. * class.c (push_class): Constify local char *. * java_tree.h: Update prototypes. * jcf-io.c (open_class): Constify filename parameter and return value. (find_class): Remove redundant string copy. Cast return from open_class. * jcf-parse.c (read_class, parse_class_file, yyparse): Constify local char *. * jcf-write.c (generate_bytecode_insns, generate_classfile): Constify local char *. * jcf.h (JCF): Constify filename and classname. (JCF_FINISH): Cast args to FREE to char * when appropriate. * lang.c (init_parse): Constify parameter and return value. * lex.c (java_get_line_col): Constify filename parameter. * parse.h: Constify parser_ctxt.filename. Update prototypes. * parse.y (java_parser_context_suspend, issue_warning_error_from_context, safe_layout_class): Constify local char *. * parse.c: Regenerate. From-SVN: r33804
301 lines
7.2 KiB
C
301 lines
7.2 KiB
C
/* Language-specific hook definitions for CHILL front end.
|
||
Copyright (C) 1992, 93, 94, 98, 99, 2000 Free Software Foundation, Inc.
|
||
|
||
This file is part of GNU CC.
|
||
|
||
GNU CC is free software; you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation; either version 2, or (at your option)
|
||
any later version.
|
||
|
||
GNU CC is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with GNU CC; see the file COPYING. If not, write to
|
||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||
Boston, MA 02111-1307, USA. */
|
||
|
||
|
||
#include "config.h"
|
||
#include "system.h"
|
||
#include "tree.h"
|
||
#include "ch-tree.h"
|
||
#include "lex.h"
|
||
#include "input.h"
|
||
#include "toplev.h"
|
||
|
||
/* Type node for boolean types. */
|
||
|
||
tree boolean_type_node;
|
||
|
||
/* True if STRING(INDEX) yields a CHARS(1) (or BOOLS(1)) rather than
|
||
a CHAR (or BOOL). Also, makes CHARS(1) similar for CHAR,
|
||
and BOOLS(1) similar to BOOL. This is for compatibility
|
||
for the 1984 version of Z.200.*/
|
||
int flag_old_strings = 0;
|
||
|
||
/* This is set non-zero to force user input tokens to lower case.
|
||
This is non-standard. See Z.200, page 8. */
|
||
int ignore_case = 1;
|
||
|
||
/* True if reserved and predefined words ('special' words in the Z.200
|
||
terminology) are in uppercase. Obviously, this had better not be
|
||
true if we're ignoring input case. */
|
||
int special_UC = 0;
|
||
|
||
/* The actual name of the input file, regardless of any #line directives */
|
||
const char* chill_real_input_filename;
|
||
extern FILE* finput;
|
||
|
||
static int deep_const_expr PARAMS ((tree));
|
||
static void chill_print_error_function PARAMS ((const char *));
|
||
|
||
/* return 1 if the expression tree given has all
|
||
constant nodes as its leaves; return 0 otherwise. */
|
||
static int
|
||
deep_const_expr (exp)
|
||
tree exp;
|
||
{
|
||
enum chill_tree_code code;
|
||
int length;
|
||
int i;
|
||
|
||
if (exp == NULL_TREE)
|
||
return 0;
|
||
|
||
code = TREE_CODE (exp);
|
||
length = tree_code_length[(int) code];
|
||
|
||
/* constant leaf? return TRUE */
|
||
if (TREE_CODE_CLASS (code) == 'c')
|
||
return 1;
|
||
|
||
/* recursively check next level down */
|
||
for (i = 0; i < length; i++)
|
||
if (! deep_const_expr (TREE_OPERAND (exp, i)))
|
||
return 0;
|
||
return 1;
|
||
}
|
||
|
||
|
||
tree
|
||
const_expr (exp)
|
||
tree exp;
|
||
{
|
||
if (TREE_CODE (exp) == INTEGER_CST)
|
||
return exp;
|
||
if (TREE_CODE (exp) == CONST_DECL)
|
||
return const_expr (DECL_INITIAL (exp));
|
||
if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
|
||
&& DECL_INITIAL (exp) != NULL_TREE
|
||
&& TREE_READONLY (exp))
|
||
return DECL_INITIAL (exp);
|
||
if (deep_const_expr (exp))
|
||
return exp;
|
||
if (TREE_CODE (exp) != ERROR_MARK)
|
||
error ("non-constant expression");
|
||
return error_mark_node;
|
||
}
|
||
|
||
/* Each of the functions defined here
|
||
is an alternative to a function in objc-actions.c. */
|
||
|
||
/* Used by c-lex.c, but only for objc. */
|
||
tree
|
||
lookup_interface (arg)
|
||
tree arg ATTRIBUTE_UNUSED;
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
int
|
||
maybe_objc_comptypes (lhs, rhs)
|
||
tree lhs ATTRIBUTE_UNUSED, rhs ATTRIBUTE_UNUSED;
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
tree
|
||
maybe_building_objc_message_expr ()
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
int
|
||
recognize_objc_keyword ()
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
void
|
||
lang_init_options ()
|
||
{
|
||
}
|
||
|
||
/* used by print-tree.c */
|
||
|
||
void
|
||
lang_print_xnode (file, node, indent)
|
||
FILE *file ATTRIBUTE_UNUSED;
|
||
tree node ATTRIBUTE_UNUSED;
|
||
int indent ATTRIBUTE_UNUSED;
|
||
{
|
||
}
|
||
|
||
void
|
||
GNU_xref_begin ()
|
||
{
|
||
fatal ("GCC does not yet support XREF");
|
||
}
|
||
|
||
void
|
||
GNU_xref_end ()
|
||
{
|
||
fatal ("GCC does not yet support XREF");
|
||
}
|
||
|
||
/*
|
||
* process chill-specific compiler command-line options
|
||
* do not complain if the option is not recognised
|
||
*/
|
||
int
|
||
lang_decode_option (argc, argv)
|
||
int argc;
|
||
char **argv;
|
||
{
|
||
char *p = argv[0];
|
||
static int explicit_ignore_case = 0;
|
||
if (!strcmp(p, "-lang-chill"))
|
||
; /* do nothing */
|
||
else if (!strcmp (p, "-fruntime-checking"))
|
||
{
|
||
range_checking = 1;
|
||
empty_checking = 1;
|
||
}
|
||
else if (!strcmp (p, "-fno-runtime-checking"))
|
||
{
|
||
range_checking = 0;
|
||
empty_checking = 0;
|
||
runtime_checking_flag = 0;
|
||
}
|
||
else if (!strcmp (p, "-flocal-loop-counter"))
|
||
flag_local_loop_counter = 1;
|
||
else if (!strcmp (p, "-fno-local-loop-counter"))
|
||
flag_local_loop_counter = 0;
|
||
else if (!strcmp (p, "-fold-strings"))
|
||
flag_old_strings = 1;
|
||
else if (!strcmp (p, "-fno-old-strings"))
|
||
flag_old_strings = 0;
|
||
else if (!strcmp (p, "-fignore-case"))
|
||
{
|
||
explicit_ignore_case = 1;
|
||
if (special_UC)
|
||
{
|
||
error ("Ignoring case upon input and");
|
||
error ("making special words uppercase wouldn't work.");
|
||
}
|
||
else
|
||
ignore_case = 1;
|
||
}
|
||
else if (!strcmp (p, "-fno-ignore-case"))
|
||
ignore_case = 0;
|
||
else if (!strcmp (p, "-fspecial_UC"))
|
||
{
|
||
if (explicit_ignore_case)
|
||
{
|
||
error ("Making special words uppercase and");
|
||
error (" ignoring case upon input wouldn't work.");
|
||
}
|
||
else
|
||
special_UC = 1, ignore_case = 0;
|
||
}
|
||
else if (!strcmp (p, "-fspecial_LC"))
|
||
special_UC = 0;
|
||
else if (!strcmp (p, "-fpack"))
|
||
maximum_field_alignment = BITS_PER_UNIT;
|
||
else if (!strcmp (p, "-fno-pack"))
|
||
maximum_field_alignment = 0;
|
||
else if (!strcmp (p, "-fchill-grant-only"))
|
||
grant_only_flag = 1;
|
||
else if (!strcmp (p, "-fgrant-only"))
|
||
grant_only_flag = 1;
|
||
/* user has specified a seize-file path */
|
||
else if (p[0] == '-' && p[1] == 'I')
|
||
register_seize_path (&p[2]);
|
||
if (!strcmp(p, "-itu")) /* Force Z.200 semantics */
|
||
{
|
||
pedantic = 1; /* FIXME: new flag name? */
|
||
flag_local_loop_counter = 1;
|
||
}
|
||
else
|
||
return c_decode_option (argc, argv);
|
||
|
||
return 1;
|
||
}
|
||
|
||
static void
|
||
chill_print_error_function (file)
|
||
const char *file;
|
||
{
|
||
static tree last_error_function = NULL_TREE;
|
||
static struct module *last_error_module = NULL;
|
||
|
||
if (last_error_function == current_function_decl
|
||
&& last_error_module == current_module)
|
||
return;
|
||
|
||
last_error_function = current_function_decl;
|
||
last_error_module = current_module;
|
||
|
||
if (file)
|
||
fprintf (stderr, "%s: ", file);
|
||
|
||
if (current_function_decl == global_function_decl
|
||
|| current_function_decl == NULL_TREE)
|
||
{
|
||
if (current_module == NULL)
|
||
fprintf (stderr, "At top level:\n");
|
||
else
|
||
fprintf (stderr, "In module %s:\n",
|
||
IDENTIFIER_POINTER (current_module->name));
|
||
}
|
||
else
|
||
{
|
||
const char *kind = "function";
|
||
const char *name = (*decl_printable_name) (current_function_decl, 2);
|
||
fprintf (stderr, "In %s `%s':\n", kind, name);
|
||
}
|
||
}
|
||
|
||
/* Print an error message for invalid use of an incomplete type.
|
||
VALUE is the expression that was used (or 0 if that isn't known)
|
||
and TYPE is the type that was invalid. */
|
||
|
||
void
|
||
incomplete_type_error (value, type)
|
||
tree value ATTRIBUTE_UNUSED;
|
||
tree type ATTRIBUTE_UNUSED;
|
||
{
|
||
error ("internal error - use of undefined type");
|
||
}
|
||
|
||
void
|
||
lang_init ()
|
||
{
|
||
chill_real_input_filename = input_filename;
|
||
|
||
/* the beginning of the file is a new line; check for # */
|
||
/* With luck, we discover the real source file's name from that
|
||
and put it in input_filename. */
|
||
|
||
ungetc (check_newline (), finput);
|
||
|
||
/* set default grant file */
|
||
set_default_grant_file ();
|
||
|
||
print_error_function = chill_print_error_function;
|
||
}
|