1 // system.h -- general definitions for gold -*- C++ -*-
3 // Copyright (C) 2006-2015 Free Software Foundation, Inc.
4 // Written by Ian Lance Taylor <iant@google.com>.
6 // This file is part of gold.
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.
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.
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.
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.
33 # define _LIBGETTEXT_H
37 // On some systems, things go awry when <libintl.h> comes after <clocale>.
40 # define _(String) gettext (String)
42 # define N_(String) gettext_noop (String)
44 # define N_(String) (String)
47 // Include <clocale> first to avoid conflicts with these macros.
49 # define gettext(Msgid) (Msgid)
50 # define dgettext(Domainname, Msgid) (Msgid)
51 # define dcgettext(Domainname, Msgid, Category) (Msgid)
52 # define textdomain(Domainname) do {} while (0) /* nothing */
53 # define bindtextdomain(Domainname, Dirname) do {} while (0) /* nothing */
54 # define _(String) (String)
55 # define N_(String) (String)
58 // Figure out how to get a hash set and a hash map.
60 #if defined(HAVE_UNORDERED_SET) && defined(HAVE_UNORDERED_MAP)
62 #include <unordered_set>
63 #include <unordered_map>
65 // We need a template typedef here.
67 #define Unordered_set std::unordered_set
68 #define Unordered_map std::unordered_map
69 #define Unordered_multimap std::unordered_multimap
71 #define reserve_unordered_map(map, n) ((map)->rehash(n))
73 #elif defined(HAVE_TR1_UNORDERED_SET) && defined(HAVE_TR1_UNORDERED_MAP) \
74 && defined(HAVE_TR1_UNORDERED_MAP_REHASH)
76 #include <tr1/unordered_set>
77 #include <tr1/unordered_map>
79 // We need a template typedef here.
81 #define Unordered_set std::tr1::unordered_set
82 #define Unordered_map std::tr1::unordered_map
83 #define Unordered_multimap std::tr1::unordered_multimap
85 #define reserve_unordered_map(map, n) ((map)->rehash(n))
87 #ifndef HAVE_TR1_HASH_OFF_T
88 // The library does not support hashes of off_t values. Add support
89 // here. This is likely to be specific to libstdc++. This issue
90 // arises with GCC 4.1.x when compiling in 32-bit mode with a 64-bit
92 namespace std { namespace tr1 {
94 struct hash<off_t> : public std::unary_function<off_t, std::size_t>
97 operator()(off_t val) const
98 { return static_cast<std::size_t>(val); }
100 } } // Close namespaces.
101 #endif // !defined(HAVE_TR1_HASH_OFF_T)
103 #elif defined(HAVE_EXT_HASH_MAP) && defined(HAVE_EXT_HASH_SET)
105 #include <ext/hash_map>
106 #include <ext/hash_set>
109 #define Unordered_set __gnu_cxx::hash_set
110 #define Unordered_map __gnu_cxx::hash_map
111 #define Unordered_multimap __gnu_cxx::hash_multimap
117 struct hash<std::string>
120 operator()(std::string s) const
121 { return __stl_hash_string(s.c_str()); }
128 operator()(T* p) const
129 { return reinterpret_cast<size_t>(p); }
134 #define reserve_unordered_map(map, n) ((map)->resize(n))
138 // The fallback is to just use set and map.
143 #define Unordered_set std::set
144 #define Unordered_map std::map
145 #define Unordered_multimap std::multimap
147 #define reserve_unordered_map(map, n)
152 extern "C" ssize_t pread(int, void*, size_t, off_t);
155 #ifndef HAVE_FTRUNCATE
156 extern "C" int ftruncate(int, off_t);
160 extern "C" int ffsll(long long);
163 #if !HAVE_DECL_MEMMEM
164 extern "C" void *memmem(const void *, size_t, const void *, size_t);
167 #if !HAVE_DECL_STRNDUP
168 extern "C" char *strndup(const char *, size_t);
171 #endif // !defined(SYSTEM_H)