summaryrefslogtreecommitdiff
path: root/gcc/ch/lang.c
diff options
context:
space:
mode:
authorbothner <bothner@138bc75d-0d04-0410-961f-82ee72b054a4>1998-08-27 20:51:39 +0000
committerbothner <bothner@138bc75d-0d04-0410-961f-82ee72b054a4>1998-08-27 20:51:39 +0000
commitdd201ca1f8b531e5b83221b21b987dea2e71696b (patch)
tree3e221460a1bf1a44a2e3a008fead9cd61b440bc6 /gcc/ch/lang.c
parent43ccffb6fd159b6ec48fdaa7f280a84450c0f2b3 (diff)
downloadgcc-dd201ca1f8b531e5b83221b21b987dea2e71696b.tar.gz
Migrate from devo/gcc/ch. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@22038 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ch/lang.c')
-rw-r--r--gcc/ch/lang.c306
1 files changed, 306 insertions, 0 deletions
diff --git a/gcc/ch/lang.c b/gcc/ch/lang.c
new file mode 100644
index 00000000000..b52bca657eb
--- /dev/null
+++ b/gcc/ch/lang.c
@@ -0,0 +1,306 @@
+/* Language-specific hook definitions for CHILL front end.
+ Copyright (C) 1992, 93, 1994 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, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+
+#include "config.h"
+#include "tree.h"
+#include "ch-tree.h"
+#include "lex.h"
+#include <stdio.h>
+#include "input.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 */
+char* chill_real_input_filename;
+extern FILE* finput;
+
+extern int maximum_field_alignment;
+
+extern void error PROTO((char *, ...));
+extern void error_with_decl PROTO((tree, char *, ...));
+extern void fatal PROTO((char *, ...));
+extern int floor_log2_wide PROTO((unsigned HOST_WIDE_INT));
+extern void pedwarn_with_decl PROTO((tree, char *, ...));
+extern void sorry PROTO((char *, ...));
+extern int type_hash_list PROTO((tree));
+
+/* return 1 if the expression tree given has all
+ constant nodes as its leaves; return 0 otherwise. */
+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;
+{
+ return 0;
+}
+
+int
+maybe_objc_comptypes (lhs, rhs)
+ tree lhs, rhs;
+{
+ 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;
+ tree node;
+ int indent;
+{
+}
+
+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
+ */
+int
+lang_decode_option (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *p = argv[0];
+ static 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;
+}
+
+void
+chill_print_error_function (file)
+ 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
+ {
+ char *kind = "function";
+ 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;
+ tree type;
+{
+ error ("internal error - use of undefined type");
+}
+
+void
+lang_init ()
+{
+ extern void (*print_error_function) PROTO((char*));
+
+ 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;
+}