# Copyright 2004-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 this program.  If not, see <http://www.gnu.org/licenses/>.

load_lib libgloss.exp

# FIXME:brobecker/2004-03-31:
# The following functions should eventually be part of dejagnu. Even after
# these functions becomes available in dejagnu, we will keep for a while
# a copy here in order to avoid increasing the dejagnu version
# requirement.

proc gdb_find_gnatmake {} {
    global tool_root_dir

    set root "$tool_root_dir/gcc"
    set GM ""

    if ![is_remote host] {
        set file [lookfor_file $root gnatmake]
        if { $file != "" } {
            set GM "$file -I$root/ada/rts --GCC=$root/xgcc --GNATBIND=$root/gnatbind --GNATLINK=$root/gnatlink -cargs -B$root -largs --GCC=$root/xgcc -margs";
        }   
    }

    if {$GM == ""} {
        set GM [transform gnatmake]
    }

    return $GM
}   

proc gdb_find_gdc {} {
    global tool_root_dir
    print "Tool Root: $tool_root_dir"

    if {![is_remote host]} {
	set file [lookfor_file $tool_root_dir gdc]
	if { $file == "" } {
	    set file [lookfor_file $tool_root_dir gcc/gdc]
	}
	if { $file != "" } {
	    set CC "$file -B[file dirname $file]/"
	} else {
	    set CC [transform gdc]
	}
    } else {
	set CC [transform gdc]
    }
    print "CC: $CC"
    return $CC
}

proc gdb_find_gfortran {} {
    global tool_root_dir

    if {![is_remote host]} {
	set file [lookfor_file $tool_root_dir gfortran]
	if { $file == "" } {
	    set file [lookfor_file $tool_root_dir gcc/gfortran]
	}
	if { $file != "" } {
	    set CC "$file -B[file dirname $file]/"
	} else {
	    set CC [transform gfortran]
	}
    } else {
	set CC [transform gfortran]
    }
    return $CC
}

proc gdb_find_go {} {
    global tool_root_dir

    set GO ""

    if {![is_remote host]} {
	set file [lookfor_file $tool_root_dir gccgo]
	if { $file != "" } {
	    set root [file dirname $file]
	    set GO "$file -B$root/gcc/"
	}
    }

    if { $GO == "" } {
	set GO [transform gccgo]
    }

    return $GO
}

proc gdb_find_go_linker {} {
    return [find_go]
}

proc gdb_find_rustc {} {
    global tool_root_dir
    if {![is_remote host]} {
	set rustc [lookfor_file $tool_root_dir rustc]
	if {$rustc == ""} {
	    set rustc rustc
	}
    } else {
	set rustc ""
    }
    if {$rustc != ""} {
	append rustc " --color never"
    }
    return $rustc
}

proc gdb_find_ldd {} {
    global LDD_FOR_TARGET
    if [info exists LDD_FOR_TARGET] {
	set ldd $LDD_FOR_TARGET
    } else {
	set ldd "ldd"
    }
    return $ldd
}

proc gdb_find_objcopy {} {
    global OBJCOPY_FOR_TARGET
    if [info exists OBJCOPY_FOR_TARGET] {
	set objcopy $OBJCOPY_FOR_TARGET
    } else {
	set objcopy [transform objcopy]
    }
    return $objcopy
}

# find target objdump
proc gdb_find_objdump {} {
    global OBJDUMP_FOR_TARGET
    if [info exists OBJDUMP_FOR_TARGET] {
	set objdump $OBJDUMP_FOR_TARGET
    } else {
	set objdump [transform objdump]
    }
    return $objdump
}

proc gdb_find_readelf {} {
    global READELF_FOR_TARGET
    if [info exists READELF_FOR_TARGET] {
	set readelf $READELF_FOR_TARGET
    } else {
	set readelf [transform readelf]
    }
    return $readelf
}

proc gdb_find_eu-unstrip {} {
    global EU_UNSTRIP_FOR_TARGET
    if [info exists EU_UNSTRIP_FOR_TARGET] {
	set eu_unstrip $EU_UNSTRIP_FOR_TARGET
    } else {
	set eu_unstrip [transform eu-unstrip]
    }
    return $eu_unstrip
}

# Local version of default_target_compile, to be used for languages that
# dejagnu's default_target_compile doesn't support.
proc gdb_default_target_compile_1 {source destfile type options} {
    global target_triplet
    global tool_root_dir
    global CFLAGS_FOR_TARGET
    global compiler_flags

    if { $destfile == "" && $type != "preprocess" && $type != "none" } {
	error "Must supply an output filename for the compile to default_target_compile"
    }

    set early_flags ""
    set add_flags ""
    set libs ""
    set compiler_type "c"
    set compiler ""
    set linker ""
    # linker_opts_order is one of "sources-then-flags", "flags-then-sources".
    # The order matters for things like -Wl,--as-needed.  The default is to
    # preserve existing behavior.
    set linker_opts_order "sources-then-flags"
    set ldflags ""
    set dest [target_info name]

    if {[info exists CFLAGS_FOR_TARGET]} {
	append add_flags " $CFLAGS_FOR_TARGET"
    }

    if {[info exists target_info(host,name)]} {
	set host [host_info name]
    } else {
	set host "unix"
    }

    foreach i $options {

	if { $i == "ada" } {
	    set compiler_type "ada"
	    if {[board_info $dest exists adaflags]} {
		append add_flags " [target_info adaflags]"
	    }
	    if {[board_info $dest exists gnatmake]} {
		set compiler [target_info gnatmake]
	    } else {
		set compiler [find_gnatmake]
	    }
	}

	if { $i == "c++" } {
	    set compiler_type "c++"
	    if {[board_info $dest exists cxxflags]} {
		append add_flags " [target_info cxxflags]"
	    }
	    append add_flags " [g++_include_flags]"
	    if {[board_info $dest exists c++compiler]} {
		set compiler [target_info c++compiler]
	    } else {
		set compiler [find_g++]
	    }
	}

	if { $i == "d" } {
	    set compiler_type "d"
	    if {[board_info $dest exists dflags]} {
		append add_flags " [target_info dflags]"
	    }
	    if {[board_info $dest exists dcompiler]} {
		set compiler [target_info dcompiler]
	    } else {
		set compiler [find_gdc]
	    }
	}

	if { $i == "f77" } {
	    set compiler_type "f77"
	    if {[board_info $dest exists f77flags]} {
		append add_flags " [target_info f77flags]"
	    }
	    if {[board_info $dest exists f77compiler]} {
		set compiler [target_info f77compiler]
	    } else {
		set compiler [find_g77]
	    }
	}

	if { $i == "f90" } {
	    set compiler_type "f90"
	    if {[board_info $dest exists f90flags]} {
		append add_flags " [target_info f90flags]"
	    }
	    if {[board_info $dest exists f90compiler]} {
		set compiler [target_info f90compiler]
	    } else {
		set compiler [find_gfortran]
	    }
	}

	if { $i == "go" } {
	    set compiler_type "go"
	    if {[board_info $dest exists goflags]} {
		append add_flags " [target_info goflags]"
	    }
	    if {[board_info $dest exists gocompiler]} {
		set compiler [target_info gocompiler]
	    } else {
		set compiler [find_go]
	    }
	    if {[board_info $dest exists golinker]} {
		set linker [target_info golinker]
	    } else {
		set linker [find_go_linker]
	    }
	    if {[board_info $dest exists golinker_opts_order]} {
		set linker_opts_order [target_info golinker_opts_order]
	    }
	}

	if { $i == "rust" } {
	    set compiler_type "rust"
	    if {[board_info $dest exists rustflags]} {
		append add_flags " [target_info rustflags]"
	    }
	    if {[board_info $dest exists rustflags]} {
		set compiler [target_info rustflags]
	    } else {
		set compiler [find_rustc]
	    }
	}

	if {[regexp "^dest=" $i]} {
	    regsub "^dest=" $i "" tmp
	    if {[board_info $tmp exists name]} {
		set dest [board_info $tmp name]
	    } else {
		set dest $tmp
	    }
	}
	if {[regexp "^compiler=" $i]} {
	    regsub "^compiler=" $i "" tmp
	    set compiler $tmp
	}
	if {[regexp "^early_flags=" $i]} {
	    regsub "^early_flags=" $i "" tmp
	    append early_flags " $tmp"
	}
	if {[regexp "^additional_flags=" $i]} {
	    regsub "^additional_flags=" $i "" tmp
	    append add_flags " $tmp"
	}
	if {[regexp "^ldflags=" $i]} {
	    regsub "^ldflags=" $i "" tmp
	    append ldflags " $tmp"
	}
	if {[regexp "^libs=" $i]} {
	    regsub "^libs=" $i "" tmp
	    append libs " $tmp"
	}
	if {[regexp "^incdir=" $i]} {
	    regsub "^incdir=" $i "-I" tmp
	    append add_flags " $tmp"
	}
	if {[regexp "^libdir=" $i]} {
	    regsub "^libdir=" $i "-L" tmp
	    append add_flags " $tmp"
	}
	if {[regexp "^ldscript=" $i]} {
	    regsub "^ldscript=" $i "" ldscript
	}
	if {[regexp "^redirect=" $i]} {
	    regsub "^redirect=" $i "" redirect
	}
	if {[regexp "^optimize=" $i]} {
	    regsub "^optimize=" $i "" optimize
	}
	if {[regexp "^timeout=" $i]} {
	    regsub "^timeout=" $i "" timeout
	}
    }

    if {[board_info $host exists cflags_for_target]} {
	append add_flags " [board_info $host cflags_for_target]"
    }

    global CC_FOR_TARGET
    global CXX_FOR_TARGET
    global D_FOR_TARGET
    global F77_FOR_TARGET
    global F90_FOR_TARGET
    global GNATMAKE_FOR_TARGET
    global GO_FOR_TARGET
    global GO_LD_FOR_TARGET
    global RUSTC_FOR_TARGET

    if {[info exists GNATMAKE_FOR_TARGET]} {
	if { $compiler_type == "ada" } {
	    set compiler $GNATMAKE_FOR_TARGET
	}
    }

    if {[info exists CC_FOR_TARGET]} {
	if { $compiler == "" } {
	    set compiler $CC_FOR_TARGET
	}
    }

    if {[info exists CXX_FOR_TARGET]} {
	if { $compiler_type == "c++" } {
	    set compiler $CXX_FOR_TARGET
	}
    }

    if {[info exists D_FOR_TARGET]} {
	if { $compiler_type == "d" } {
	    set compiler $D_FOR_TARGET
	}
    }

    if {[info exists F77_FOR_TARGET]} {
	if { $compiler_type == "f77" } {
	    set compiler $F77_FOR_TARGET
	}
    }

    if {[info exists F90_FOR_TARGET]} {
	if { $compiler_type == "f90" } {
	    set compiler $F90_FOR_TARGET
	}
    }

    if { $compiler_type == "go" } {
	if {[info exists GO_FOR_TARGET]} {
	    set compiler $GO_FOR_TARGET
	}
	if {[info exists GO_LD_FOR_TARGET]} {
	    set linker $GO_LD_FOR_TARGET
	}
    }

    if {[info exists RUSTC_FOR_TARGET]} {
	if {$compiler_type == "rust"} {
	    set compiler $RUSTC_FOR_TARGET
	}
    }

    if { $type == "executable" && $linker != "" } {
	set compiler $linker
    }

    if { $compiler == "" } {
	set compiler [board_info $dest compiler]
	if { $compiler == "" } {
	    return "default_target_compile: No compiler to compile with"
	}
    }

    if {![is_remote host]} {
	if { [which $compiler] == 0 } {
	    return "default_target_compile: Can't find $compiler."
	}
    }

    if {$type == "object"} {
	if {$compiler_type == "rust"} {
	    append add_flags "--emit obj"
	} else {
	    append add_flags " -c"
	}
    }

    if { $type == "preprocess" } {
	append add_flags " -E"
    }

    if { $type == "assembly" } {
	append add_flags " -S"
    }

    if {[board_info $dest exists cflags]} {
	append add_flags " [board_info $dest cflags]"
    }

    if { $type == "executable" } {
	if {[board_info $dest exists ldflags]} {
	    append add_flags " [board_info $dest ldflags]"
	}
	if { $compiler_type == "c++" } {
	    append add_flags " [g++_link_flags]"
	}
	if {[isnative]} {
	    # This is a lose.
	    catch "glob -nocomplain $tool_root_dir/libstdc++/libstdc++.so* $tool_root_dir/libstdc++/libstdc++.sl" tmp
	    if { ${tmp} != "" } {
		if {[regexp ".*solaris2.*" $target_triplet]} {
		    # Solaris 2
		    append add_flags " -R$tool_root_dir/libstdc++"
		} elseif {[regexp ".*(osf|irix5|linux).*" $target_triplet]} {
		    # OSF/1 or IRIX 5
		    append add_flags " -Wl,-rpath,$tool_root_dir/libstdc++"
		}
	    }
	}
    }

    if {![info exists ldscript]} {
	set ldscript [board_info $dest ldscript]
    }

    foreach i $options {
	if { $i == "debug" } {
	    if {[board_info $dest exists debug_flags]} {
		append add_flags " [board_info $dest debug_flags]"
	    } else {
		append add_flags " -g"
	    }
	}
    }

    if {[info exists optimize]} {
	append add_flags " $optimize"
    }

    if { $type == "executable" } {
	append add_flags " $ldflags"
	foreach x $libs {
	    if {[file exists $x]} {
		append source " $x"
	    } else {
		append add_flags " $x"
	    }
	}

	if {[board_info $dest exists libs]} {
	    append add_flags " [board_info $dest libs]"
	}

	# This probably isn't such a good idea, but it avoids nasty
	# hackiness in the testsuites.
	# The math library must be linked in before the C library.  The C
	# library is linked in by the linker script, so this must be before
	# the linker script.
	if {[board_info $dest exists mathlib]} {
	    append add_flags " [board_info $dest mathlib]"
	} else {
	    append add_flags " -lm"
	}

	# This must be added here.
	append add_flags " $ldscript"

	if {[board_info $dest exists remote_link]} {
	    # Relink option.
	    append add_flags " -Wl,-r"
	}
	if {[board_info $dest exists output_format]} {
	    append add_flags " -Wl,-oformat,[board_info $dest output_format]"
	}
    }

    if {[board_info $dest exists multilib_flags]} {
	append add_flags " [board_info $dest multilib_flags]"
    }

    verbose "doing compile"

    set sources ""
    if {[is_remote host]} {
	foreach x $source {
	    set file [remote_download host $x]
	    if { $file == "" } {
		warning "Unable to download $x to host."
		return "Unable to download $x to host."
	    } else {
		append sources " $file"
	    }
	}
    } else {
	set sources $source
    }

    if {[is_remote host]} {
	append add_flags " -o " [file tail $destfile]
	remote_file host delete [file tail $destfile]
    } else {
	if { $destfile != "" } {
	    append add_flags " -o $destfile"
	}
    }

    # This is obscure: we put SOURCES at the end when building an
    # object, because otherwise, in some situations, libtool will
    # become confused about the name of the actual source file.
    switch $type {
	"object" {
	    set opts "$early_flags $add_flags $sources"
	}
	"executable" {
	    switch $linker_opts_order {
		"flags-then-sources" {
		    set opts "$early_flags $add_flags $sources"
		}
		"sources-then-flags" {
		    set opts "$early_flags $sources $add_flags"
		}
		default {
		    error "Invalid value for board_info linker_opts_order"
		}
	    }
	}
	default {
	    set opts "$early_flags $sources $add_flags"
	}
    }

    if {[is_remote host]} {
	if {[host_info exists use_at]} {
	    set fid [open "atfile" "w"]
	    puts $fid "$opts"
	    close $fid
	    set opts "@[remote_download host atfile]"
	    remote_file build delete atfile
	}
    }

    verbose "Invoking the compiler as $compiler $opts" 2

    if {[info exists redirect]} {
	verbose "Redirecting output to $redirect" 2
	set status [remote_exec host "$compiler $opts" "" "" $redirect]
    } else {
	if {[info exists timeout]} {
	    verbose "Setting timeout to $timeout" 2
	    set status [remote_exec host "$compiler $opts" "" "" "" $timeout]
	} else {
	    set status [remote_exec host "$compiler $opts"]
	}
    }

    set compiler_flags $opts
    if {[is_remote host]} {
	remote_upload host [file tail $destfile] $destfile
	remote_file host delete [file tail $destfile]
    }
    set comp_output [prune_warnings [lindex $status 1]]
    regsub "^\[\r\n\]+" $comp_output "" comp_output
    if { [lindex $status 0] != 0 } {
	verbose -log "compiler exited with status [lindex $status 0]"
    }
    if { [lindex $status 1] != "" } {
	verbose -log "output is:\n[lindex $status 1]" 2
    }
    if { [lindex $status 0] != 0 && "${comp_output}" == "" } {
	set comp_output "exit status is [lindex $status 0]"
    }
    return ${comp_output}
}

# If dejagnu's default_target_compile supports the language specified in
# OPTIONS, use it.  Otherwise, use gdb_default_target_compile_1.
proc gdb_default_target_compile {source destfile type options} {
    global use_gdb_compile

    set need_local_lang 0
    set need_local_early_flags 0
    foreach i $options {

	if { $i == "ada" || $i == "d" || $i == "go" || $i == "rust" } {
	    set need_local_lang [info exists use_gdb_compile($i)]
	}

	if { $i == "c++" } {
	    set need_local_lang 0
	}

	if { $i == "f77" || $i == "f90" } {
	    set need_local_lang [info exists use_gdb_compile(fortran)]
	}

	if { [regexp "^early_flags=" $i] } {
	    set need_local_early_flags 1
	}
    }

    if { $need_local_lang || $need_local_early_flags } {
	return [gdb_default_target_compile_1 $source $destfile $type $options]
    }

    return [dejagnu_default_target_compile $source $destfile $type $options]
}

# Array of languages for which dejagnu's default_target_compile is missing
# support.
array set use_gdb_compile [list]

# Note missing support in dejagnu's default_target_compile.  This
# needs to be fixed by porting the missing support to Dejagnu.
set note_prefix "Dejagnu's default_target_compile is missing support for "
set note_suffix ", using local override"

if {[info procs find_gnatmake] == ""} {
    rename gdb_find_gnatmake find_gnatmake
    set use_gdb_compile(ada) 1
    gdb_note [join [list $note_prefix "Ada" $note_suffix] ""]
}

if {[info procs find_gfortran] == ""} {
    rename gdb_find_gfortran find_gfortran
    set use_gdb_compile(fortran) 1
    gdb_note [join [list $note_prefix "Fortran" $note_suffix] ""]
}

if {[info procs find_go_linker] == ""} {
    rename gdb_find_go find_go
    rename gdb_find_go_linker find_go_linker
    set use_gdb_compile(go) 1
    gdb_note [join [list $note_prefix "Go" $note_suffix] ""]
}

if {[info procs find_gdc] == ""} {
    rename gdb_find_gdc find_gdc
    set use_gdb_compile(d) 1
    gdb_note [join [list $note_prefix "D" $note_suffix] ""]
}

if {[info procs find_rustc] == ""} {
    rename gdb_find_rustc find_rustc
    set use_gdb_compile(rust) 1
    gdb_note [join [list $note_prefix "Rust" $note_suffix] ""]
}

# If dejagnu's default_target_compile is missing support for any language,
# override it.
if { [array size use_gdb_compile] != 0 } {
    catch {rename default_target_compile dejagnu_default_target_compile}
    rename gdb_default_target_compile default_target_compile
}


# Provide 'lreverse' missing in Tcl before 7.5.

if {[info procs lreverse] == ""} {
    proc lreverse { arg } {
	set retval {}
	while { [llength $retval] < [llength $arg] } {
	    lappend retval [lindex $arg end-[llength $retval]]
	}
	return $retval
    }
}

# Various ccache versions provide incorrect debug info such as ignoring
# different current directory, breaking GDB testsuite.
set env(CCACHE_DISABLE) 1
unset -nocomplain env(CCACHE_NODISABLE)
