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

# Please report any bugs, comments, and/or additions to this file according
# to instructions at https://gcc.gnu.org/bugs/

# This file defines a proc for determining the file format in use by the
# target.  This is useful for tests that are only supported by certain file
# formats.  This procedure is defined in a separate file so that it can be
# included by other expect library files.

proc gcc_target_object_format { } {
    global gcc_target_object_format_saved
    global tool

    if [info exists gcc_target_object_format_saved] {
        verbose "gcc_target_object_format returning saved $gcc_target_object_format_saved" 2
    } elseif { [istarget *-*-darwin*] } {
	# Darwin doesn't necessarily have objdump, so hand-code it.
	set gcc_target_object_format_saved mach-o
    } elseif { [istarget hppa*-*-hpux*] } {
	# HP-UX doesn't necessarily have objdump, so hand-code it.
	if { [istarget hppa*64*-*-hpux*] } {
	  set gcc_target_object_format_saved elf
	} else {
	  set gcc_target_object_format_saved som
	}
    } elseif { [istarget *-*-aix*] } {
	# AIX doesn't necessarily have objdump, so hand-code it.
	set gcc_target_object_format_saved coff
    } elseif { [istarget *-*-solaris*] } {
	# Solaris doesn't necessarily have objdump, so hand-code it.
	set gcc_target_object_format_saved elf
    } elseif { [istarget *-*-amdhsa*] } {
	# AMD GCN uses LLVM objdump which is not CLI-compatible
	set gcc_target_object_format_saved elf
    } else {
        set objdump_name [find_binutils_prog objdump]
        set open_file [open objfmtst.c w]
        puts $open_file "void foo(void) { }"
        close $open_file
        
        ${tool}_target_compile objfmtst.c objfmtst.o object ""
	file delete objfmtst.c       
        
	set output [remote_exec host "$objdump_name" "--file-headers objfmtst.o"]
	set output [lindex $output 1]

        file delete objfmtst.o
        
        if ![ regexp "file format (.*)arch" $output dummy objformat ]  {
            verbose "Could not parse objdump output" 2
            set gcc_target_object_format_saved unknown
        } else {
            switch -regexp $objformat {
                elf          {
                    set gcc_target_object_format_saved elf
                } 
                ecoff        {
                    set gcc_target_object_format_saved ecoff
                }
                coff         {
                    set gcc_target_object_format_saved coff
                }
                a\.out       {
                    set gcc_target_object_format_saved a.out
                }
                pe       {
                    set gcc_target_object_format_saved pe
                }
                som          {
                    set gcc_target_object_format_saved som
                } 
                default      {
                    verbose "Unknown file format: $objformat" 3
                    set gcc_target_object_format_saved unknown
                }
            }
	    
            verbose "gcc_target_object_format returning $gcc_target_object_format_saved" 2
        }
    }

    return $gcc_target_object_format_saved
}
