X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=gold%2Ferrors.cc;h=156fd69c306448ec2e91b0bb518bf3047cfbf506;hb=refs%2Fheads%2Fvfork-fixes-2021-10-28;hp=618f9cd643e5e3bd01efe5029fd6a80abe72a64b;hpb=7f055c204a4371154123a1816fbec9855ee60ad5;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/errors.cc b/gold/errors.cc index 618f9cd643..156fd69c30 100644 --- a/gold/errors.cc +++ b/gold/errors.cc @@ -1,6 +1,6 @@ // errors.cc -- handle errors for gold -// Copyright 2006, 2007, 2008 Free Software Foundation, Inc. +// Copyright (C) 2006-2021 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -81,7 +81,18 @@ Errors::fatal(const char* format, va_list args) fprintf(stderr, _("%s: fatal error: "), this->program_name_); vfprintf(stderr, format, args); fputc('\n', stderr); - gold_exit(false); + gold_exit(GOLD_ERR); +} + +// Report a fallback error. + +void +Errors::fallback(const char* format, va_list args) +{ + fprintf(stderr, _("%s: fatal error: "), this->program_name_); + vfprintf(stderr, format, args); + fputc('\n', stderr); + gold_exit(GOLD_FALLBACK); } // Report an error. @@ -117,6 +128,15 @@ Errors::info(const char* format, va_list args) fputc('\n', stderr); } +// Print a trace message. + +void +Errors::trace(const char* format, va_list args) +{ + vfprintf(stdout, format, args); + fputc('\n', stdout); +} + // Report an error at a reloc location. template @@ -125,7 +145,7 @@ Errors::error_at_location(const Relocate_info* relinfo, size_t relnum, off_t reloffset, const char* format, va_list args) { - fprintf(stderr, _("%s: %s: error: "), this->program_name_, + fprintf(stderr, _("%s: error: "), relinfo->location(relnum, reloffset).c_str()); vfprintf(stderr, format, args); fputc('\n', stderr); @@ -141,7 +161,7 @@ Errors::warning_at_location(const Relocate_info* relinfo, size_t relnum, off_t reloffset, const char* format, va_list args) { - fprintf(stderr, _("%s: %s: warning: "), this->program_name_, + fprintf(stderr, _("%s: warning: "), relinfo->location(relnum, reloffset).c_str()); vfprintf(stderr, format, args); fputc('\n', stderr); @@ -156,22 +176,40 @@ Errors::undefined_symbol(const Symbol* sym, const std::string& location) { bool initialized = this->initialize_lock(); gold_assert(initialized); + + const char* zmsg; { Hold_lock h(*this->lock_); if (++this->undefined_symbols_[sym] >= max_undefined_error_report) return; - ++this->error_count_; + if (parameters->options().warn_unresolved_symbols()) + { + ++this->warning_count_; + zmsg = _("warning"); + } + else + { + ++this->error_count_; + zmsg = _("error"); + } } + const char* const version = sym->version(); if (version == NULL) - fprintf(stderr, _("%s: %s: error: undefined reference to '%s'\n"), - this->program_name_, location.c_str(), - sym->demangled_name().c_str()); + fprintf(stderr, _("%s: %s: undefined reference to '%s'\n"), + location.c_str(), zmsg, sym->demangled_name().c_str()); else fprintf(stderr, - _("%s: %s: error: undefined reference to '%s', version '%s'\n"), - this->program_name_, location.c_str(), - sym->demangled_name().c_str(), version); + _("%s: %s: undefined reference to '%s', version '%s'\n"), + location.c_str(), zmsg, sym->demangled_name().c_str(), version); + + if (sym->is_cxx_vtable()) + gold_info(_("%s: the vtable symbol may be undefined because " + "the class is missing its key function"), + program_name); + if (sym->is_placeholder()) + gold_info(_("%s: the symbol should have been defined by a plugin"), + program_name); } // Issue a debugging message. @@ -202,6 +240,17 @@ gold_fatal(const char* format, ...) va_end(args); } +// Report a fallback error. + +void +gold_fallback(const char* format, ...) +{ + va_list args; + va_start(args, format); + parameters->errors()->fallback(format, args); + va_end(args); +} + // Report an error. void @@ -235,6 +284,17 @@ gold_info(const char* format, ...) va_end(args); } +// Print a trace message (to stdout). + +void +gold_trace(const char* format, ...) +{ + va_list args; + va_start(args, format); + parameters->errors()->trace(format, args); + va_end(args); +} + // Report an error at a location. template