Add licensing text to every source file.
[binutils-gdb.git] / gold / gold.h
index 1140d663a72bf598ff5847c8dcd21eff768db65c..37528464364e5a0b0e72b3e213cfa20248bad440 100644 (file)
@@ -1,6 +1,27 @@
 // gold.h -- general definitions for gold   -*- C++ -*-
 
+// Copyright 2006, 2007 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 GOLD_GOLD_H
+#define GOLD_GOLD_H
 
 #include "config.h"
 #include "ansidecl.h"
@@ -96,17 +117,19 @@ namespace gold
 
 #ifdef HAVE_MEMBER_TEMPLATE_SPECIFICATIONS
 
-#define SELECT_SIZE_NAME <size>
+#define SELECT_SIZE_NAME(size) <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_NAME(size, big_endian) <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)
 
@@ -115,19 +138,22 @@ class Select_size { };
 template<int size, bool big_endian>
 class Select_size_endian { };
 
-#define SELECT_SIZE_NAME
+#define SELECT_SIZE_NAME(size)
 #define SELECT_SIZE(size) , Select_size<size>()
 #define SELECT_SIZE_ONLY(size) Select_size<size>()
 #define ACCEPT_SIZE , Select_size<size>
 #define ACCEPT_SIZE_ONLY Select_size<size>
+#define ACCEPT_SIZE_EXPLICIT(size) , Select_size<size>
 
-#define SELECT_SIZE_ENDIAN_NAME
+#define SELECT_SIZE_ENDIAN_NAME(size, big_endian)
 #define SELECT_SIZE_ENDIAN(size, big_endian) \
   , Select_size_endian<size, big_endian>()
 #define SELECT_SIZE_ENDIAN_ONLY(size, big_endian) \
   Select_size_endian<size, big_endian>()
 #define ACCEPT_SIZE_ENDIAN , Select_size_endian<size, big_endian>
 #define ACCEPT_SIZE_ENDIAN_ONLY Select_size_endian<size, big_endian>
+#define ACCEPT_SIZE_ENDIAN_EXPLICIT(size, big_endian) \
+  , Select_size_endian<size, big_endian>
 
 #endif // !defined(HAVE_MEMBER_TEMPLATE_SPECIFICATIONS)
 
@@ -137,6 +163,7 @@ namespace gold
 {
 
 class General_options;
+class Command_line;
 class Input_argument_list;
 class Dirsearch;
 class Input_objects;
@@ -163,16 +190,24 @@ 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.
-extern void
-gold_unreachable() ATTRIBUTE_NORETURN;
+// 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 Input_argument_list&,
+                   const Command_line&,
                    Workqueue*,
                    Input_objects*,
                    Symbol_table*,