1 /* C++ specific Solaris system support. 2 Copyright (C) 2011-2020 Free Software Foundation, Inc. 3 4 This file is part of GCC. 5 6 GCC is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 GCC is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GCC; see the file COPYING3. If not see 18 <http://www.gnu.org/licenses/>. */ 19 20 #include "config.h" 21 #include "system.h" 22 #include "coretypes.h" 23 #include "cp/cp-tree.h" 24 #include "stringpool.h" 25 26 /* Before GCC 4.7, g++ defined __cplusplus 1 to avoid coping with the C++98 27 overloads in Solaris system headers. Since this was fixed, 4 structure 28 types would move to namespace std, breaking the Solaris libstdc++ ABI. 29 To avoid this, we forcefully keep those types in the global namespace. 30 This can be removed once the next major version of libstdc++ is 31 released. */ 32 33 /* Cache the identifiers of the affected types to speed up lookup. */ 34 #define NUM_FGID 4 35 static GTY(()) tree force_global_identifiers[NUM_FGID]; 36 37 /* Check if DECL is one of the affected types and move it to the global 38 namespace if so. */ 39 tree solaris_cxx_decl_mangling_context(const_tree decl)40solaris_cxx_decl_mangling_context (const_tree decl) 41 { 42 static bool init = false; 43 int i = 0; 44 45 if (!init) 46 { 47 force_global_identifiers[i++] = get_identifier ("div_t"); 48 force_global_identifiers[i++] = get_identifier ("ldiv_t"); 49 force_global_identifiers[i++] = get_identifier ("lconv"); 50 force_global_identifiers[i++] = get_identifier ("tm"); 51 init = true; 52 } 53 54 if (!(DECL_P (decl) && DECL_NAMESPACE_STD_P (CP_DECL_CONTEXT (decl)))) 55 return NULL_TREE; 56 57 for (i = 0; i < NUM_FGID; i++) 58 if (DECL_NAME (decl) == force_global_identifiers[i]) 59 return global_namespace; 60 61 return NULL_TREE; 62 } 63