OSDN Git Service

PR middle-end/20219
[pf3gnuchains/gcc-fork.git] / gcc / langhooks.c
index 9f0a236..d7ed750 100644 (file)
@@ -1,5 +1,5 @@
 /* Default language-specific hooks.
-   Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+   Copyright 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
    Contributed by Alexandre Oliva  <aoliva@redhat.com>
 
 This file is part of GCC.
@@ -16,12 +16,13 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GCC; see the file COPYING.  If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
+#include "intl.h"
 #include "tm.h"
 #include "toplev.h"
 #include "tree.h"
@@ -157,37 +158,31 @@ lhd_set_decl_assembler_name (tree decl)
      DECL_ASSEMBLER_NAME for lots of DECLs.  Only FUNCTION_DECLs and
      VAR_DECLs for variables with static storage duration need a real
      DECL_ASSEMBLER_NAME.  */
-  if (TREE_CODE (decl) == FUNCTION_DECL
-      || (TREE_CODE (decl) == VAR_DECL
-         && (TREE_STATIC (decl)
-             || DECL_EXTERNAL (decl)
-             || TREE_PUBLIC (decl))))
+  gcc_assert (TREE_CODE (decl) == FUNCTION_DECL
+             || (TREE_CODE (decl) == VAR_DECL
+                 && (TREE_STATIC (decl)
+                     || DECL_EXTERNAL (decl)
+                     || TREE_PUBLIC (decl))));
+  
+  /* By default, assume the name to use in assembly code is the same
+     as that used in the source language.  (That's correct for C, and
+     GCC used to set DECL_ASSEMBLER_NAME to the same value as
+     DECL_NAME in build_decl, so this choice provides backwards
+     compatibility with existing front-ends.
+      
+     Can't use just the variable's own name for a variable whose scope
+     is less than the whole compilation.  Concatenate a distinguishing
+     number - we use the DECL_UID.  */
+  if (TREE_PUBLIC (decl) || DECL_CONTEXT (decl) == NULL_TREE)
+    SET_DECL_ASSEMBLER_NAME (decl, DECL_NAME (decl));
+  else
     {
-      /* By default, assume the name to use in assembly code is the
-        same as that used in the source language.  (That's correct
-        for C, and GCC used to set DECL_ASSEMBLER_NAME to the same
-        value as DECL_NAME in build_decl, so this choice provides
-        backwards compatibility with existing front-ends.
-
-         Can't use just the variable's own name for a variable whose
-        scope is less than the whole compilation.  Concatenate a
-        distinguishing number - we use the DECL_UID.  */
-      if (TREE_PUBLIC (decl) || DECL_CONTEXT (decl) == NULL_TREE)
-       SET_DECL_ASSEMBLER_NAME (decl, DECL_NAME (decl));
-      else
-       {
-         const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
-         char *label;
-
-         ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
-         SET_DECL_ASSEMBLER_NAME (decl, get_identifier (label));
-       }
+      const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
+      char *label;
+      
+      ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
+      SET_DECL_ASSEMBLER_NAME (decl, get_identifier (label));
     }
-  else
-    /* Nobody should ever be asking for the DECL_ASSEMBLER_NAME of
-       these DECLs -- unless they're in language-dependent code, in
-       which case set_decl_assembler_name hook should handle things.  */
-    abort ();
 }
 
 /* By default we always allow bit-field based optimizations.  */
@@ -201,7 +196,7 @@ lhd_can_use_bit_fields_p (void)
 tree
 lhd_type_promotes_to (tree ARG_UNUSED (type))
 {
-  abort ();
+  gcc_unreachable ();
 }
 
 /* Registration of machine- or os-specific builtin types.  */
@@ -215,10 +210,8 @@ lhd_register_builtin_type (tree ARG_UNUSED (type),
 void
 lhd_incomplete_type_error (tree ARG_UNUSED (value), tree type)
 {
-  if (TREE_CODE (type) == ERROR_MARK)
-    return;
-
-  abort ();
+  gcc_assert (TREE_CODE (type) == ERROR_MARK);
+  return;
 }
 
 /* Provide a default routine for alias sets that always returns -1.  This
@@ -247,7 +240,7 @@ lhd_expand_expr (tree ARG_UNUSED (t), rtx ARG_UNUSED (r),
                 int ARG_UNUSED (em),
                 rtx * ARG_UNUSED (a))
 {
-  abort ();
+  gcc_unreachable ();
 }
 
 /* The default language-specific function for expanding a decl.  After
@@ -267,6 +260,7 @@ lhd_expand_decl (tree ARG_UNUSED (t))
 const char *
 lhd_decl_printable_name (tree decl, int ARG_UNUSED (verbosity))
 {
+  gcc_assert (decl && DECL_NAME (decl));
   return IDENTIFIER_POINTER (DECL_NAME (decl));
 }
 
@@ -286,17 +280,17 @@ lhd_types_compatible_p (tree x, tree y)
    handle language-specific tree codes, as well as language-specific
    information associated to common tree codes.  If a tree node is
    completely handled within this function, it should set *SUBTREES to
-   0, so that generic handling isn't attempted.  For language-specific
-   tree codes, generic handling would abort(), so make sure it is set
-   properly.  Both SUBTREES and *SUBTREES is guaranteed to be nonzero
-   when the function is called.  */
+   0, so that generic handling isn't attempted.  The generic handling
+   cannot deal with language-specific tree codes, so make sure it is
+   set properly.  Both SUBTREES and *SUBTREES is guaranteed to be
+   nonzero when the function is called.  */
 
 tree
 lhd_tree_inlining_walk_subtrees (tree *tp ATTRIBUTE_UNUSED,
                                 int *subtrees ATTRIBUTE_UNUSED,
                                 walk_tree_fn func ATTRIBUTE_UNUSED,
                                 void *data ATTRIBUTE_UNUSED,
-                                void *htab ATTRIBUTE_UNUSED)
+                                struct pointer_set_t *pset ATTRIBUTE_UNUSED)
 {
   return NULL_TREE;
 }
@@ -420,7 +414,7 @@ lhd_tree_dump_type_quals (tree t)
 tree
 lhd_expr_size (tree exp)
 {
-  if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
+  if (DECL_P (exp)
       && DECL_SIZE_UNIT (exp) != 0)
     return DECL_SIZE_UNIT (exp);
   else
@@ -437,13 +431,12 @@ lhd_gimplify_expr (tree *expr_p ATTRIBUTE_UNUSED, tree *pre_p ATTRIBUTE_UNUSED,
 }
 
 /* lang_hooks.tree_size: Determine the size of a tree with code C,
-   which is a language-specific tree code in category 'x'.  The
-   default expects never to be called.  */
+   which is a language-specific tree code in category tcc_constant or
+   tcc_exceptional.  The default expects never to be called.  */
 size_t
 lhd_tree_size (enum tree_code c ATTRIBUTE_UNUSED)
 {
-  abort ();
-  return 0;
+  gcc_unreachable ();
 }
 
 /* Return true if decl, which is a function decl, may be called by a
@@ -455,6 +448,14 @@ lhd_decl_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED)
   return true;
 }
 
+/* Return the COMDAT group into which DECL should be placed.  */
+
+const char *
+lhd_comdat_group (tree decl)
+{
+  return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
+}
+
 /* lang_hooks.decls.final_write_globals: perform final processing on
    global variables.  */
 void
@@ -477,10 +478,10 @@ write_global_declarations (void)
     vec[len - i - 1] = decl;
 
   wrapup_global_declarations (vec, len);
-
   check_global_declarations (vec, len);
+  emit_debug_global_declarations (vec, len);
 
-    /* Clean up.  */
+  /* Clean up.  */
   free (vec);
 }
 
@@ -503,16 +504,16 @@ lhd_print_error_function (diagnostic_context *context, const char *file)
       pp_set_prefix (context->printer, new_prefix);
 
       if (current_function_decl == NULL)
-       pp_printf (context->printer, "At top level:");
+       pp_printf (context->printer, _("At top level:"));
       else
        {
          if (TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE)
            pp_printf
-             (context->printer, "In member function `%s':",
+             (context->printer, _("In member function %qs:"),
               lang_hooks.decl_printable_name (current_function_decl, 2));
          else
            pp_printf
-             (context->printer, "In function `%s':",
+             (context->printer, _("In function %qs:"),
               lang_hooks.decl_printable_name (current_function_decl, 2));
        }
 
@@ -536,3 +537,16 @@ lhd_make_node (enum tree_code code)
 {
   return make_node (code);
 }
+
+HOST_WIDE_INT
+lhd_to_target_charset (HOST_WIDE_INT c)
+{
+  return c;
+}
+
+tree
+lhd_expr_to_decl (tree expr, bool *tc ATTRIBUTE_UNUSED,
+                 bool *ti ATTRIBUTE_UNUSED, bool *se ATTRIBUTE_UNUSED)
+{
+  return expr;
+}