From 308ecdc7cee575abd597cbbc4465c67376bd14e5 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 18 Apr 2011 05:39:43 +0000 Subject: [PATCH] * object.cc (Relocate_info::location): Simplify location string. * errors.cc (Errors::error_at_location): Don't print program name. (Errors::warning_at_location): Likewise. (Errors::undefined_symbol): Likewise. * testsuite/debug_msg.sh: Update accordingly. --- gold/ChangeLog | 9 ++++++ gold/errors.cc | 16 +++++------ gold/object.cc | 55 ++++++++++++++++++------------------- gold/testsuite/debug_msg.sh | 24 ++++++++-------- 4 files changed, 54 insertions(+), 50 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 38d528c8b18..3ab58cd41ef 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,12 @@ +2011-04-17 Ian Lance Taylor + + * object.cc (Relocate_info::location): Simplify location string. + * errors.cc (Errors::error_at_location): Don't print program + name. + (Errors::warning_at_location): Likewise. + (Errors::undefined_symbol): Likewise. + * testsuite/debug_msg.sh: Update accordingly. + 2011-04-14 Cary Coutant * gold/layout.cc (Layout::symtab_section_offset): New function. diff --git a/gold/errors.cc b/gold/errors.cc index b8031b1ba7b..b5865048823 100644 --- a/gold/errors.cc +++ b/gold/errors.cc @@ -1,6 +1,6 @@ // errors.cc -- handle errors for gold -// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -125,7 +125,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 +141,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); @@ -176,14 +176,12 @@ Errors::undefined_symbol(const Symbol* sym, const std::string& location) const char* const version = sym->version(); if (version == NULL) - fprintf(stderr, _("%s: %s: %s: undefined reference to '%s'\n"), - this->program_name_, location.c_str(), zmsg, - 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: %s: undefined reference to '%s', version '%s'\n"), - this->program_name_, location.c_str(), zmsg, - 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); } // Issue a debugging message. diff --git a/gold/object.cc b/gold/object.cc index 104a8db72ca..b1fc25cedcd 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -1,6 +1,6 @@ // object.cc -- support for an object file for linking in gold -// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -2621,46 +2621,43 @@ Input_objects::print_cref(const Symbol_table* symtab, FILE* f) const // Relocate_info methods. -// Return a string describing the location of a relocation. This is -// only used in error messages. +// Return a string describing the location of a relocation when file +// and lineno information is not available. This is only used in +// error messages. template std::string Relocate_info::location(size_t, off_t offset) const { - // See if we can get line-number information from debugging sections. - std::string filename; - std::string file_and_lineno; // Better than filename-only, if available. - Sized_dwarf_line_info line_info(this->object); - // This will be "" if we failed to parse the debug info for any reason. - file_and_lineno = line_info.addr2line(this->data_shndx, offset, NULL); + std::string ret = line_info.addr2line(this->data_shndx, offset, NULL); + if (!ret.empty()) + return ret; + + ret = this->object->name(); - std::string ret(this->object->name()); - ret += ':'; Symbol_location_info info; if (this->object->get_symbol_location_info(this->data_shndx, offset, &info)) { - ret += " in function "; - ret += info.enclosing_symbol_name; - ret += ":"; - filename = info.source_file; - } - - if (!file_and_lineno.empty()) - ret += file_and_lineno; - else - { - if (!filename.empty()) - ret += filename; - ret += "("; - ret += this->object->section_name(this->data_shndx); - char buf[100]; - // Offsets into sections have to be positive. - snprintf(buf, sizeof(buf), "+0x%lx", static_cast(offset)); + if (!info.source_file.empty()) + { + ret += ":"; + ret += info.source_file; + } + size_t len = info.enclosing_symbol_name.length() + 100; + char* buf = new char[len]; + snprintf(buf, len, _(":function %s"), + info.enclosing_symbol_name.c_str()); ret += buf; - ret += ")"; + delete[] buf; + return ret; } + + ret += "("; + ret += this->object->section_name(this->data_shndx); + char buf[100]; + snprintf(buf, sizeof buf, "+0x%lx)", static_cast(offset)); + ret += buf; return ret; } diff --git a/gold/testsuite/debug_msg.sh b/gold/testsuite/debug_msg.sh index 0c89124f0e0..9a6f2d58284 100755 --- a/gold/testsuite/debug_msg.sh +++ b/gold/testsuite/debug_msg.sh @@ -2,7 +2,7 @@ # debug_msg.sh -- a test case for printing debug info for missing symbols. -# Copyright 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # Written by Ian Lance Taylor . # This file is part of gold. @@ -55,21 +55,21 @@ check_missing() # We don't know how the compiler might order these variables, so we # can't test for the actual offset from .data, hence the regexp. -check debug_msg.err "debug_msg.o: in function fn_array:debug_msg.cc(.data+0x[0-9a-fA-F]*): error: undefined reference to 'undef_fn1()'" -check debug_msg.err "debug_msg.o: in function fn_array:debug_msg.cc(.data+0x[0-9a-fA-F]*): error: undefined reference to 'undef_fn2()'" -check debug_msg.err "debug_msg.o: in function badref1:debug_msg.cc(.data+0x[0-9a-fA-F]*): error: undefined reference to 'undef_int'" +check debug_msg.err "debug_msg.o:debug_msg.cc:function fn_array: error: undefined reference to 'undef_fn1()'" +check debug_msg.err "debug_msg.o:debug_msg.cc:function fn_array: error: undefined reference to 'undef_fn2()'" +check debug_msg.err "debug_msg.o:debug_msg.cc:function badref1: error: undefined reference to 'undef_int'" # These tests check only for the source file's file name (not the complete # path) because use of -fdebug-prefix-map may change the path to the source # file recorded in the objects. -check debug_msg.err "debug_msg.o: in function Base::virtfn():.*/debug_msg.cc:50: error: undefined reference to 'undef_fn1()'" -check debug_msg.err "debug_msg.o: in function Derived::virtfn():.*/debug_msg.cc:55: error: undefined reference to 'undef_fn2()'" -check debug_msg.err "debug_msg.o: in function int testfn(int):.*/debug_msg.cc:43: error: undefined reference to 'undef_fn1()'" -check debug_msg.err "debug_msg.o: in function int testfn(int):.*/debug_msg.cc:44: error: undefined reference to 'undef_fn2()'" -check debug_msg.err "debug_msg.o: in function int testfn(int):.*/debug_msg.cc:.*: error: undefined reference to 'undef_int'" -check debug_msg.err "debug_msg.o: in function int testfn(double):.*/debug_msg.cc:43: error: undefined reference to 'undef_fn1()'" -check debug_msg.err "debug_msg.o: in function int testfn(double):.*/debug_msg.cc:44: error: undefined reference to 'undef_fn2()'" -check debug_msg.err "debug_msg.o: in function int testfn(double):.*/debug_msg.cc:.*: error: undefined reference to 'undef_int'" +check debug_msg.err ".*/debug_msg.cc:50: error: undefined reference to 'undef_fn1()'" +check debug_msg.err ".*/debug_msg.cc:55: error: undefined reference to 'undef_fn2()'" +check debug_msg.err ".*/debug_msg.cc:43: error: undefined reference to 'undef_fn1()'" +check debug_msg.err ".*/debug_msg.cc:44: error: undefined reference to 'undef_fn2()'" +check debug_msg.err ".*/debug_msg.cc:.*: error: undefined reference to 'undef_int'" +check debug_msg.err ".*/debug_msg.cc:43: error: undefined reference to 'undef_fn1()'" +check debug_msg.err ".*/debug_msg.cc:44: error: undefined reference to 'undef_fn2()'" +check debug_msg.err ".*/debug_msg.cc:.*: error: undefined reference to 'undef_int'" # Check we detected the ODR (One Definition Rule) violation. check debug_msg.err ": symbol 'Ordering::operator()(int, int)' defined in multiple places (possible ODR violation):" -- 2.30.2