OSDN Git Service

Correct test results for avoid-bool-define fix
[pf3gnuchains/gcc-fork.git] / gcc / c-lang.c
index 8f37cab..cb60002 100644 (file)
@@ -1,5 +1,6 @@
 /* Language-specific hook definitions for C front end.
-   Copyright (C) 1991, 1995, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1995, 1997, 1998,
+   1999, 2000, 2001 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -22,60 +23,79 @@ Boston, MA 02111-1307, USA.  */
 #include "config.h"
 #include "system.h"
 #include "tree.h"
+#include "function.h"
 #include "input.h"
-#include "c-tree.h"
-#include "c-lex.h"
 #include "toplev.h"
+#include "diagnostic.h"
 #include "output.h"
-
-#if USE_CPPLIB
+#include "flags.h"
+#include "ggc.h"
+#include "rtl.h"
+#include "expr.h"
+#include "c-tree.h"
+#include "c-lex.h"
 #include "cpplib.h"
-extern char *yy_cur;
-extern cpp_reader  parse_in;
-extern cpp_options parse_options;
-#endif
 
-/* Each of the functions defined here
-   is an alternative to a function in objc-actions.c.  */
-   
-int
-lang_decode_option (argc, argv)
-     int argc;
-     char **argv;
+static int c_tree_printer PARAMS ((output_buffer *));
+static int c_missing_noreturn_ok_p PARAMS ((tree));
+static void c_init PARAMS ((void));
+static void c_init_options PARAMS ((void));
+static void c_post_options PARAMS ((void));
+
+/* Each front end provides its own.  */
+struct lang_hooks lang_hooks = {c_init,
+                               NULL, /* c_finish */
+                               c_init_options,
+                               c_decode_option,
+                               c_post_options};
+
+/* Post-switch processing.  */
+static void
+c_post_options ()
 {
-  return c_decode_option (argc, argv);
+  cpp_post_options (parse_in);
 }
 
-void
-lang_init_options ()
+static void
+c_init_options ()
 {
-#if USE_CPPLIB
-  cpp_reader_init (&parse_in);
-  parse_in.opts = &parse_options;
-  cpp_options_init (&parse_options);
-#endif
-}
+  /* Make identifier nodes long enough for the language-specific slots.  */
+  set_identifier_size (sizeof (struct lang_identifier));
 
-void
-lang_init ()
-{
-  /* 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.  */
-#if !USE_CPPLIB
-  ungetc (check_newline (), finput);
-#else
-  check_newline ();
-  yy_cur--;
-#endif 
+  parse_in = cpp_create_reader (ident_hash, CLK_GNUC89);
+
+  /* Mark as "unspecified".  */
+  flag_bounds_check = -1;
 }
 
-void
-lang_finish ()
+static void
+c_init ()
 {
+  c_common_lang_init ();
+
+  /* If still unspecified, make it match -std=c99
+     (allowing for -pedantic-errors).  */
+  if (mesg_implicit_function_declaration < 0)
+    {
+      if (flag_isoc99)
+       mesg_implicit_function_declaration = flag_pedantic_errors ? 2 : 1;
+      else
+       mesg_implicit_function_declaration = 0;
+    }
+
+  save_lang_status = &push_c_function_context;
+  restore_lang_status = &pop_c_function_context;
+  mark_lang_status = &mark_c_function_context;
+  lang_expand_expr = &c_expand_expr;
+  lang_safe_from_p = &c_safe_from_p;
+  lang_printer = &c_tree_printer;
+  lang_expand_decl_stmt = &c_expand_decl_stmt;
+  lang_missing_noreturn_ok_p = &c_missing_noreturn_ok_p;
+
+  c_parse_init ();
 }
 
-char *
+const char *
 lang_identify ()
 {
   return "c";
@@ -128,13 +148,6 @@ maybe_objc_comptypes (lhs, rhs, reflexive)
 }
 
 tree
-maybe_objc_method_name (decl)
-    tree decl ATTRIBUTE_UNUSED;
-{
-  return 0;
-}
-
-tree
 maybe_building_objc_message_expr ()
 {
   return 0;
@@ -146,68 +159,144 @@ recognize_objc_keyword ()
   return 0;
 }
 
+/* Used by c-typeck.c (build_external_ref), but only for objc.  */
+
 tree
-build_objc_string (len, str)
-    int len ATTRIBUTE_UNUSED;
-    const char *str ATTRIBUTE_UNUSED;
+lookup_objc_ivar (id)
+     tree id ATTRIBUTE_UNUSED;
 {
-  abort ();
-  return NULL_TREE;
+  return 0;
 }
 
+#if !defined(ASM_OUTPUT_CONSTRUCTOR) || !defined(ASM_OUTPUT_DESTRUCTOR)
+extern tree static_ctors;
+extern tree static_dtors;
+
+static tree start_cdtor                PARAMS ((int));
+static void finish_cdtor       PARAMS ((tree));
+
+static tree
+start_cdtor (method_type)
+     int method_type;
+{
+  tree fnname = get_file_function_name (method_type);
+  tree void_list_node_1 = build_tree_list (NULL_TREE, void_type_node);
+  tree body;
+
+  start_function (void_list_node_1,
+                 build_nt (CALL_EXPR, fnname,
+                           tree_cons (NULL_TREE, NULL_TREE, void_list_node_1),
+                           NULL_TREE),
+                 NULL_TREE, NULL_TREE);
+  store_parm_decls ();
+
+  current_function_cannot_inline
+    = "static constructors and destructors cannot be inlined";
+
+  body = c_begin_compound_stmt ();
+
+  pushlevel (0);
+  clear_last_expr ();
+  add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
+
+  return body;
+}
+
+static void
+finish_cdtor (body)
+     tree body;
+{
+  tree scope;
+  tree block;
+
+  scope = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
+  block = poplevel (0, 0, 0);
+  SCOPE_STMT_BLOCK (TREE_PURPOSE (scope)) = block;
+  SCOPE_STMT_BLOCK (TREE_VALUE (scope)) = block;
+
+  RECHAIN_STMTS (body, COMPOUND_BODY (body));
+
+  finish_function (0);
+}
+#endif
+
 /* Called at end of parsing, but before end-of-file processing.  */
 
 void
 finish_file ()
 {
 #ifndef ASM_OUTPUT_CONSTRUCTOR
-  extern tree static_ctors;
-#endif
-#ifndef ASM_OUTPUT_DESTRUCTOR
-  extern tree static_dtors;
-#endif
-  extern tree build_function_call                 PROTO((tree, tree));
-#if !defined(ASM_OUTPUT_CONSTRUCTOR) || !defined(ASM_OUTPUT_DESTRUCTOR)
-  tree void_list_node_1 = build_tree_list (NULL_TREE, void_type_node);
-#endif
-#ifndef ASM_OUTPUT_CONSTRUCTOR
   if (static_ctors)
     {
-      tree fnname = get_file_function_name ('I');
-      start_function (void_list_node_1,
-                     build_parse_node (CALL_EXPR, fnname, void_list_node_1,
-                                       NULL_TREE),
-                     NULL_TREE, NULL_TREE, 0);
-      fnname = DECL_ASSEMBLER_NAME (current_function_decl);
-      store_parm_decls ();
+      tree body = start_cdtor ('I');
 
       for (; static_ctors; static_ctors = TREE_CHAIN (static_ctors))
-       expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors),
-                                              NULL_TREE));
-
-      finish_function (0);
+       c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors),
+                                                NULL_TREE));
 
-      assemble_constructor (IDENTIFIER_POINTER (fnname));
+      finish_cdtor (body);
     }
 #endif
 #ifndef ASM_OUTPUT_DESTRUCTOR
   if (static_dtors)
     {
-      tree fnname = get_file_function_name ('D');
-      start_function (void_list_node_1,
-                     build_parse_node (CALL_EXPR, fnname, void_list_node_1,
-                                       NULL_TREE),
-                     NULL_TREE, NULL_TREE, 0);
-      fnname = DECL_ASSEMBLER_NAME (current_function_decl);
-      store_parm_decls ();
+      tree body = start_cdtor ('D');
 
       for (; static_dtors; static_dtors = TREE_CHAIN (static_dtors))
-       expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors),
-                                              NULL_TREE));
+       c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors),
+                                                NULL_TREE));
 
-      finish_function (0);
-
-      assemble_destructor (IDENTIFIER_POINTER (fnname));
+      finish_cdtor (body);
     }
 #endif
+
+  if (back_end_hook)
+    (*back_end_hook) (getdecls ());
+
+  if (flag_dump_translation_unit)
+    dump_node_to_file (getdecls (), flag_dump_translation_unit);
+}
+
+/* Called during diagnostic message formatting process to print a
+   source-level entity onto BUFFER.  The meaning of the format specifiers
+   is as follows:
+   %D: a general decl,
+   %F: a function declaration,
+   %T: a type.
+
+   These format specifiers form a subset of the format specifiers set used
+   by the C++ front-end.
+   Please notice when called, the `%' part was already skipped by the
+   diagnostic machinery.  */
+static int
+c_tree_printer (buffer)
+     output_buffer *buffer;
+{
+  tree t = va_arg (output_buffer_format_args (buffer), tree);
+
+  switch (*output_buffer_text_cursor (buffer))
+    {
+    case 'D':
+    case 'F':
+    case 'T':
+      {
+        const char *n = DECL_NAME (t)
+          ? (*decl_printable_name) (t, 2)
+          : "({anonymous})";
+        output_add_string (buffer, n);
+      }
+      return 1;
+
+    default:
+      return 0;
+    }
+}
+
+static int
+c_missing_noreturn_ok_p (decl)
+     tree decl;
+{
+  /* A missing noreturn is not ok for freestanding implementations and
+     ok for the `main' function in hosted implementations.  */
+  return flag_hosted && MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl));
 }