# Copyright 2007-2026 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

set pascal_init_done 0

# This procedure looks for a suitable pascal compiler
# For now only GNU pascal compiler and Free Pascal compiler
# are searched.
# First, environment variable GPC is checked
# if present, GPC compiler is assumed to be the value of
# that environment variable.
# Second, environment variable FPC is checked
# if present, Free Pascal compiler is assumed to be the value of
# that environment variable.
# Third, gpc executable is searched using `which gpc`
# Lastly, fpc executable is searched using `which fpc`
# Using environment variable allows to force
# which compiler is used in testsuite

proc pascal_init {} {
    global pascal_init_done
    gdb_persistent_global pascal_compiler_is_gpc
    gdb_persistent_global pascal_compiler_is_fpc
    gdb_persistent_global gpc_compiler
    gdb_persistent_global fpc_compiler
    global env

    if { $pascal_init_done == 1 } {
	return
    }

    set pascal_compiler_is_gpc 0
    set pascal_compiler_is_fpc 0
    set gpc_compiler [transform gpc]
    set fpc_compiler [transform fpc]

    if {![is_remote host]} {
	if { [info exists env(GPC)] } {
	    set pascal_compiler_is_gpc 1
	    set gpc_compiler $env(GPC)
	    verbose -log "Assuming GNU Pascal ($gpc_compiler)"
	} elseif { [info exists env(FPC)] } {
	    set pascal_compiler_is_fpc 1
	    set fpc_compiler $env(FPC)
	    verbose -log "Assuming Free Pascal ($fpc_compiler)"
	} elseif { [which $gpc_compiler] != 0 } {
	    set pascal_compiler_is_gpc 1
	    verbose -log "GNU Pascal compiler found"
	} elseif { [which $fpc_compiler] != 0 } {
	    set pascal_compiler_is_fpc 1
	    verbose -log "Free Pascal compiler found"
	}
    }
    set pascal_init_done 1
}

proc gpc_compile {source destfile type options} {
    global gpc_compiler
    set add_flags ""
    set dest [target_info name]

    if {$type == "object"} {
	append add_flags " -c"
    }

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

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

    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 { $i == "class" } {
	    if {[board_info $dest exists pascal_class_flags]} {
		append add_flags " [board_info $dest pascal_class_flags]"
	    } else {
		append add_flags " --extended-syntax"
	    }
	}
    }

    set result [remote_exec host $gpc_compiler "-o $destfile --automake $add_flags $source"]
    return $result
}

proc fpc_compile {source destfile type options} {
    global fpc_compiler
    set add_flags ""
    set dest [target_info name]

    if {$type == "object"} {
	append add_flags " -Cn"
    }

    if { $type == "preprocess" } {
	return "Free Pascal can not preprocess"
    }

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

    foreach i $options {
	if { $i == "debug" } {
	    if {[board_info $dest exists debug_flags]} {
		append add_flags " [board_info $dest debug_flags]"
	    } else {
		# GDB no longer supports STABS, so force DWARF debug info.
		# Use v2 assuming support is more mature than later versions.
		append add_flags " -g -gw2"
	    }
	}
	if { $i == "class" } {
	    if {[board_info $dest exists pascal_class_flags]} {
		append add_flags " [board_info $dest pascal_class_flags]"
	    } else {
		append add_flags " -Mobjfpc"
	    }
	}
    }

    set result [remote_exec host $fpc_compiler "-o$destfile $add_flags $source"]
    return $result
}

proc gdb_compile_pascal {source destfile type options} {
    global pascal_init_done
    global pascal_compiler_is_gpc
    global pascal_compiler_is_fpc

    if { $pascal_init_done == 0 } {
	pascal_init
    }

    file delete $destfile

    if { $pascal_compiler_is_fpc == 1 } {
	set result [fpc_compile $source $destfile $type $options]
    } elseif { $pascal_compiler_is_gpc == 1 } {
	set result [gpc_compile $source $destfile $type $options]
    } else {
	unsupported "no pascal compiler found"
	return "No pascal compiler. Compilation failed."
    }

    if {![file exists $destfile]} {
	unsupported "Pascal compilation failed: $result"
	return "Pascal compilation failed."
    }
}

# Auxiliary function to set the language to pascal.
# The result is 1 (true) for success, 0 (false) for failure.

proc set_lang_pascal {} {
    if {[gdb_test_no_output "set language pascal"]} {
	return 0
    }
    if {[gdb_test "show language" \
	     [string_to_regexp {The current source language is "pascal".}] \
	     {set language to "pascal"}]} {
	return 0
    }
    return 1
}
