#   Copyright (C) 1997, 1999, 2000, 2002, 2004 Free Software Foundation, Inc.

# 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 2 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.  

# Prune messages from gcc that aren't useful.

proc prune_gcc_output { text } {
    #send_user "Before:$text\n"

    regsub -all "(^|\n)\[^\n\]*: In ((static member )?function|member|method|(copy )?constructor|destructor|instantiation|program|subroutine|block-data) \[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*: At (top level|global scope):\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*:   instantiated from \[^\n\]*" $text "" text
    regsub -all "(^|\n)collect2: ld returned \[^\n\]*" $text "" text
    regsub -all "(^|\n)collect: re(compiling|linking)\[^\n\]*" $text "" text
    regsub -all "(^|\n)Please submit.*instructions\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[0-9\]\[0-9\]* errors\." $text "" text

    # Ignore harmless -fpic warnings.
    regsub -all "(^|\n)\[^\n\]*: warning: -f(pic|PIC) ignored for target\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*: warning: -f(pic|PIC)( and -fpic are| is)? not supported\[^\n\]*" $text "" text

    # Ignore errata warning from IA64 assembler.
    regsub -all "(^|\n)\[^\n\]*: Additional NOP may be necessary to workaround Itanium processor A/B step errata" $text "" text
    regsub -all "(^|\n)\[^\n*\]*: Assembler messages:\[^\n\]*" $text "" text

    # It would be nice to avoid passing anything to gcc that would cause it to
    # issue these messages (since ignoring them seems like a hack on our part),
    # but that's too difficult in the general case.  For example, sometimes
    # you need to use -B to point gcc at crt0.o, but there are some targets
    # that don't have crt0.o.
    regsub -all "(^|\n)\[^\n\]*file path prefix \[^\n\]* never used" $text "" text
    regsub -all "(^|\n)\[^\n\]*linker input file unused since linking not done" $text "" text

    # efriedma: clang-specific ignore lines:
    regsub -all "(^|\n)\[^\n\]*: note: \[^\n\]*declared here\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*: note: \[^\n\]*required here\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*: note: \[^\n\]*requested here\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*: note: \[^\n\]*attempt to specialize declaration here\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*: note: expanded from macro\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*: note: \[^\n\]*forward declaration of\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*: note: \[^\n\]*candidate template ignored\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*: note: \[^\n\]*previous definition is here\[^\n\]*" $text "" text

    #send_user "After:$text\n"

    return $text
}

# Provide a definition of this if missing (delete after next dejagnu release).

if { [info procs prune_warnings] == "" } then {
    proc prune_warnings { text } {
	return $text
    }
}
