summaryrefslogtreecommitdiff
path: root/gold/system.h
blob: 8d4d6beaabcb3b0698a96cf50c18a8def56515e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
// system.h -- general definitions for gold   -*- C++ -*-

// Copyright (C) 2006-2014 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.

// This file is part of gold.

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
// MA 02110-1301, USA.

#ifndef SYSTEM_H
#define SYSTEM_H 1

#ifndef ENABLE_NLS
  // The Solaris version of locale.h always includes libintl.h.  If we
  // have been configured with --disable-nls then ENABLE_NLS will not
  // be defined and the dummy definitions of bindtextdomain (et al)
  // below will conflict with the definitions in libintl.h.  So we
  // define these values to prevent the bogus inclusion of libintl.h.
# define _LIBINTL_H
# define _LIBGETTEXT_H
#endif

#ifdef ENABLE_NLS
// On some systems, things go awry when <libintl.h> comes after <clocale>.
# include <libintl.h>
# include <clocale>
# define _(String) gettext (String)
# ifdef gettext_noop
#  define N_(String) gettext_noop (String)
# else
#  define N_(String) (String)
# endif
#else
// Include <clocale> first to avoid conflicts with these macros.
# include <clocale>
# define gettext(Msgid) (Msgid)
# define dgettext(Domainname, Msgid) (Msgid)
# define dcgettext(Domainname, Msgid, Category) (Msgid)
# define textdomain(Domainname) do {} while (0) /* nothing */
# define bindtextdomain(Domainname, Dirname) do {} while (0) /* nothing */
# define _(String) (String)
# define N_(String) (String)
#endif

// Figure out how to get a hash set and a hash map.

#if defined(HAVE_UNORDERED_SET) && defined(HAVE_UNORDERED_MAP)

#include <unordered_set>
#include <unordered_map>

// We need a template typedef here.

#define Unordered_set std::unordered_set
#define Unordered_map std::unordered_map
#define Unordered_multimap std::unordered_multimap

#define reserve_unordered_map(map, n) ((map)->rehash(n))

#elif defined(HAVE_TR1_UNORDERED_SET) && defined(HAVE_TR1_UNORDERED_MAP) \
      && defined(HAVE_TR1_UNORDERED_MAP_REHASH)

#include <tr1/unordered_set>
#include <tr1/unordered_map>

// We need a template typedef here.

#define Unordered_set std::tr1::unordered_set
#define Unordered_map std::tr1::unordered_map
#define Unordered_multimap std::tr1::unordered_multimap

#define reserve_unordered_map(map, n) ((map)->rehash(n))

#ifndef HAVE_TR1_HASH_OFF_T
// The library does not support hashes of off_t values.  Add support
// here.  This is likely to be specific to libstdc++.  This issue
// arises with GCC 4.1.x when compiling in 32-bit mode with a 64-bit
// off_t type.
namespace std { namespace tr1 {
template<>
struct hash<off_t> : public std::unary_function<off_t, std::size_t>
{
  std::size_t
  operator()(off_t val) const
  { return static_cast<std::size_t>(val); }
};
} } // Close namespaces.
#endif // !defined(HAVE_TR1_HASH_OFF_T)

#elif defined(HAVE_EXT_HASH_MAP) && defined(HAVE_EXT_HASH_SET)

#include <ext/hash_map>
#include <ext/hash_set>
#include <string>

#define Unordered_set __gnu_cxx::hash_set
#define Unordered_map __gnu_cxx::hash_map
#define Unordered_multimap __gnu_cxx::hash_multimap

namespace __gnu_cxx
{

template<>
struct hash<std::string>
{
  size_t
  operator()(std::string s) const
  { return __stl_hash_string(s.c_str()); }
};

template<typename T>
struct hash<T*>
{
  size_t
  operator()(T* p) const
  { return reinterpret_cast<size_t>(p); }
};

}

#define reserve_unordered_map(map, n) ((map)->resize(n))

#else

// The fallback is to just use set and map.

#include <set>
#include <map>

#define Unordered_set std::set
#define Unordered_map std::map
#define Unordered_multimap std::multimap

#define reserve_unordered_map(map, n)

#endif

#ifndef HAVE_PREAD
extern "C" ssize_t pread(int, void*, size_t, off_t);
#endif

#ifndef HAVE_FTRUNCATE
extern "C" int ftruncate(int, off_t);
#endif

#ifndef HAVE_FFSLL
extern "C" int ffsll(long long);
#endif

#if !HAVE_DECL_MEMMEM
extern "C" void *memmem(const void *, size_t, const void *, size_t);
#endif

#if !HAVE_DECL_STRNDUP
extern "C" char *strndup(const char *, size_t);
#endif

#endif // !defined(SYSTEM_H)