X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gold%2Fgold.h;h=288d9eb937bf0272f2d1bb84780b5f499fcdbcf4;hb=32866df75ece22ec1fd88e99e3c5effe9238e072;hp=cb17ae765635abba7077911e0239f71f57515956;hpb=61ba1cf93601b0a0877a8ade94ba3c674a09f77e;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/gold.h b/gold/gold.h index cb17ae7656..288d9eb937 100644 --- a/gold/gold.h +++ b/gold/gold.h @@ -77,10 +77,74 @@ struct hash #endif +namespace gold +{ +// This is a hack to work around a problem with older versions of g++. +// The problem is that they don't support calling a member template by +// specifying the template parameters. It works to pass in an +// argument for argument dependent lookup. + +// To use this, the member template method declaration should put +// ACCEPT_SIZE or ACCEPT_SIZE_ENDIAN after the last parameter. If the +// method takes no parameters, use ACCEPT_SIZE_ONLY or +// ACCEPT_SIZE_ENDIAN_ONLY. + +// When calling the method, instead of using fn, use fn +// SELECT_SIZE_NAME or SELECT_SIZE_ENDIAN_NAME. And after the last +// argument, put SELECT_SIZE(size) or SELECT_SIZE_ENDIAN(size, +// big_endian). If there is only one argment, use the _ONLY variants. + +#ifdef HAVE_MEMBER_TEMPLATE_SPECIFICATIONS + +#define SELECT_SIZE_NAME(size) +#define SELECT_SIZE(size) +#define SELECT_SIZE_ONLY(size) +#define ACCEPT_SIZE +#define ACCEPT_SIZE_ONLY +#define ACCEPT_SIZE_EXPLICIT(size) + +#define SELECT_SIZE_ENDIAN_NAME(size, big_endian) +#define SELECT_SIZE_ENDIAN(size, big_endian) +#define SELECT_SIZE_ENDIAN_ONLY(size, big_endian) +#define ACCEPT_SIZE_ENDIAN +#define ACCEPT_SIZE_ENDIAN_ONLY +#define ACCEPT_SIZE_ENDIAN_EXPLICIT(size, big_endian) + +#else // !defined(HAVE_MEMBER_TEMPLATE_SPECIFICATIONS) + +template +class Select_size { }; +template +class Select_size_endian { }; + +#define SELECT_SIZE_NAME(size) +#define SELECT_SIZE(size) , Select_size() +#define SELECT_SIZE_ONLY(size) Select_size() +#define ACCEPT_SIZE , Select_size +#define ACCEPT_SIZE_ONLY Select_size +#define ACCEPT_SIZE_EXPLICIT(size) , Select_size + +#define SELECT_SIZE_ENDIAN_NAME(size, big_endian) +#define SELECT_SIZE_ENDIAN(size, big_endian) \ + , Select_size_endian() +#define SELECT_SIZE_ENDIAN_ONLY(size, big_endian) \ + Select_size_endian() +#define ACCEPT_SIZE_ENDIAN , Select_size_endian +#define ACCEPT_SIZE_ENDIAN_ONLY Select_size_endian +#define ACCEPT_SIZE_ENDIAN_EXPLICIT(size, big_endian) \ + , Select_size_endian + +#endif // !defined(HAVE_MEMBER_TEMPLATE_SPECIFICATIONS) + +} // End namespace gold. + namespace gold { class General_options; +class Command_line; +class Input_argument_list; +class Dirsearch; class Input_objects; class Symbol_table; class Layout; @@ -105,11 +169,38 @@ gold_fatal(const char* msg, bool perrno) ATTRIBUTE_NORETURN; extern void gold_nomem() ATTRIBUTE_NORETURN; -// This function is called in cases which can not arise if the code is -// written correctly. +// 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__)) + +extern void do_gold_unreachable(const char*, int, const char*) + ATTRIBUTE_NORETURN; + +// Assertion check. + +#define gold_assert(expr) ((void)(!(expr) ? gold_unreachable(), 0 : 0)) + +// Queue up the first set of tasks. +extern void +queue_initial_tasks(const General_options&, + const Dirsearch&, + const Command_line&, + Workqueue*, + Input_objects*, + Symbol_table*, + Layout*); + +// Queue up the middle set of tasks. extern void -gold_unreachable() ATTRIBUTE_NORETURN; +queue_middle_tasks(const General_options&, + const Input_objects*, + Symbol_table*, + Layout*, + Workqueue*); +// Queue up the final set of tasks. extern void queue_final_tasks(const General_options&, const Input_objects*,