1 // system.h -- general definitions for gold -*- C++ -*- 2 3 // Copyright (C) 2006-2020 Free Software Foundation, Inc. 4 // Written by Ian Lance Taylor <iant@google.com>. 5 6 // This file is part of gold. 7 8 // This program is free software; you can redistribute it and/or modify 9 // it under the terms of the GNU General Public License as published by 10 // the Free Software Foundation; either version 3 of the License, or 11 // (at your option) any later version. 12 13 // This program is distributed in the hope that it will be useful, 14 // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 // GNU General Public License for more details. 17 18 // You should have received a copy of the GNU General Public License 19 // along with this program; if not, write to the Free Software 20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 21 // MA 02110-1301, USA. 22 23 #ifndef SYSTEM_H 24 #define SYSTEM_H 1 25 26 #ifndef ENABLE_NLS 27 // The Solaris version of locale.h always includes libintl.h. If we 28 // have been configured with --disable-nls then ENABLE_NLS will not 29 // be defined and the dummy definitions of bindtextdomain (et al) 30 // below will conflict with the definitions in libintl.h. So we 31 // define these values to prevent the bogus inclusion of libintl.h. 32 # define _LIBINTL_H 33 # define _LIBGETTEXT_H 34 #endif 35 36 #ifdef ENABLE_NLS 37 // On some systems, things go awry when <libintl.h> comes after <clocale>. 38 # include <libintl.h> 39 # include <clocale> 40 # define _(String) gettext (String) 41 # ifdef gettext_noop 42 # define N_(String) gettext_noop (String) 43 # else 44 # define N_(String) (String) 45 # endif 46 #else 47 // Include <clocale> first to avoid conflicts with these macros. 48 # include <clocale> 49 # define gettext(Msgid) (Msgid) 50 # define dgettext(Domainname, Msgid) (Msgid) 51 # define dcgettext(Domainname, Msgid, Category) (Msgid) 52 # define ngettext(Msgid1, Msgid2, n) \ 53 (n == 1 ? Msgid1 : Msgid2) 54 # define dngettext(Domainname, Msgid1, Msgid2, n) \ 55 (n == 1 ? Msgid1 : Msgid2) 56 # define dcngettext(Domainname, Msgid1, Msgid2, n, Category) \ 57 (n == 1 ? Msgid1 : Msgid2) 58 # define textdomain(Domainname) do {} while (0) 59 # define bindtextdomain(Domainname, Dirname) do {} while (0) 60 # define _(String) (String) 61 # define N_(String) (String) 62 #endif 63 64 // Figure out how to get a hash set and a hash map. 65 66 #if defined(HAVE_UNORDERED_SET) && defined(HAVE_UNORDERED_MAP) 67 68 #include <unordered_set> 69 #include <unordered_map> 70 71 // We need a template typedef here. 72 73 #define Unordered_set std::unordered_set 74 #define Unordered_map std::unordered_map 75 #define Unordered_multimap std::unordered_multimap 76 77 #define reserve_unordered_map(map, n) ((map)->rehash(n)) 78 79 #elif defined(HAVE_TR1_UNORDERED_SET) && defined(HAVE_TR1_UNORDERED_MAP) \ 80 && defined(HAVE_TR1_UNORDERED_MAP_REHASH) 81 82 #include <tr1/unordered_set> 83 #include <tr1/unordered_map> 84 85 // We need a template typedef here. 86 87 #define Unordered_set std::tr1::unordered_set 88 #define Unordered_map std::tr1::unordered_map 89 #define Unordered_multimap std::tr1::unordered_multimap 90 91 #define reserve_unordered_map(map, n) ((map)->rehash(n)) 92 93 #ifndef HAVE_TR1_HASH_OFF_T 94 // The library does not support hashes of off_t values. Add support 95 // here. This is likely to be specific to libstdc++. This issue 96 // arises with GCC 4.1.x when compiling in 32-bit mode with a 64-bit 97 // off_t type. 98 namespace std { namespace tr1 { 99 template<> 100 struct hash<off_t> : public std::unary_function<off_t, std::size_t> 101 { 102 std::size_t 103 operator()(off_t val) const 104 { return static_cast<std::size_t>(val); } 105 }; 106 } } // Close namespaces. 107 #endif // !defined(HAVE_TR1_HASH_OFF_T) 108 109 #elif defined(HAVE_EXT_HASH_MAP) && defined(HAVE_EXT_HASH_SET) 110 111 #include <ext/hash_map> 112 #include <ext/hash_set> 113 #include <string> 114 115 #define Unordered_set __gnu_cxx::hash_set 116 #define Unordered_map __gnu_cxx::hash_map 117 #define Unordered_multimap __gnu_cxx::hash_multimap 118 119 namespace __gnu_cxx 120 { 121 122 template<> 123 struct hash<std::string> 124 { 125 size_t 126 operator()(std::string s) const 127 { return __stl_hash_string(s.c_str()); } 128 }; 129 130 template<typename T> 131 struct hash<T*> 132 { 133 size_t 134 operator()(T* p) const 135 { return reinterpret_cast<size_t>(p); } 136 }; 137 138 } 139 140 #define reserve_unordered_map(map, n) ((map)->resize(n)) 141 142 #else 143 144 // The fallback is to just use set and map. 145 146 #include <set> 147 #include <map> 148 149 #define Unordered_set std::set 150 #define Unordered_map std::map 151 #define Unordered_multimap std::multimap 152 153 #define reserve_unordered_map(map, n) 154 155 #endif 156 157 #ifndef HAVE_PREAD 158 extern "C" ssize_t pread(int, void*, size_t, off_t); 159 #endif 160 161 #ifndef HAVE_FTRUNCATE 162 extern "C" int ftruncate(int, off_t); 163 #endif 164 165 #ifndef HAVE_FFSLL 166 extern "C" int ffsll(long long); 167 #endif 168 169 #if !HAVE_DECL_MEMMEM 170 extern "C" void *memmem(const void *, size_t, const void *, size_t); 171 #endif 172 173 #if !HAVE_DECL_STRNDUP 174 extern "C" char *strndup(const char *, size_t); 175 #endif 176 177 #endif // !defined(SYSTEM_H) 178