From patchwork Wed Aug 17 13:06:51 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rainer Orth X-Patchwork-Id: 110314 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 92A41B6F00 for ; Wed, 17 Aug 2011 23:07:33 +1000 (EST) Received: (qmail 17928 invoked by alias); 17 Aug 2011 13:07:28 -0000 Received: (qmail 17897 invoked by uid 22791); 17 Aug 2011 13:07:24 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, T_TVD_MIME_NO_HEADERS X-Spam-Check-By: sourceware.org Received: from snape.CeBiTec.Uni-Bielefeld.DE (HELO smtp-relay.CeBiTec.Uni-Bielefeld.DE) (129.70.160.84) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 17 Aug 2011 13:07:07 +0000 Received: from localhost (localhost.CeBiTec.Uni-Bielefeld.DE [127.0.0.1]) by smtp-relay.CeBiTec.Uni-Bielefeld.DE (Postfix) with ESMTP id BA7A3D38; Wed, 17 Aug 2011 15:07:05 +0200 (CEST) Received: from smtp-relay.CeBiTec.Uni-Bielefeld.DE ([127.0.0.1]) by localhost (malfoy.CeBiTec.Uni-Bielefeld.DE [127.0.0.1]) (amavisd-new, port 10024) with LMTP id pJyRhSsqKEeO; Wed, 17 Aug 2011 15:06:52 +0200 (CEST) Received: from manam.CeBiTec.Uni-Bielefeld.DE (manam.CeBiTec.Uni-Bielefeld.DE [129.70.161.120]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp-relay.CeBiTec.Uni-Bielefeld.DE (Postfix) with ESMTPS id 8D302D36; Wed, 17 Aug 2011 15:06:52 +0200 (CEST) Received: (from ro@localhost) by manam.CeBiTec.Uni-Bielefeld.DE (8.14.5+Sun/8.14.5/Submit) id p7HD6pFq010594; Wed, 17 Aug 2011 15:06:51 +0200 (MEST) From: Rainer Orth To: Jason Merrill Cc: Marc Glisse , Paolo Carlini , gcc-patches@gcc.gnu.org, libstdc++@gcc.gnu.org Subject: Re: [c++] Keep tm, div_t, ldiv_t, lconv mangling on Solaris (PR libstdc++-v3/1773) References: <4E429C2F.2080405@redhat.com> <4E42C02B.4030800@oracle.com> <4E44401A.8040502@redhat.com> <4E4ADC0A.6030009@redhat.com> Date: Wed, 17 Aug 2011 15:06:51 +0200 In-Reply-To: <4E4ADC0A.6030009@redhat.com> (Jason Merrill's message of "Tue, 16 Aug 2011 17:07:22 -0400") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.3 (usg-unix-v) MIME-Version: 1.0 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Jason Merrill writes: > On 08/16/2011 11:31 AM, Marc Glisse wrote: >> It might be less invasive to have decl_mangling_context return >> global_namespace without actually modifying the expr? > > Please. Done, tested as before. Rainer 2011-08-07 Rainer Orth Marc Glisse gcc: PR libstdc++-v3/1773 * target.def (decl_mangling_context): New C++ hook. * doc/tm.texi: Regenerate. * config/sol2-cxx.c, config/sol2-stubs.c: New files. * config/sol2-protos.h: Group by source file. (solaris_cxx_decl_mangling_context): Declare. * config/sol2.h (TARGET_CXX_DECL_MANGLING_CONTEXT): Define. * config/t-sol2 (sol2-cxx.o, sol2-stubs.o): New targets. Use $<. * config.gcc (*-*-solaris2*): Add sol2-cxx.o to cxx_target_objs. Add sol2-stubs.o to extra_objs. gcc/cp: PR libstdc++-v3/1773 * mangle.c (decl_mangling_context): Call targetm.cxx.decl_mangling_context. (write_unscoped_name): Use decl_mangling_context. # HG changeset patch # Parent da2cbe8d1768a3ceb7ca3b9b7a739434168793e3 Keep tm, div_t, ldiv_t, lconv mangling on Solaris (PR libstdc++-v3/1773) diff --git a/gcc/config.gcc b/gcc/config.gcc --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -718,8 +718,8 @@ case ${target} in tm_p_file="${tm_p_file} sol2-protos.h" tmake_file="${tmake_file} t-sol2 t-slibgcc-dummy" c_target_objs="${c_target_objs} sol2-c.o" - cxx_target_objs="${cxx_target_objs} sol2-c.o" - extra_objs="sol2.o" + cxx_target_objs="${cxx_target_objs} sol2-c.o sol2-cxx.o" + extra_objs="sol2.o sol2-stubs.o" extra_options="${extra_options} sol2.opt" case ${enable_threads}:${have_pthread_h}:${have_thread_h} in "":yes:* | yes:yes:* ) diff --git a/gcc/config/sol2-cxx.c b/gcc/config/sol2-cxx.c new file mode 100644 --- /dev/null +++ b/gcc/config/sol2-cxx.c @@ -0,0 +1,64 @@ +/* C++ specific Solaris system support. + Copyright (C) 2011 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 +. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tree.h" +#include "cp/cp-tree.h" +#include "tm.h" +#include "tm_p.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; +} diff --git a/gcc/config/sol2-protos.h b/gcc/config/sol2-protos.h --- a/gcc/config/sol2-protos.h +++ b/gcc/config/sol2-protos.h @@ -18,9 +18,15 @@ You should have received a copy of the G along with GCC; see the file COPYING3. If not see . */ -extern void solaris_insert_attributes (tree, tree *); -extern void solaris_register_pragmas (void); -extern void solaris_output_init_fini (FILE *, tree); +/* In sol2.c. */ extern void solaris_assemble_visibility (tree, int); extern void solaris_elf_asm_comdat_section (const char *, unsigned int, tree); extern void solaris_file_end (void); +extern void solaris_insert_attributes (tree, tree *); +extern void solaris_output_init_fini (FILE *, tree); + +/* In sol2-c.c. */ +extern void solaris_register_pragmas (void); + +/* In sol2-cxx.c. */ +extern tree solaris_cxx_decl_mangling_context (const_tree); diff --git a/gcc/config/sol2-stubs.c b/gcc/config/sol2-stubs.c new file mode 100644 --- /dev/null +++ b/gcc/config/sol2-stubs.c @@ -0,0 +1,33 @@ +/* Stubs for C++ specific Solaris system support. + Copyright (C) 2011 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 +. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tree.h" +#include "tm.h" +#include "tm_p.h" + +/* Stub implemenation of TARGET_CXX_DECL_MANGLING_CONTEXT for non-C++ + frontends. */ +tree +solaris_cxx_decl_mangling_context (const_tree decl ATTRIBUTE_UNUSED) +{ + return NULL_TREE; +} diff --git a/gcc/config/sol2.h b/gcc/config/sol2.h --- a/gcc/config/sol2.h +++ b/gcc/config/sol2.h @@ -217,6 +217,8 @@ along with GCC; see the file COPYING3. /* Allow macro expansion in #pragma pack. */ #define HANDLE_PRAGMA_PACK_WITH_EXPANSION +#define TARGET_CXX_DECL_MANGLING_CONTEXT solaris_cxx_decl_mangling_context + /* Solaris/x86 as and gas support unquoted section names. */ #define SECTION_NAME_FORMAT "%s" diff --git a/gcc/config/t-sol2 b/gcc/config/t-sol2 --- a/gcc/config/t-sol2 +++ b/gcc/config/t-sol2 @@ -20,14 +20,22 @@ sol2-c.o: $(srcdir)/config/sol2-c.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ tree.h c-family/c-format.h $(C_PRAGMA_H) $(C_COMMON_H) $(CPPLIB_H) \ intl.h $(TM_H) $(TM_P_H) - $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ - $(srcdir)/config/sol2-c.c + $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< + +# Solaris-specific C++ mangling. +sol2-cxx.o: $(srcdir)/config/sol2-cxx.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ + tree.h cp/cp-tree.h $(TM_H) $(TM_P_H) + $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< + +# Corresponding stub routines. +sol2-stubs.o: $(srcdir)/config/sol2-stubs.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ + tree.h $(TM_H) $(TM_P_H) + $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< # Solaris-specific attributes sol2.o: $(srcdir)/config/sol2.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ tree.h output.h $(TM_H) $(TARGET_H) $(TM_P_H) $(GGC_H) - $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ - $(srcdir)/config/sol2.c + $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< # This is required by gcc/ada/gcc-interface/Makefile.in. TARGET_LIBGCC2_CFLAGS = -fPIC diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -747,6 +747,11 @@ write_encoding (const tree decl) static tree decl_mangling_context (tree decl) { + tree tcontext = targetm.cxx.decl_mangling_context (decl); + + if (tcontext != NULL_TREE) + return tcontext; + if (TREE_CODE (decl) == TYPE_DECL && LAMBDA_TYPE_P (TREE_TYPE (decl))) { @@ -857,7 +862,7 @@ write_name (tree decl, const int ignore_ static void write_unscoped_name (const tree decl) { - tree context = CP_DECL_CONTEXT (decl); + tree context = decl_mangling_context (decl); MANGLE_TRACE_TREE ("unscoped-name", decl); diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -10173,6 +10173,10 @@ unloaded. The default is to return false @var{type} is a C++ class (i.e., RECORD_TYPE or UNION_TYPE) that has just been defined. Use this hook to make adjustments to the class (eg, tweak visibility or perform any other required target modifications). @end deftypefn +@deftypefn {Target Hook} tree TARGET_CXX_DECL_MANGLING_CONTEXT (const_tree @var{decl}) +Return target-specific mangling context of @var{decl}. +@end deftypefn + @node Named Address Spaces @section Adding support for named address spaces @cindex named address spaces diff --git a/gcc/target.def b/gcc/target.def --- a/gcc/target.def +++ b/gcc/target.def @@ -2451,6 +2451,12 @@ DEFHOOK void, (tree type), hook_void_tree) +DEFHOOK +(decl_mangling_context, + "Return target-specific mangling context of @var{decl}.", + tree, (const_tree decl), + hook_tree_const_tree_null) + HOOK_VECTOR_END (cxx) /* Functions and data for emulated TLS support. */