X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gold%2Fgold.h;h=04b691150990d73fb352c7f5a2d18be3d8e8505f;hb=e1e82ea4dca2c0ab5173de6799ffdfcb9659e7c2;hp=a377f96edf973d410d5c5c6f58891897a4b66958;hpb=fd03461a93f2e080e317da40dc4929ee437ffb76;p=binutils-gdb.git diff --git a/gold/gold.h b/gold/gold.h index a377f96edf9..04b69115099 100644 --- a/gold/gold.h +++ b/gold/gold.h @@ -1,6 +1,6 @@ // gold.h -- general definitions for gold -*- C++ -*- -// Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -65,7 +65,8 @@ // Figure out how to get a hash set and a hash map. -#if defined(HAVE_TR1_UNORDERED_SET) && defined(HAVE_TR1_UNORDERED_MAP) +#if defined(HAVE_TR1_UNORDERED_SET) && defined(HAVE_TR1_UNORDERED_MAP) \ + && defined(HAVE_TR1_UNORDERED_MAP_REHASH) #include #include @@ -74,6 +75,9 @@ #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)) #elif defined(HAVE_EXT_HASH_MAP) && defined(HAVE_EXT_HASH_SET) @@ -83,6 +87,7 @@ #define Unordered_set __gnu_cxx::hash_set #define Unordered_map __gnu_cxx::hash_map +#define Unordered_multimap __gnu_cxx::hash_multimap namespace __gnu_cxx { @@ -105,6 +110,8 @@ struct hash } +#define reserve_unordered_map(map, n) ((map)->resize(n)) + #else // The fallback is to just use set and map. @@ -114,6 +121,9 @@ struct hash #define Unordered_set std::set #define Unordered_map std::map +#define Unordered_multimap std::multimap + +#define reserve_unordered_map(map, n) #endif @@ -134,6 +144,14 @@ extern "C" void *mremap(void *, size_t, size_t, int, ...); 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 + namespace gold { @@ -141,7 +159,6 @@ namespace gold class General_options; class Command_line; -class Input_argument_list; class Dirsearch; class Input_objects; class Mapfile; @@ -236,11 +253,22 @@ gold_undefined_symbol_at_location(const Symbol*, extern void gold_nomem() ATTRIBUTE_NORETURN; +// In versions of gcc before 4.3, using __FUNCTION__ in a template +// function can cause gcc to get confused about whether or not the +// function can return. See http://gcc.gnu.org/PR30988. Use a macro +// to avoid the problem. This can be removed when we no longer need +// to care about gcc versions before 4.3. +#if defined(__GNUC__) && GCC_VERSION < 4003 +#define FUNCTION_NAME static_cast(__FUNCTION__) +#else +#define FUNCTION_NAME __FUNCTION__ +#endif + // This macro and function are used in cases which can not arise if // the code is written correctly. #define gold_unreachable() \ - (gold::do_gold_unreachable(__FILE__, __LINE__, __FUNCTION__)) + (gold::do_gold_unreachable(__FILE__, __LINE__, FUNCTION_NAME)) extern void do_gold_unreachable(const char*, int, const char*) ATTRIBUTE_NORETURN; @@ -286,7 +314,7 @@ queue_initial_tasks(const General_options&, // Queue up the set of tasks to be done before // the middle set of tasks. Only used when garbage -// collection is to be done. +// collection is to be done. extern void queue_middle_gc_tasks(const General_options&, const Task*, @@ -321,6 +349,58 @@ is_prefix_of(const char* prefix, const char* str) return strncmp(prefix, str, strlen(prefix)) == 0; } +const char* const cident_section_start_prefix = "__start_"; +const char* const cident_section_stop_prefix = "__stop_"; + +// Returns true if the name is a valid C identifier +inline bool +is_cident(const char* name) +{ + return (name[strspn(name, + ("0123456789" + "ABCDEFGHIJKLMNOPWRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "_"))] + == '\0'); +} + +// We sometimes need to hash strings. Ideally we should use std::tr1::hash or +// __gnu_cxx::hash on some systems but there is no guarantee that either +// one is available. For portability, we define simple string hash functions. + +template +inline size_t +string_hash(const Char_type* s, size_t length) +{ + // This is the hash function used by the dynamic linker for + // DT_GNU_HASH entries. I compared this to a Fowler/Noll/Vo hash + // for a C++ program with 385,775 global symbols. This hash + // function was very slightly worse. However, it is much faster to + // compute. Overall wall clock time was a win. + const unsigned char* p = reinterpret_cast(s); + size_t h = 5381; + for (size_t i = 0; i < length * sizeof(Char_type); ++i) + h = h * 33 + *p++; + return h; +} + +// Same as above except we expect the string to be zero terminated. + +template +inline size_t +string_hash(const Char_type* s) +{ + const unsigned char* p = reinterpret_cast(s); + size_t h = 5381; + for (size_t i = 0; s[i] != 0; ++i) + { + for (size_t j = 0; j < sizeof(Char_type); j++) + h = h * 33 + *p++; + } + + return h; +} + } // End namespace gold. #endif // !defined(GOLD_GOLD_H)