1// system.h -- general definitions for gold   -*- C++ -*-
2
3// Copyright (C) 2006-2017 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 textdomain(Domainname) do {} while (0) /* nothing */
53# define bindtextdomain(Domainname, Dirname) do {} while (0) /* nothing */
54# define _(String) (String)
55# define N_(String) (String)
56#endif
57
58// Figure out how to get a hash set and a hash map.
59
60#if defined(HAVE_UNORDERED_SET) && defined(HAVE_UNORDERED_MAP)
61
62#include <unordered_set>
63#include <unordered_map>
64
65// We need a template typedef here.
66
67#define Unordered_set std::unordered_set
68#define Unordered_map std::unordered_map
69#define Unordered_multimap std::unordered_multimap
70
71#define reserve_unordered_map(map, n) ((map)->rehash(n))
72
73#elif defined(HAVE_TR1_UNORDERED_SET) && defined(HAVE_TR1_UNORDERED_MAP) \
74      && defined(HAVE_TR1_UNORDERED_MAP_REHASH)
75
76#include <tr1/unordered_set>
77#include <tr1/unordered_map>
78
79// We need a template typedef here.
80
81#define Unordered_set std::tr1::unordered_set
82#define Unordered_map std::tr1::unordered_map
83#define Unordered_multimap std::tr1::unordered_multimap
84
85#define reserve_unordered_map(map, n) ((map)->rehash(n))
86
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
91// off_t type.
92namespace std { namespace tr1 {
93template<>
94struct hash<off_t> : public std::unary_function<off_t, std::size_t>
95{
96  std::size_t
97  operator()(off_t val) const
98  { return static_cast<std::size_t>(val); }
99};
100} } // Close namespaces.
101#endif // !defined(HAVE_TR1_HASH_OFF_T)
102
103#elif defined(HAVE_EXT_HASH_MAP) && defined(HAVE_EXT_HASH_SET)
104
105#include <ext/hash_map>
106#include <ext/hash_set>
107#include <string>
108
109#define Unordered_set __gnu_cxx::hash_set
110#define Unordered_map __gnu_cxx::hash_map
111#define Unordered_multimap __gnu_cxx::hash_multimap
112
113namespace __gnu_cxx
114{
115
116template<>
117struct hash<std::string>
118{
119  size_t
120  operator()(std::string s) const
121  { return __stl_hash_string(s.c_str()); }
122};
123
124template<typename T>
125struct hash<T*>
126{
127  size_t
128  operator()(T* p) const
129  { return reinterpret_cast<size_t>(p); }
130};
131
132}
133
134#define reserve_unordered_map(map, n) ((map)->resize(n))
135
136#else
137
138// The fallback is to just use set and map.
139
140#include <set>
141#include <map>
142
143#define Unordered_set std::set
144#define Unordered_map std::map
145#define Unordered_multimap std::multimap
146
147#define reserve_unordered_map(map, n)
148
149#endif
150
151#ifndef HAVE_PREAD
152extern "C" ssize_t pread(int, void*, size_t, off_t);
153#endif
154
155#ifndef HAVE_FTRUNCATE
156extern "C" int ftruncate(int, off_t);
157#endif
158
159#ifndef HAVE_FFSLL
160extern "C" int ffsll(long long);
161#endif
162
163#if !HAVE_DECL_MEMMEM
164extern "C" void *memmem(const void *, size_t, const void *, size_t);
165#endif
166
167#if !HAVE_DECL_STRNDUP
168extern "C" char *strndup(const char *, size_t);
169#endif
170
171#endif // !defined(SYSTEM_H)
172