#   Copyright (C) 1999 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 2 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# gcc-bugs@gcc.gnu.org

# 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 target_triplet
    global tool

    if [info exists gcc_target_object_format_saved] {
        verbose "gcc_target_object_format returning saved $gcc_target_object_format_saved" 2
    } elseif { [string match "*-*-darwin*" $target_triplet] } {
	# Darwin doesn't necessarily have objdump, so hand-code it.
	set gcc_target_object_format_saved mach-o
    } elseif { [string match "hppa*-*-hpux*" $target_triplet] } {
	# HP-UX doesn't necessarily have objdump, so hand-code it.
	if { [string match "hppa*64*-*-hpux*" $target_triplet] } {
	  set gcc_target_object_format_saved elf
	} else {
	  set gcc_target_object_format_saved som
	}
    } 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       
        
	catch {
          set output [exec $objdump_name --file-headers objfmtst.o ]
        } output

        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
}
