OSDN Git Service

PR target/42321
[pf3gnuchains/gcc-fork.git] / gcc / langhooks.c
index fa9b8dd..92eacd4 100644 (file)
@@ -37,6 +37,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "langhooks-def.h"
 #include "ggc.h"
 #include "diagnostic.h"
+#include "cgraph.h"
+#include "output.h"
 
 /* Do nothing; in many cases the default hook.  */
 
@@ -52,6 +54,13 @@ lhd_do_nothing_t (tree ARG_UNUSED (t))
 {
 }
 
+/* Pass through (tree).  */
+tree
+lhd_pass_through_t (tree t)
+{
+  return t;
+}
+
 /* Do nothing (int).  */
 
 void
@@ -153,7 +162,7 @@ lhd_set_decl_assembler_name (tree 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
@@ -161,7 +170,7 @@ lhd_set_decl_assembler_name (tree decl)
      compatibility with existing front-ends.  This assumption is wrapped
      in a target hook, to allow for target-specific modification of the
      identifier.
+
      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.  */
@@ -172,7 +181,7 @@ lhd_set_decl_assembler_name (tree decl)
     {
       const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
       char *label;
-      
+
       ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
       id = get_identifier (label);
     }
@@ -259,19 +268,6 @@ lhd_tree_dump_type_quals (const_tree t)
   return TYPE_QUALS (t);
 }
 
-/* lang_hooks.expr_size: Determine the size of the value of an expression T
-   in a language-specific way.  Returns a tree for the size in bytes.  */
-
-tree
-lhd_expr_size (const_tree exp)
-{
-  if (DECL_P (exp)
-      && DECL_SIZE_UNIT (exp) != 0)
-    return DECL_SIZE_UNIT (exp);
-  else
-    return size_in_bytes (TREE_TYPE (exp));
-}
-
 /* lang_hooks.gimplify_expr re-writes *EXPR_P into GIMPLE form.  */
 
 int
@@ -300,28 +296,25 @@ lhd_decl_ok_for_sibcall (const_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
 write_global_declarations (void)
 {
+  tree globals, decl, *vec;
+  int len, i;
+
+  /* This lang hook is dual-purposed, and also finalizes the
+     compilation unit.  */
+  cgraph_finalize_compilation_unit ();
+
   /* Really define vars that have had only a tentative definition.
      Really output inline functions that must actually be callable
      and have not been output so far.  */
 
-  tree globals = lang_hooks.decls.getdecls ();
-  int len = list_length (globals);
-  tree *vec = XNEWVEC (tree, len);
-  int i;
-  tree decl;
+  globals = lang_hooks.decls.getdecls ();
+  len = list_length (globals);
+  vec = XNEWVEC (tree, len);
 
   /* Process the decls in reverse order--earliest first.
      Put them into VEC from back to front, then take out from front.  */
@@ -380,11 +373,11 @@ lhd_print_error_function (diagnostic_context *context, const char *file,
          if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE)
            pp_printf
              (context->printer, _("In member function %qs"),
-              lang_hooks.decl_printable_name (fndecl, 2));
+              identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)));
          else
            pp_printf
              (context->printer, _("In function %qs"),
-              lang_hooks.decl_printable_name (fndecl, 2));
+              identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)));
 
          while (abstract_origin)
            {
@@ -432,21 +425,21 @@ lhd_print_error_function (diagnostic_context *context, const char *file,
                  pp_newline (context->printer);
                  if (s.file != NULL)
                    {
-                     if (flag_show_column && s.column != 0)
+                     if (flag_show_column)
                        pp_printf (context->printer,
                                   _("    inlined from %qs at %s:%d:%d"),
-                                  lang_hooks.decl_printable_name (fndecl, 2),
+                                  identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)),
                                   s.file, s.line, s.column);
                      else
                        pp_printf (context->printer,
                                   _("    inlined from %qs at %s:%d"),
-                                  lang_hooks.decl_printable_name (fndecl, 2),
+                                  identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)),
                                   s.file, s.line);
 
                    }
                  else
                    pp_printf (context->printer, _("    inlined from %qs"),
-                              lang_hooks.decl_printable_name (fndecl, 2));
+                              identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)));
                }
            }
          pp_character (context->printer, ':');
@@ -524,7 +517,7 @@ add_builtin_function_common (const char *name,
                             tree (*hook) (tree))
 {
   tree   id = get_identifier (name);
-  tree decl = build_decl (FUNCTION_DECL, id, type);
+  tree decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL, id, type);
 
   TREE_PUBLIC (decl)         = 1;
   DECL_EXTERNAL (decl)       = 1;
@@ -592,3 +585,56 @@ lhd_builtin_function (tree decl)
   lang_hooks.decls.pushdecl (decl);
   return decl;
 }
+
+/* LTO hooks.  */
+
+/* Used to save and restore any previously active section.  */
+static section *saved_section;
+
+
+/* Begin a new LTO output section named NAME.  This default implementation
+   saves the old section and emits assembly code to switch to the new
+   section.  */
+
+void
+lhd_begin_section (const char *name)
+{
+  section *section;
+
+  /* Save the old section so we can restore it in lto_end_asm_section.  */
+  gcc_assert (!saved_section);
+  saved_section = in_section;
+  if (!saved_section)
+    saved_section = text_section;
+
+  /* Create a new section and switch to it.  */
+  section = get_section (name, SECTION_DEBUG, NULL);
+  switch_to_section (section);
+}
+
+
+/* Write DATA of length LEN to the current LTO output section.  This default
+   implementation just calls assemble_string and frees BLOCK.  */
+
+void
+lhd_append_data (const void *data, size_t len, void *block)
+{
+  if (data)
+    assemble_string ((const char *)data, len);
+  free (block);
+}
+
+
+/* Finish the current LTO output section.  This default implementation emits
+   assembly code to switch to any section previously saved by
+   lhd_begin_section.  */
+
+void
+lhd_end_section (void)
+{
+  if (saved_section)
+    {
+      switch_to_section (saved_section);
+      saved_section = NULL;
+    }
+}