(root)/
binutils-2.41/
gold/
system.h
       1  // system.h -- general definitions for gold   -*- C++ -*-
       2  
       3  // Copyright (C) 2006-2023 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)