#   Copyright (C) 1997-2021 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 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 GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# Prune messages from gcc that aren't useful.

load_lib multiline.exp

# Add options to TEST_ALWAYS_FLAGS so that diagnostics have the expected output
# format.  Note: You should not normally need to add more options here.  If you
# have made a change to the default diagnostic output format and are wanting to
# undo that in the testsuite here, then please update the handling of
# -fdiagnostics-plain-output in opts-common.c instead.

if ![info exists TEST_ALWAYS_FLAGS] {
    set TEST_ALWAYS_FLAGS ""
}
set TEST_ALWAYS_FLAGS "-fdiagnostics-plain-output $TEST_ALWAYS_FLAGS"

proc prune_gcc_output { text } {
    global srcdir

    #send_user "Before:$text\n"

    # Handle any freeform regexps.
    set text [handle-dg-regexps $text]

    # Remove Windows .exe suffix
    regsub -all "(as|cc1|cc1plus|collect2|f951|ld|lto-wrapper)\.exe?:" $text {\1:} text

    regsub -all "(^|\n)(\[^\n\]*: \[iI\]|I)n ((static member |lambda )?function|member|method|(copy )?constructor|destructor|instantiation|substitution|program|subroutine|block-data)\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*(: )?At (top level|global scope):\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*:   (recursively )?required \[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*:   . skipping \[0-9\]* instantiation contexts \[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*:   in .constexpr. expansion \[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*:   in requirements \[^\n\]*" $text "" text
    regsub -all "(^|\n)    inlined from \[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*: error: ld returned \[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*: 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

    # Diagnostic inclusion stack
    regsub -all "(^|\n)(In file)?\[ \]+included from \[^\n\]*" $text "" text
    regsub -all "(^|\n)\[ \]+from \[^\n\]*" $text "" text
    regsub -all "(^|\n)(In|of) module( \[^\n \]*,)? imported at \[^\n\]*" $text "" text

    global prune_notes
    if { $prune_notes } {
	# Ignore informational notes.
	regsub -all "(^|\n)\[^\n\]*: note: \[^\n\]*" $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

    # Ignore harmless VTA note.
    regsub -all "(^|\n)\[^\n\]*: note: variable tracking size limit exceeded with -fvar-tracking-assignments, retrying without\[^\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

    # Ignore harmless warnings from Xcode 3.2.x.
    regsub -all "(^|\n)\[^\n\]*ld: warning: can't add line info to anonymous symbol\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*warning: DWARFDebugInfoEntry::AppendDependants\[^\n\]*AT_\[^\n\]*FORM_ref4\[^\n\]*" $text "" text
    regsub -all "(^|\n)\[^\n\]*warning:\[^\n\]*TAG_variable:  AT_location\[^\n\]*didn't have valid function low pc\[^\n\]*" $text "" text

    # Ignore harmless warnings from Xcode 4.0.
    regsub -all "(^|\n)\[^\n\]*ld: warning: could not create compact unwind for\[^\n\]*" $text "" text

    # Ignore dsymutil warning (tool bug is actually linker)
    regsub -all "(^|\n)\[^\n\]*could not find object file symbol for symbol\[^\n\]*" $text "" text

    # Ignore stabs obsoletion warnings
    regsub -all "(^|\n)\[^\n\]*\[Ww\]arning: STABS debugging information is obsolete and not supported anymore\[^\n\]*" $text "" text

    # If dg-enable-nn-line-numbers was provided, then obscure source-margin
    # line numbers by converting them to "NN" form.
    set text [maybe-handle-nn-line-numbers $text]
    
    # Call into multiline.exp to handle any multiline output directives.
    set text [handle-multiline-outputs $text]

    #send_user "After:$text\n"

    return $text
}

# escape metacharacters in literal string, so it can be used in regex

proc escape_regex_chars { line } {
    return [string map {"^" "\\^"
			"$" "\\$"
			"(" "\\("
			")" "\\)"
			"[" "\\["
			"]" "\\]"
			"{" "\\{"
			"}" "\\}"
			"." "\\."
			"\\" "\\\\"
			"?" "\\?"
			"+" "\\+"
			"*" "\\*"
			"|" "\\|"} $line]
}

proc prune_file_path { text } {
    global srcdir

    set safedir [escape_regex_chars $srcdir]
    regsub -all "$safedir\/" $text "" text

    # Truncate absolute file path into relative path.
    set topdir "[file dirname [file dirname [file dirname $safedir]]]"
    regsub -all "$topdir\/" $text "" text

    return $text
}

# Prune internal compiler error messages, including the "Please submit..."
# footnote.

proc prune_ices { text } {
  regsub -all "(^|\n)\[^\n\]*: internal compiler error:.*\nSee \[^\n\]*" $text "" text
  regsub -all "(^|\n|')*Internal compiler error:.*\nSee \[^\n\]*" $text "" text
  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
    }
}
