# Copyright 2007-2013 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
    global pascal_compiler_is_gpc
    global pascal_compiler_is_fpc
    global gpc_compiler
    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 dest type options} {
    global gpc_compiler
    set add_flags ""
    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"
	    }
	}
    }

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

proc fpc_compile {source dest type options} {
    global fpc_compiler
    set add_flags ""
    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 {
		append add_flags " -g"
	    }
	}
    }

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

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

    if { $pascal_init_done == 0 } { 
	pascal_init
    }

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

    if ![file exists $dest] {
        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" ".* source language is \"pascal\"." \
	   "set language to \"pascal\""] {
	return 0
    }
    return 1
}
