summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.dwarf2
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2013-02-03 16:09:29 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2013-02-03 16:09:29 +0000
commitd4f5987387f1f61969b86ca9305264820ad01499 (patch)
tree3fba27336b665d49484c17b14adf2db7c0f5e038 /gdb/testsuite/gdb.dwarf2
parentc73c602ab2e8ff0baf26ca94d9b5f4d442306bbc (diff)
downloadgdb-d4f5987387f1f61969b86ca9305264820ad01499.tar.gz
gdb/
Add a new variable that controls a way in which filenames are displayed. * NEWS (set filename-display): New entry. * source.c (filename_display_basename, filename_display_relative) (filename_display_absolute, filename_display_kind_names) (filename_display_string, show_filename_display_string) (symtab_to_filename_for_display): New. (_initialize_source): Added initialization of 'filename-display' variable. * source.h (symtab_to_filename_for_display): Added declaration. * stack.c (print_frame): Added new variable and calling of a new function and condition with this variable. Changed third argument of calling of a function. gdb/doc/ * gdb.texinfo (Backtrace): Added description of 'filename-display' variable in 'set/show backtrace' section. gdb/testsuite/ * gdb.dwarf2/dw2-dir-file-name.exp: New file. * gdb.dwarf2/dw2-dir-file-name.c: New file.
Diffstat (limited to 'gdb/testsuite/gdb.dwarf2')
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.c87
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.exp400
2 files changed, 487 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.c b/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.c
new file mode 100644
index 00000000000..724f22a6024
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.c
@@ -0,0 +1,87 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2012 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/>. */
+
+volatile int v;
+
+static void
+marker (void)
+{
+ v++;
+}
+
+/* *R* marks possibly invalid compiler output as the first path component is
+ not absolute. Still DWARF-4 does not forbid such DWARF; GCC does not
+ produce it. */
+
+#define FUNCBLOCK \
+FUNC (compdir_missing__ldir_missing__file_basename) /*R*/\
+FUNC (compdir_missing__ldir_missing__file_relative) /*R*/\
+FUNC (compdir_missing__ldir_missing__file_absolute) \
+FUNC (compdir_missing__ldir_relative_file_basename) /*R*/\
+FUNC (compdir_missing__ldir_relative_file_relative) /*R*/\
+FUNC (compdir_missing__ldir_relative_file_absolute) /*R*/\
+FUNC (compdir_missing__ldir_absolute_file_basename) \
+FUNC (compdir_missing__ldir_absolute_file_relative) \
+FUNC (compdir_missing__ldir_absolute_file_absolute_same) \
+FUNC (compdir_missing__ldir_absolute_file_absolute_different) \
+FUNC (compdir_relative_ldir_missing__file_basename) /*R*/\
+FUNC (compdir_relative_ldir_missing__file_relative) /*R*/\
+FUNC (compdir_relative_ldir_missing__file_absolute) /*R*/\
+FUNC (compdir_relative_ldir_relative_file_basename) /*R*/\
+FUNC (compdir_relative_ldir_relative_file_relative) /*R*/\
+FUNC (compdir_relative_ldir_relative_file_absolute) /*R*/\
+FUNC (compdir_relative_ldir_absolute_file_basename) /*R*/\
+FUNC (compdir_relative_ldir_absolute_file_relative) /*R*/\
+FUNC (compdir_relative_ldir_absolute_file_absolute_same) /*R*/\
+FUNC (compdir_relative_ldir_absolute_file_absolute_different) /*R*/\
+FUNC (compdir_absolute_ldir_missing__file_basename) \
+FUNC (compdir_absolute_ldir_missing__file_relative) \
+FUNC (compdir_absolute_ldir_missing__file_absolute_same) \
+FUNC (compdir_absolute_ldir_missing__file_absolute_different) \
+FUNC (compdir_absolute_ldir_relative_file_basename) \
+FUNC (compdir_absolute_ldir_relative_file_relative) \
+FUNC (compdir_absolute_ldir_relative_file_absolute_same) \
+FUNC (compdir_absolute_ldir_relative_file_absolute_different) \
+FUNC (compdir_absolute_ldir_absolute_file_basename_same) \
+FUNC (compdir_absolute_ldir_absolute_file_basename_different) \
+FUNC (compdir_absolute_ldir_absolute_file_relative_same) \
+FUNC (compdir_absolute_ldir_absolute_file_relative_different) \
+FUNC (compdir_absolute_ldir_absolute_file_absolute_same) \
+FUNC (compdir_absolute_ldir_absolute_file_absolute_different)
+
+#define FUNC(name) \
+ asm (#name "_start: .globl " #name "_start\n"); \
+ static void \
+ name (void) \
+ { \
+ v++; \
+ } \
+ asm (#name "_end: .globl " #name "_end\n");
+FUNCBLOCK
+#undef FUNC
+
+int
+main (void)
+{
+
+#define FUNC(name) \
+ name ();
+FUNCBLOCK
+#undef FUNC
+
+ return 0;
+}
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 00000000000..882bdb07944
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.exp
@@ -0,0 +1,400 @@
+# Copyright 2012 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
+}
+
+remote_exec host "sh -c \"rm -f ${srcabsdir}{/rdir,}{/xdir,}{/compdir,}{/ldir,}{/fdir,}/${srctmpfile}\""
+remote_exec host "sh -c \"rmdir ${srcabsdir}{/rdir,}{/xdir,}{/compdir,}{/ldir,}{/fdir,}\""
+remote_exec host "sh -c \"mkdir ${srcabsdir}{,/rdir}{,/xdir}{,/compdir}{,/ldir}{,/fdir}\""
+remote_exec host "sh -c \"for d in ${srcabsdir}{,/rdir}{,/xdir}{,/compdir}{,/ldir}{,/fdir};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\\."
+
+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"