1 /* C++ specific Solaris system support. 2 Copyright (C) 2011-2015 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 "hash-set.h" 24 #include "machmode.h" 25 #include "vec.h" 26 #include "double-int.h" 27 #include "input.h" 28 #include "alias.h" 29 #include "symtab.h" 30 #include "options.h" 31 #include "wide-int.h" 32 #include "inchash.h" 33 #include "tree.h" 34 #include "stringpool.h" 35 #include "cp/cp-tree.h" 36 #include "tm.h" 37 #include "tm_p.h" 38 39 /* Before GCC 4.7, g++ defined __cplusplus 1 to avoid coping with the C++98 40 overloads in Solaris system headers. Since this was fixed, 4 structure 41 types would move to namespace std, breaking the Solaris libstdc++ ABI. 42 To avoid this, we forcefully keep those types in the global namespace. 43 This can be removed once the next major version of libstdc++ is 44 released. */ 45 46 /* Cache the identifiers of the affected types to speed up lookup. */ 47 #define NUM_FGID 4 48 static GTY(()) tree force_global_identifiers[NUM_FGID]; 49 50 /* Check if DECL is one of the affected types and move it to the global 51 namespace if so. */ 52 tree 53 solaris_cxx_decl_mangling_context (const_tree decl) 54 { 55 static bool init = false; 56 int i = 0; 57 58 if (!init) 59 { 60 force_global_identifiers[i++] = get_identifier ("div_t"); 61 force_global_identifiers[i++] = get_identifier ("ldiv_t"); 62 force_global_identifiers[i++] = get_identifier ("lconv"); 63 force_global_identifiers[i++] = get_identifier ("tm"); 64 init = true; 65 } 66 67 if (!(DECL_P (decl) && DECL_NAMESPACE_STD_P (CP_DECL_CONTEXT (decl)))) 68 return NULL_TREE; 69 70 for (i = 0; i < NUM_FGID; i++) 71 if (DECL_NAME (decl) == force_global_identifiers[i]) 72 return global_namespace; 73 74 return NULL_TREE; 75 } 76