diff gcc/config/sol2-cxx.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gcc/config/sol2-cxx.c	Fri Oct 27 22:46:09 2017 +0900
@@ -0,0 +1,62 @@
+/* C++ specific Solaris system support.
+   Copyright (C) 2011-2017 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option)
+any later version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "cp/cp-tree.h"
+#include "stringpool.h"
+
+/* Before GCC 4.7, g++ defined __cplusplus 1 to avoid coping with the C++98
+   overloads in Solaris system headers.  Since this was fixed, 4 structure
+   types would move to namespace std, breaking the Solaris libstdc++ ABI.
+   To avoid this, we forcefully keep those types in the global namespace.
+   This can be removed once the next major version of libstdc++ is
+   released.  */
+
+/* Cache the identifiers of the affected types to speed up lookup.  */
+#define NUM_FGID 4
+static GTY(()) tree force_global_identifiers[NUM_FGID];
+
+/* Check if DECL is one of the affected types and move it to the global
+   namespace if so.  */
+tree
+solaris_cxx_decl_mangling_context (const_tree decl)
+{
+  static bool init = false;
+  int i = 0;
+
+  if (!init)
+    {
+      force_global_identifiers[i++] = get_identifier ("div_t");
+      force_global_identifiers[i++] = get_identifier ("ldiv_t");
+      force_global_identifiers[i++] = get_identifier ("lconv");
+      force_global_identifiers[i++] = get_identifier ("tm");
+      init = true;
+    }
+
+  if (!(DECL_P (decl) && DECL_NAMESPACE_STD_P (CP_DECL_CONTEXT (decl))))
+    return NULL_TREE;
+
+  for (i = 0; i < NUM_FGID; i++)
+    if (DECL_NAME (decl) == force_global_identifiers[i])
+	return global_namespace;
+
+  return NULL_TREE;
+}