| Index: gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.exp
|
| diff --git a/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.exp b/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.exp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..575f10fcb044602a56b7966a7a2007cc99ebc6e5
|
| --- /dev/null
|
| +++ b/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.exp
|
| @@ -0,0 +1,427 @@
|
| +# Copyright 2012-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 dwarf.exp
|
| +
|
| +# This test can only be run on targets which support DWARF-2 and use gas.
|
| +if {![dwarf2_support]} {
|
| + return 0
|
| +}
|
| +
|
| +standard_testfile
|
| +set asmsrcfile [standard_output_file ${testfile}asm.S]
|
| +set asmobjfile [standard_output_file ${testfile}asm.o]
|
| +set srcabsdir [standard_output_file ${testfile}.d]
|
| +set srctmpfile tmp-${testfile}.c
|
| +
|
| +# $srcdir may be relative.
|
| +if {[file pathtype $srcabsdir] != "absolute"} {
|
| + untested "objdir pathtype is not absolute"
|
| + return -1
|
| +}
|
| +
|
| +set f [open $asmsrcfile "w"]
|
| +puts $f "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */"
|
| +
|
| +proc out_cu { name cu_dir cu_name line_dir line_name } {
|
| + global f
|
| +
|
| + puts -nonewline $f "\
|
| +.L${name}_begin:
|
| + .4byte .L${name}_end - .L${name}_start /* Length of Compilation Unit */
|
| +.L${name}_start:
|
| + .2byte 2 /* DWARF Version */
|
| + .4byte .Labbrev1_begin /* Offset into abbrev section */
|
| + .byte 4 /* Pointer size */
|
| +"
|
| + if { $cu_dir != "" } {
|
| + puts $f " .uleb128 ABBREV_COMP_DIR_NAME /* Abbrev: DW_TAG_compile_unit */"
|
| + } else {
|
| + puts $f " .uleb128 ABBREV_NAME /* Abbrev: DW_TAG_compile_unit */"
|
| + }
|
| + puts -nonewline $f "\
|
| + .ascii \"GNU C\\0\" /* DW_AT_producer */
|
| + .byte 2 /* DW_AT_language (DW_LANG_C) */
|
| + .4byte .Lline_${name}_begin /* DW_AT_stmt_list */
|
| + .4byte ${name}_start /* DW_AT_low_pc */
|
| + .4byte ${name}_end /* DW_AT_high_pc */
|
| +"
|
| + if { $cu_dir != "" } {
|
| + puts $f " .ascii $cu_dir /* DW_AT_comp_dir */"
|
| + }
|
| + puts -nonewline $f "\
|
| + .ascii $cu_name /* DW_AT_name */
|
| +
|
| + .uleb128 3 /* Abbrev: DW_TAG_subprogram */
|
| + .asciz \"${name}\" /* DW_AT_name */
|
| + .4byte ${name}_start /* DW_AT_low_pc */
|
| + .4byte ${name}_end /* DW_AT_high_pc */
|
| +
|
| + .byte 0 /* End of children of CU */
|
| +.L${name}_end:
|
| +"
|
| +}
|
| +
|
| +proc out_line { name cu_dir cu_name line_dir line_name } {
|
| + global f
|
| +
|
| + puts -nonewline $f "\
|
| +.Lline_${name}_begin:
|
| + .4byte .Lline_${name}_end - .Lline_${name}_start /* Initial length */
|
| +.Lline_${name}_start:
|
| + .2byte 2 /* Version */
|
| + .4byte .Lline_${name}_lines - .Lline_${name}_hdr /* header_length */
|
| +.Lline_${name}_hdr:
|
| + .byte 1 /* Minimum insn length */
|
| + .byte 1 /* default_is_stmt */
|
| + .byte 1 /* line_base */
|
| + .byte 1 /* line_range */
|
| + .byte 4 /* opcode_base */
|
| +
|
| + /* Standard lengths */
|
| + .byte 0
|
| + .byte 1
|
| + .byte 1
|
| +
|
| + /* Include directories */
|
| +"
|
| + if { $line_dir != "" } {
|
| + puts $f " .ascii $line_dir"
|
| + }
|
| + puts -nonewline $f "\
|
| + .byte 0
|
| +
|
| + /* File names */
|
| + .ascii $line_name
|
| +"
|
| + if { $line_dir != "" } {
|
| + puts $f " .uleb128 1"
|
| + } else {
|
| + puts $f " .uleb128 0"
|
| + }
|
| + puts -nonewline $f "\
|
| + .uleb128 0
|
| + .uleb128 0
|
| +
|
| + .byte 0
|
| +
|
| +.Lline_${name}_lines:
|
| + .byte 3 /* DW_LNS_advance_line */
|
| + .sleb128 998 /* ... to 999 */
|
| + .byte 0 /* DW_LNE_set_address */
|
| + .uleb128 5
|
| + .byte 2
|
| + .4byte ${name}_start
|
| + .byte 1 /* DW_LNS_copy */
|
| + .byte 3 /* DW_LNS_advance_line */
|
| + .sleb128 1 /* ... to 1000 */
|
| + .byte 0 /* DW_LNE_set_address */
|
| + .uleb128 5
|
| + .byte 2
|
| + .4byte ${name}_end
|
| + .byte 1 /* DW_LNS_copy */
|
| + .byte 0 /* DW_LNE_end_of_sequence */
|
| + .uleb128 1
|
| + .byte 1
|
| +.Lline_${name}_end:
|
| +"
|
| +}
|
| +
|
| +# IFSOME can be optionally _same or _different if >= 2 absolute directories are
|
| +# provided. Then in the _different case the overriden directories have invalid
|
| +# XDIR value.
|
| +
|
| +proc out_unit { func compdir ldir file ifsame } {
|
| + set name "compdir_${compdir}_ldir_${ldir}_file_${file}${ifsame}"
|
| +
|
| + if { $compdir == "missing_" } {
|
| + set cu_dir {}
|
| + } elseif { $compdir == "relative" } {
|
| + set cu_dir {COMPDIR "\0"}
|
| + } elseif { $compdir == "absolute" } {
|
| + set cu_dir {BDIR "/" COMPDIR "\0"}
|
| + } else {
|
| + error "compdir $compdir"
|
| + }
|
| +
|
| + if { $ldir == "missing_" } {
|
| + set line_dir {}
|
| + } elseif { $ldir == "relative" } {
|
| + set line_dir {LDIR "\0"}
|
| + } elseif { $ldir == "absolute" } {
|
| + set line_dir {BDIR "/" LDIR "\0"}
|
| + } else {
|
| + error "ldir $ldir"
|
| + }
|
| +
|
| + if { $file == "basename" } {
|
| + set cu_name {FILE "\0"}
|
| + } elseif { $file == "relative" } {
|
| + set cu_name {FDIR "/" FILE "\0"}
|
| + } elseif { $file == "absolute" } {
|
| + set cu_name {BDIR "/" FILE "\0"}
|
| + } else {
|
| + error "file $file"
|
| + }
|
| + set line_name $cu_name
|
| +
|
| + if { "$ifsame" == "_different" } {
|
| + if { $file == "absolute" } {
|
| + if { $ldir == "absolute" } {
|
| + set line_dir {XDIR "\0"}
|
| + }
|
| + if { $compdir == "absolute" } {
|
| + set cu_dir {XDIR "\0"}
|
| + }
|
| + } elseif { $ldir == "absolute" } {
|
| + if { $compdir == "absolute" } {
|
| + set cu_dir {XDIR "\0"}
|
| + }
|
| + } else {
|
| + error "not enough absolutes"
|
| + }
|
| + }
|
| +
|
| + $func $name $cu_dir $cu_name $line_dir $line_name
|
| +}
|
| +
|
| +proc out_diff { func compdir ldir file } {
|
| + set abscount 0
|
| + if { $compdir == "absolute" } {
|
| + incr abscount
|
| + }
|
| + if { $ldir == "absolute" } {
|
| + incr abscount
|
| + }
|
| + if { $file == "absolute" } {
|
| + incr abscount
|
| + }
|
| + if { $abscount <= 1 } {
|
| + out_unit $func $compdir $ldir $file ""
|
| + } else {
|
| + out_unit $func $compdir $ldir $file "_same"
|
| + out_unit $func $compdir $ldir $file "_different"
|
| + }
|
| +}
|
| +
|
| +proc out_file { func compdir ldir } {
|
| + out_diff $func $compdir $ldir "basename"
|
| + out_diff $func $compdir $ldir "relative"
|
| + out_diff $func $compdir $ldir "absolute"
|
| +}
|
| +
|
| +proc out_ldir { func compdir } {
|
| + out_file $func $compdir "missing_"
|
| + out_file $func $compdir "relative"
|
| + out_file $func $compdir "absolute"
|
| +}
|
| +
|
| +proc out_compdir { func } {
|
| + out_ldir $func "missing_"
|
| + out_ldir $func "relative"
|
| + out_ldir $func "absolute"
|
| +}
|
| +
|
| +puts -nonewline $f "\
|
| +#define ABBREV_NAME 1
|
| +#define ABBREV_COMP_DIR_NAME 2
|
| + .section .debug_info
|
| +"
|
| +out_compdir out_cu
|
| +
|
| +puts $f " .section .debug_line"
|
| +out_compdir out_line
|
| +
|
| +puts -nonewline $f "\
|
| + .section .debug_abbrev
|
| +.Labbrev1_begin:
|
| +
|
| + .uleb128 ABBREV_NAME /* Abbrev code */
|
| + .uleb128 0x11 /* DW_TAG_compile_unit */
|
| + .byte 1 /* has_children */
|
| + .uleb128 0x25 /* DW_AT_producer */
|
| + .uleb128 0x8 /* DW_FORM_string */
|
| + .uleb128 0x13 /* DW_AT_language */
|
| + .uleb128 0xb /* DW_FORM_data1 */
|
| + .uleb128 0x10 /* DW_AT_stmt_list */
|
| + .uleb128 0x6 /* DW_FORM_data4 */
|
| + .uleb128 0x11 /* DW_AT_low_pc */
|
| + .uleb128 0x1 /* DW_FORM_addr */
|
| + .uleb128 0x12 /* DW_AT_high_pc */
|
| + .uleb128 0x1 /* DW_FORM_addr */
|
| + .uleb128 0x3 /* DW_AT_name */
|
| + .uleb128 0x8 /* DW_FORM_string */
|
| + .byte 0x0 /* Terminator */
|
| + .byte 0x0 /* Terminator */
|
| +
|
| + .uleb128 ABBREV_COMP_DIR_NAME /* Abbrev code */
|
| + .uleb128 0x11 /* DW_TAG_compile_unit */
|
| + .byte 1 /* has_children */
|
| + .uleb128 0x25 /* DW_AT_producer */
|
| + .uleb128 0x8 /* DW_FORM_string */
|
| + .uleb128 0x13 /* DW_AT_language */
|
| + .uleb128 0xb /* DW_FORM_data1 */
|
| + .uleb128 0x10 /* DW_AT_stmt_list */
|
| + .uleb128 0x6 /* DW_FORM_data4 */
|
| + .uleb128 0x11 /* DW_AT_low_pc */
|
| + .uleb128 0x1 /* DW_FORM_addr */
|
| + .uleb128 0x12 /* DW_AT_high_pc */
|
| + .uleb128 0x1 /* DW_FORM_addr */
|
| + .uleb128 0x1b /* DW_AT_comp_dir */
|
| + .uleb128 0x8 /* DW_FORM_string */
|
| + .uleb128 0x3 /* DW_AT_name */
|
| + .uleb128 0x8 /* DW_FORM_string */
|
| + .byte 0x0 /* Terminator */
|
| + .byte 0x0 /* Terminator */
|
| +
|
| + .uleb128 3 /* Abbrev code */
|
| + .uleb128 0x2e /* DW_TAG_subprogram */
|
| + .byte 0 /* has_children */
|
| + .uleb128 0x3 /* DW_AT_name */
|
| + .uleb128 0x8 /* DW_FORM_string */
|
| + .uleb128 0x11 /* DW_AT_low_pc */
|
| + .uleb128 0x1 /* DW_FORM_addr */
|
| + .uleb128 0x12 /* DW_AT_high_pc */
|
| + .uleb128 0x1 /* DW_FORM_addr */
|
| + .byte 0x0 /* Terminator */
|
| + .byte 0x0 /* Terminator */
|
| +
|
| + .byte 0x0 /* Terminator */
|
| + .byte 0x0 /* Terminator */
|
| +"
|
| +
|
| +close $f
|
| +
|
| +set opts {}
|
| +# Base directory.
|
| +lappend opts "additional_flags=-DBDIR=\"${srcabsdir}\""
|
| +# Incorrect directory which should never be visible from GDB.
|
| +lappend opts "additional_flags=-DXDIR=\"${srcabsdir}/xdir\""
|
| +# CU's DW_AT_comp_dir.
|
| +lappend opts "additional_flags=-DCOMPDIR=\"compdir\""
|
| +# .debug_line's directory.
|
| +lappend opts "additional_flags=-DLDIR=\"ldir\""
|
| +# CU's DW_AT_name and .debug_line's filename relative directory, if needed.
|
| +lappend opts "additional_flags=-DFDIR=\"fdir\""
|
| +# CU's DW_AT_name and .debug_line's filename.
|
| +lappend opts "additional_flags=-DFILE=\"${srctmpfile}\""
|
| +
|
| +if { [gdb_compile "${asmsrcfile} ${srcdir}/${subdir}/$srcfile" "${binfile}" executable $opts] != "" } {
|
| + untested "Cannot compile ${asmsrcfile} or $srcfile"
|
| + return -1
|
| +}
|
| +
|
| +set dirs {}
|
| +foreach r {"" /rdir} {
|
| + foreach x {"" /xdir} {
|
| + foreach comp {"" /compdir} {
|
| + foreach l {"" /ldir} {
|
| + foreach f {"" /fdir} {
|
| + lappend dirs $r$x$comp$l$f
|
| + }
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +proc pathexpand {prefix dirlst suffix} {
|
| + set retlst {}
|
| + foreach dir $dirlst {
|
| + lappend retlst "$prefix$dir$suffix"
|
| + }
|
| + return $retlst
|
| +}
|
| +
|
| +set filelist [pathexpand $srcabsdir $dirs "/$srctmpfile"]
|
| +set dircreatelist [pathexpand $srcabsdir $dirs ""]
|
| +set dirremovelist [pathexpand $srcabsdir [lreverse $dirs] ""]
|
| +
|
| +remote_exec host "sh -c \"rm -f $filelist\""
|
| +remote_exec host "sh -c \"rmdir $dirremovelist\""
|
| +remote_exec host "sh -c \"mkdir $dircreatelist\""
|
| +remote_exec host "sh -c \"for d in $dircreatelist; do cp ${srcdir}/${subdir}/${srcfile} \\\$d/${srctmpfile}; done\""
|
| +
|
| +clean_restart ${testfile}
|
| +
|
| +if ![runto_main] {
|
| + return -1
|
| +}
|
| +
|
| +gdb_test "cd ${srcabsdir}/rdir" "Working directory [string_to_regexp ${srcabsdir}]/rdir\\." "cd .../rdir"
|
| +
|
| +proc test { func compdir filename } {
|
| + with_test_prefix "$func" {
|
| + # Clear the GDB cache.
|
| + gdb_test_no_output "set directories" ""
|
| +
|
| + if {$compdir == ""} {
|
| + set absolute "$filename"
|
| + } else {
|
| + set absolute "$compdir/$filename"
|
| + }
|
| + if {[string index $absolute 0] != "/"} {
|
| + error "not absolute"
|
| + }
|
| +
|
| + gdb_breakpoint $func
|
| + gdb_continue_to_breakpoint $func "$func \\(\\) at .*"
|
| +
|
| + gdb_test_no_output "set filename-display absolute"
|
| + verbose -log "expect: ${absolute}"
|
| + gdb_test "frame" " in $func \\(\\) at [string_to_regexp ${absolute}]:999" "absolute"
|
| +
|
| + gdb_test_no_output "set filename-display basename"
|
| + verbose -log "expect: [file tail $filename]"
|
| + gdb_test "frame" " in $func \\(\\) at [string_to_regexp [file tail $filename]]:999" "basename"
|
| +
|
| + gdb_test_no_output "set filename-display relative"
|
| + verbose -log "expect: $filename"
|
| + gdb_test "frame" " in $func \\(\\) at [string_to_regexp $filename]:999" "relative"
|
| + }
|
| +}
|
| +
|
| +set bdir "${srcabsdir}"
|
| +set file "${srctmpfile}"
|
| +test "compdir_missing__ldir_missing__file_basename" "$bdir/rdir" "$file"
|
| +test "compdir_missing__ldir_missing__file_relative" "$bdir/rdir" "fdir/$file"
|
| +test "compdir_missing__ldir_missing__file_absolute" "" "$bdir/$file"
|
| +test "compdir_missing__ldir_relative_file_basename" "$bdir/rdir" "ldir/$file"
|
| +test "compdir_missing__ldir_relative_file_relative" "$bdir/rdir" "ldir/fdir/$file"
|
| +test "compdir_missing__ldir_relative_file_absolute" "" "$bdir/$file"
|
| +test "compdir_missing__ldir_absolute_file_basename" "" "$bdir/ldir/$file"
|
| +test "compdir_missing__ldir_absolute_file_relative" "" "$bdir/ldir/fdir/$file"
|
| +test "compdir_missing__ldir_absolute_file_absolute_same" "" "$bdir/$file"
|
| +test "compdir_missing__ldir_absolute_file_absolute_different" "" "$bdir/$file"
|
| +test "compdir_relative_ldir_missing__file_basename" "$bdir/rdir/compdir" "$file"
|
| +test "compdir_relative_ldir_missing__file_relative" "$bdir/rdir/compdir" "fdir/$file"
|
| +test "compdir_relative_ldir_missing__file_absolute" "" "$bdir/$file"
|
| +test "compdir_relative_ldir_relative_file_basename" "$bdir/rdir/compdir" "ldir/$file"
|
| +test "compdir_relative_ldir_relative_file_relative" "$bdir/rdir/compdir" "ldir/fdir/$file"
|
| +test "compdir_relative_ldir_relative_file_absolute" "" "$bdir/$file"
|
| +test "compdir_relative_ldir_absolute_file_basename" "" "$bdir/ldir/$file"
|
| +test "compdir_relative_ldir_absolute_file_relative" "" "$bdir/ldir/fdir/$file"
|
| +test "compdir_relative_ldir_absolute_file_absolute_same" "" "$bdir/$file"
|
| +test "compdir_relative_ldir_absolute_file_absolute_different" "" "$bdir/$file"
|
| +test "compdir_absolute_ldir_missing__file_basename" "$bdir/compdir" "$file"
|
| +test "compdir_absolute_ldir_missing__file_relative" "$bdir/compdir" "fdir/$file"
|
| +test "compdir_absolute_ldir_missing__file_absolute_same" "" "$bdir/$file"
|
| +test "compdir_absolute_ldir_missing__file_absolute_different" "" "$bdir/$file"
|
| +test "compdir_absolute_ldir_relative_file_basename" "$bdir/compdir" "ldir/$file"
|
| +test "compdir_absolute_ldir_relative_file_relative" "$bdir/compdir" "ldir/fdir/$file"
|
| +test "compdir_absolute_ldir_relative_file_absolute_same" "" "$bdir/$file"
|
| +test "compdir_absolute_ldir_relative_file_absolute_different" "" "$bdir/$file"
|
| +test "compdir_absolute_ldir_absolute_file_basename_same" "" "$bdir/ldir/$file"
|
| +test "compdir_absolute_ldir_absolute_file_relative_different" "" "$bdir/ldir/fdir/$file"
|
| +test "compdir_absolute_ldir_absolute_file_absolute_same" "" "$bdir/$file"
|
| +test "compdir_absolute_ldir_absolute_file_absolute_different" "" "$bdir/$file"
|
|
|