1 // errors.h -- handle errors for gold -*- C++ -*- 2 3 // Copyright 2006, 2007, 2008 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 GOLD_ERRORS_H 24 #define GOLD_ERRORS_H 25 26 #include <cstdarg> 27 28 #include "gold-threads.h" 29 30 namespace gold 31 { 32 33 class Symbol; 34 template<int size, bool big_endian> 35 struct Relocate_info; 36 37 // This class handles errors for gold. There is a single instance 38 // which is used by all threads. If and when we make the gold code 39 // more amenable to being used in a library, we will make this an 40 // abstract interface class, and expect the caller to provide their 41 // own instantiation. 42 43 class Errors 44 { 45 public: 46 Errors(const char* program_name); 47 48 // Report a fatal error. After printing the error, this must exit. 49 void 50 fatal(const char* format, va_list) ATTRIBUTE_NORETURN; 51 52 // Report an error and continue. 53 void 54 error(const char* format, va_list); 55 56 // Report a warning and continue. 57 void 58 warning(const char* format, va_list); 59 60 // Print an informational message and continue. 61 void 62 info(const char* format, va_list); 63 64 // Report an error at a reloc location. 65 template<int size, bool big_endian> 66 void 67 error_at_location(const Relocate_info<size, big_endian>* relinfo, 68 size_t relnum, off_t reloffset, 69 const char* format, va_list); 70 71 // Report a warning at a reloc location. 72 template<int size, bool big_endian> 73 void 74 warning_at_location(const Relocate_info<size, big_endian>* relinfo, 75 size_t relnum, off_t reloffset, 76 const char* format, va_list); 77 78 // Issue an undefined symbol error. LOCATION is the location of 79 // the error (typically an object file name or relocation info). 80 void 81 undefined_symbol(const Symbol* sym, const std::string& location); 82 83 // Report a debugging message. 84 void 85 debug(const char* format, ...) ATTRIBUTE_PRINTF_2; 86 87 // Return the number of errors. 88 int 89 error_count() const 90 { return this->error_count_; } 91 92 // Return the number of warnings. 93 int 94 warning_count() const 95 { return this->warning_count_; } 96 97 private: 98 Errors(const Errors&); 99 Errors& operator=(const Errors&); 100 101 // Initialize the lock. We don't do this in the constructor because 102 // lock initialization wants to know whether we are using threads or 103 // not. This returns true if the lock is now initialized. 104 bool 105 initialize_lock(); 106 107 // Increment a counter, holding the lock. 108 void 109 increment_counter(int*); 110 111 // The number of times we report an undefined symbol. 112 static const int max_undefined_error_report = 5; 113 114 // The name of the program. 115 const char* program_name_; 116 // This class can be accessed from multiple threads. This lock is 117 // used to control access to the data structures. 118 Lock* lock_; 119 // Used to initialize the lock_ field exactly once. 120 Initialize_lock initialize_lock_; 121 // Numbers of errors reported. 122 int error_count_; 123 // Number of warnings reported. 124 int warning_count_; 125 // A map counting the numbers of times we have seen an undefined 126 // symbol. 127 Unordered_map<const Symbol*, int> undefined_symbols_; 128 }; 129 130 } // End namespace gold. 131 132 #endif // !defined(GOLD_ERRORS_H) 133