| OLD | NEW | 
| (Empty) |  | 
 |    1 # Copyright 2012-2013 Free Software Foundation, Inc. | 
 |    2 # | 
 |    3 # This program is free software; you can redistribute it and/or modify | 
 |    4 # it under the terms of the GNU General Public License as published by | 
 |    5 # the Free Software Foundation; either version 3 of the License, or | 
 |    6 # (at your option) any later version. | 
 |    7 # | 
 |    8 # This program is distributed in the hope that it will be useful, | 
 |    9 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |   10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |   11 # GNU General Public License for more details. | 
 |   12 # | 
 |   13 # You should have received a copy of the GNU General Public License | 
 |   14 # along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
 |   15 load_lib dwarf.exp | 
 |   16  | 
 |   17 # This test can only be run on targets which support DWARF-2 and use gas. | 
 |   18 if {![dwarf2_support]} { | 
 |   19     return 0   | 
 |   20 } | 
 |   21  | 
 |   22 standard_testfile | 
 |   23 set asmsrcfile [standard_output_file ${testfile}asm.S] | 
 |   24 set asmobjfile [standard_output_file ${testfile}asm.o] | 
 |   25 set srcabsdir [standard_output_file ${testfile}.d] | 
 |   26 set srctmpfile tmp-${testfile}.c | 
 |   27  | 
 |   28 # $srcdir may be relative. | 
 |   29 if {[file pathtype $srcabsdir] != "absolute"} { | 
 |   30     untested "objdir pathtype is not absolute" | 
 |   31     return -1 | 
 |   32 } | 
 |   33  | 
 |   34 set f [open $asmsrcfile "w"] | 
 |   35 puts $f "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */" | 
 |   36  | 
 |   37 proc out_cu { name cu_dir cu_name line_dir line_name } { | 
 |   38     global f | 
 |   39  | 
 |   40     puts -nonewline $f "\ | 
 |   41 .L${name}_begin: | 
 |   42         .4byte  .L${name}_end - .L${name}_start /* Length of Compilation Unit */ | 
 |   43 .L${name}_start: | 
 |   44         .2byte  2                               /* DWARF Version */ | 
 |   45         .4byte  .Labbrev1_begin                 /* Offset into abbrev section */ | 
 |   46         .byte   4                               /* Pointer size */ | 
 |   47 " | 
 |   48     if { $cu_dir != "" } { | 
 |   49         puts $f "  .uleb128 ABBREV_COMP_DIR_NAME /* Abbrev: DW_TAG_compile_unit 
     */" | 
 |   50     } else { | 
 |   51         puts $f "  .uleb128 ABBREV_NAME /* Abbrev: DW_TAG_compile_unit */" | 
 |   52     } | 
 |   53     puts -nonewline $f "\ | 
 |   54         .ascii  \"GNU C\\0\"                    /* DW_AT_producer */ | 
 |   55         .byte   2                               /* DW_AT_language (DW_LANG_C) */ | 
 |   56         .4byte  .Lline_${name}_begin            /* DW_AT_stmt_list */ | 
 |   57         .4byte  ${name}_start                   /* DW_AT_low_pc */ | 
 |   58         .4byte  ${name}_end                     /* DW_AT_high_pc */ | 
 |   59 " | 
 |   60     if { $cu_dir != "" } { | 
 |   61         puts $f "  .ascii $cu_dir /* DW_AT_comp_dir */" | 
 |   62     } | 
 |   63     puts -nonewline $f "\ | 
 |   64         .ascii  $cu_name                        /* DW_AT_name */ | 
 |   65  | 
 |   66         .uleb128        3                       /* Abbrev: DW_TAG_subprogram */ | 
 |   67         .asciz          \"${name}\"             /* DW_AT_name */ | 
 |   68         .4byte          ${name}_start           /* DW_AT_low_pc */ | 
 |   69         .4byte          ${name}_end             /* DW_AT_high_pc */ | 
 |   70  | 
 |   71         .byte           0                       /* End of children of CU */ | 
 |   72 .L${name}_end: | 
 |   73 " | 
 |   74 } | 
 |   75  | 
 |   76 proc out_line { name cu_dir cu_name line_dir line_name } { | 
 |   77     global f | 
 |   78  | 
 |   79     puts -nonewline $f "\ | 
 |   80 .Lline_${name}_begin: | 
 |   81         .4byte          .Lline_${name}_end - .Lline_${name}_start       /* Initi
     al length */ | 
 |   82 .Lline_${name}_start: | 
 |   83         .2byte          2                       /* Version */ | 
 |   84         .4byte          .Lline_${name}_lines - .Lline_${name}_hdr       /* heade
     r_length */ | 
 |   85 .Lline_${name}_hdr: | 
 |   86         .byte           1                       /* Minimum insn length */ | 
 |   87         .byte           1                       /* default_is_stmt */ | 
 |   88         .byte           1                       /* line_base */ | 
 |   89         .byte           1                       /* line_range */ | 
 |   90         .byte           4                       /* opcode_base */ | 
 |   91  | 
 |   92         /* Standard lengths */ | 
 |   93         .byte           0 | 
 |   94         .byte           1 | 
 |   95         .byte           1 | 
 |   96  | 
 |   97         /* Include directories */ | 
 |   98 " | 
 |   99     if { $line_dir != "" } { | 
 |  100         puts $f "  .ascii $line_dir" | 
 |  101     } | 
 |  102     puts -nonewline $f "\ | 
 |  103         .byte           0 | 
 |  104  | 
 |  105         /* File names */ | 
 |  106         .ascii  $line_name | 
 |  107 " | 
 |  108     if { $line_dir != "" } { | 
 |  109         puts $f "  .uleb128 1" | 
 |  110     } else { | 
 |  111         puts $f "  .uleb128 0" | 
 |  112     } | 
 |  113     puts -nonewline $f "\ | 
 |  114         .uleb128        0 | 
 |  115         .uleb128        0 | 
 |  116  | 
 |  117         .byte           0 | 
 |  118  | 
 |  119 .Lline_${name}_lines: | 
 |  120         .byte           3       /* DW_LNS_advance_line */ | 
 |  121         .sleb128        998     /* ... to 999 */ | 
 |  122         .byte           0       /* DW_LNE_set_address */ | 
 |  123         .uleb128        5 | 
 |  124         .byte           2 | 
 |  125         .4byte          ${name}_start | 
 |  126         .byte           1       /* DW_LNS_copy */ | 
 |  127         .byte           3       /* DW_LNS_advance_line */ | 
 |  128         .sleb128        1       /* ... to 1000 */ | 
 |  129         .byte           0       /* DW_LNE_set_address */ | 
 |  130         .uleb128        5 | 
 |  131         .byte           2 | 
 |  132         .4byte          ${name}_end | 
 |  133         .byte           1       /* DW_LNS_copy */ | 
 |  134         .byte           0       /* DW_LNE_end_of_sequence */ | 
 |  135         .uleb128        1 | 
 |  136         .byte           1 | 
 |  137 .Lline_${name}_end: | 
 |  138 " | 
 |  139 } | 
 |  140  | 
 |  141 # IFSOME can be optionally _same or _different if >= 2 absolute directories are | 
 |  142 # provided.  Then in the _different case the overriden directories have invalid | 
 |  143 # XDIR value. | 
 |  144  | 
 |  145 proc out_unit { func compdir ldir file ifsame } { | 
 |  146     set name "compdir_${compdir}_ldir_${ldir}_file_${file}${ifsame}" | 
 |  147  | 
 |  148     if { $compdir == "missing_" } { | 
 |  149         set cu_dir {} | 
 |  150     } elseif { $compdir == "relative" } { | 
 |  151         set cu_dir {COMPDIR "\0"} | 
 |  152     } elseif { $compdir == "absolute" } { | 
 |  153         set cu_dir {BDIR "/" COMPDIR "\0"} | 
 |  154     } else { | 
 |  155         error "compdir $compdir" | 
 |  156     } | 
 |  157  | 
 |  158     if { $ldir == "missing_" } { | 
 |  159         set line_dir {} | 
 |  160     } elseif { $ldir == "relative" } { | 
 |  161         set line_dir {LDIR "\0"} | 
 |  162     } elseif { $ldir == "absolute" } { | 
 |  163         set line_dir {BDIR "/" LDIR "\0"} | 
 |  164     } else { | 
 |  165         error "ldir $ldir" | 
 |  166     } | 
 |  167  | 
 |  168     if { $file == "basename" } { | 
 |  169         set cu_name {FILE "\0"} | 
 |  170     } elseif { $file == "relative" } { | 
 |  171         set cu_name {FDIR "/" FILE "\0"} | 
 |  172     } elseif { $file == "absolute" } { | 
 |  173         set cu_name {BDIR "/" FILE "\0"} | 
 |  174     } else { | 
 |  175         error "file $file" | 
 |  176     } | 
 |  177     set line_name $cu_name | 
 |  178  | 
 |  179     if { "$ifsame" == "_different" } { | 
 |  180         if { $file == "absolute" } { | 
 |  181             if { $ldir == "absolute" } { | 
 |  182                 set line_dir {XDIR "\0"} | 
 |  183             } | 
 |  184             if { $compdir == "absolute" } { | 
 |  185                 set cu_dir {XDIR "\0"} | 
 |  186             } | 
 |  187         } elseif { $ldir == "absolute" } { | 
 |  188             if { $compdir == "absolute" } { | 
 |  189                 set cu_dir {XDIR "\0"} | 
 |  190             } | 
 |  191         } else { | 
 |  192             error "not enough absolutes" | 
 |  193         } | 
 |  194     } | 
 |  195  | 
 |  196     $func $name $cu_dir $cu_name $line_dir $line_name | 
 |  197 } | 
 |  198  | 
 |  199 proc out_diff { func compdir ldir file } { | 
 |  200     set abscount 0 | 
 |  201     if { $compdir == "absolute" } { | 
 |  202         incr abscount | 
 |  203     } | 
 |  204     if { $ldir == "absolute" } { | 
 |  205         incr abscount | 
 |  206     } | 
 |  207     if { $file == "absolute" } { | 
 |  208         incr abscount | 
 |  209     } | 
 |  210     if { $abscount <= 1 } { | 
 |  211         out_unit $func $compdir $ldir $file "" | 
 |  212     } else { | 
 |  213         out_unit $func $compdir $ldir $file "_same" | 
 |  214         out_unit $func $compdir $ldir $file "_different" | 
 |  215     } | 
 |  216 } | 
 |  217  | 
 |  218 proc out_file { func compdir ldir } { | 
 |  219     out_diff $func $compdir $ldir "basename" | 
 |  220     out_diff $func $compdir $ldir "relative" | 
 |  221     out_diff $func $compdir $ldir "absolute" | 
 |  222 } | 
 |  223  | 
 |  224 proc out_ldir { func compdir } { | 
 |  225     out_file $func $compdir "missing_" | 
 |  226     out_file $func $compdir "relative" | 
 |  227     out_file $func $compdir "absolute" | 
 |  228 } | 
 |  229  | 
 |  230 proc out_compdir { func } { | 
 |  231     out_ldir $func "missing_" | 
 |  232     out_ldir $func "relative" | 
 |  233     out_ldir $func "absolute" | 
 |  234 } | 
 |  235  | 
 |  236 puts -nonewline $f "\ | 
 |  237 #define ABBREV_NAME 1 | 
 |  238 #define ABBREV_COMP_DIR_NAME 2 | 
 |  239   .section .debug_info | 
 |  240 " | 
 |  241 out_compdir out_cu | 
 |  242  | 
 |  243 puts $f "  .section .debug_line" | 
 |  244 out_compdir out_line | 
 |  245  | 
 |  246 puts -nonewline $f "\ | 
 |  247         .section .debug_abbrev | 
 |  248 .Labbrev1_begin: | 
 |  249  | 
 |  250         .uleb128        ABBREV_NAME             /* Abbrev code */ | 
 |  251         .uleb128        0x11                    /* DW_TAG_compile_unit */ | 
 |  252         .byte           1                       /* has_children */ | 
 |  253         .uleb128        0x25                    /* DW_AT_producer */ | 
 |  254         .uleb128        0x8                     /* DW_FORM_string */ | 
 |  255         .uleb128        0x13                    /* DW_AT_language */ | 
 |  256         .uleb128        0xb                     /* DW_FORM_data1 */ | 
 |  257         .uleb128        0x10                    /* DW_AT_stmt_list */ | 
 |  258         .uleb128        0x6                     /* DW_FORM_data4 */ | 
 |  259         .uleb128        0x11                    /* DW_AT_low_pc */ | 
 |  260         .uleb128        0x1                     /* DW_FORM_addr */ | 
 |  261         .uleb128        0x12                    /* DW_AT_high_pc */ | 
 |  262         .uleb128        0x1                     /* DW_FORM_addr */ | 
 |  263         .uleb128        0x3                     /* DW_AT_name */ | 
 |  264         .uleb128        0x8                     /* DW_FORM_string */ | 
 |  265         .byte           0x0                     /* Terminator */ | 
 |  266         .byte           0x0                     /* Terminator */ | 
 |  267  | 
 |  268         .uleb128        ABBREV_COMP_DIR_NAME    /* Abbrev code */ | 
 |  269         .uleb128        0x11                    /* DW_TAG_compile_unit */ | 
 |  270         .byte           1                       /* has_children */ | 
 |  271         .uleb128        0x25                    /* DW_AT_producer */ | 
 |  272         .uleb128        0x8                     /* DW_FORM_string */ | 
 |  273         .uleb128        0x13                    /* DW_AT_language */ | 
 |  274         .uleb128        0xb                     /* DW_FORM_data1 */ | 
 |  275         .uleb128        0x10                    /* DW_AT_stmt_list */ | 
 |  276         .uleb128        0x6                     /* DW_FORM_data4 */ | 
 |  277         .uleb128        0x11                    /* DW_AT_low_pc */ | 
 |  278         .uleb128        0x1                     /* DW_FORM_addr */ | 
 |  279         .uleb128        0x12                    /* DW_AT_high_pc */ | 
 |  280         .uleb128        0x1                     /* DW_FORM_addr */ | 
 |  281         .uleb128        0x1b                    /* DW_AT_comp_dir */ | 
 |  282         .uleb128        0x8                     /* DW_FORM_string */ | 
 |  283         .uleb128        0x3                     /* DW_AT_name */ | 
 |  284         .uleb128        0x8                     /* DW_FORM_string */ | 
 |  285         .byte           0x0                     /* Terminator */ | 
 |  286         .byte           0x0                     /* Terminator */ | 
 |  287  | 
 |  288         .uleb128        3                       /* Abbrev code */ | 
 |  289         .uleb128        0x2e                    /* DW_TAG_subprogram */ | 
 |  290         .byte           0                       /* has_children */ | 
 |  291         .uleb128        0x3                     /* DW_AT_name */ | 
 |  292         .uleb128        0x8                     /* DW_FORM_string */ | 
 |  293         .uleb128        0x11                    /* DW_AT_low_pc */ | 
 |  294         .uleb128        0x1                     /* DW_FORM_addr */ | 
 |  295         .uleb128        0x12                    /* DW_AT_high_pc */ | 
 |  296         .uleb128        0x1                     /* DW_FORM_addr */ | 
 |  297         .byte           0x0                     /* Terminator */ | 
 |  298         .byte           0x0                     /* Terminator */ | 
 |  299  | 
 |  300         .byte           0x0                     /* Terminator */ | 
 |  301         .byte           0x0                     /* Terminator */ | 
 |  302 " | 
 |  303  | 
 |  304 close $f | 
 |  305  | 
 |  306 set opts {} | 
 |  307 # Base directory. | 
 |  308 lappend opts "additional_flags=-DBDIR=\"${srcabsdir}\"" | 
 |  309 # Incorrect directory which should never be visible from GDB. | 
 |  310 lappend opts "additional_flags=-DXDIR=\"${srcabsdir}/xdir\"" | 
 |  311 # CU's DW_AT_comp_dir. | 
 |  312 lappend opts "additional_flags=-DCOMPDIR=\"compdir\"" | 
 |  313 # .debug_line's directory. | 
 |  314 lappend opts "additional_flags=-DLDIR=\"ldir\"" | 
 |  315 # CU's DW_AT_name and .debug_line's filename relative directory, if needed. | 
 |  316 lappend opts "additional_flags=-DFDIR=\"fdir\"" | 
 |  317 # CU's DW_AT_name and .debug_line's filename. | 
 |  318 lappend opts "additional_flags=-DFILE=\"${srctmpfile}\"" | 
 |  319  | 
 |  320 if { [gdb_compile "${asmsrcfile} ${srcdir}/${subdir}/$srcfile" "${binfile}" exec
     utable $opts] != "" } { | 
 |  321     untested "Cannot compile ${asmsrcfile} or $srcfile" | 
 |  322     return -1 | 
 |  323 } | 
 |  324  | 
 |  325 set dirs {} | 
 |  326 foreach r {"" /rdir} { | 
 |  327   foreach x {"" /xdir} { | 
 |  328       foreach comp {"" /compdir} { | 
 |  329           foreach l {"" /ldir} { | 
 |  330               foreach f {"" /fdir} { | 
 |  331                   lappend dirs $r$x$comp$l$f | 
 |  332               } | 
 |  333           } | 
 |  334       } | 
 |  335   } | 
 |  336 } | 
 |  337  | 
 |  338 proc pathexpand {prefix dirlst suffix} { | 
 |  339     set retlst {} | 
 |  340     foreach dir $dirlst { | 
 |  341         lappend retlst "$prefix$dir$suffix" | 
 |  342     } | 
 |  343     return $retlst | 
 |  344 } | 
 |  345  | 
 |  346 set filelist [pathexpand $srcabsdir $dirs "/$srctmpfile"] | 
 |  347 set dircreatelist [pathexpand $srcabsdir $dirs ""] | 
 |  348 set dirremovelist [pathexpand $srcabsdir [lreverse $dirs] ""] | 
 |  349  | 
 |  350 remote_exec host "sh -c \"rm -f $filelist\"" | 
 |  351 remote_exec host "sh -c \"rmdir $dirremovelist\"" | 
 |  352 remote_exec host "sh -c \"mkdir $dircreatelist\"" | 
 |  353 remote_exec host "sh -c \"for d in $dircreatelist; do cp ${srcdir}/${subdir}/${s
     rcfile} \\\$d/${srctmpfile}; done\"" | 
 |  354  | 
 |  355 clean_restart ${testfile} | 
 |  356  | 
 |  357 if ![runto_main] { | 
 |  358     return -1 | 
 |  359 } | 
 |  360  | 
 |  361 gdb_test "cd ${srcabsdir}/rdir" "Working directory [string_to_regexp ${srcabsdir
     }]/rdir\\." "cd .../rdir" | 
 |  362  | 
 |  363 proc test { func compdir filename } { | 
 |  364     with_test_prefix "$func" { | 
 |  365         # Clear the GDB cache. | 
 |  366         gdb_test_no_output "set directories" "" | 
 |  367  | 
 |  368         if {$compdir == ""} { | 
 |  369             set absolute "$filename" | 
 |  370         } else { | 
 |  371             set absolute "$compdir/$filename" | 
 |  372         } | 
 |  373         if {[string index $absolute 0] != "/"} { | 
 |  374             error "not absolute" | 
 |  375         } | 
 |  376  | 
 |  377         gdb_breakpoint $func | 
 |  378         gdb_continue_to_breakpoint $func "$func \\(\\) at .*" | 
 |  379  | 
 |  380         gdb_test_no_output "set filename-display absolute" | 
 |  381         verbose -log "expect: ${absolute}" | 
 |  382         gdb_test "frame" " in $func \\(\\) at [string_to_regexp ${absolute}]:999
     " "absolute" | 
 |  383  | 
 |  384         gdb_test_no_output "set filename-display basename" | 
 |  385         verbose -log "expect: [file tail $filename]" | 
 |  386         gdb_test "frame" " in $func \\(\\) at [string_to_regexp [file tail $file
     name]]:999" "basename" | 
 |  387  | 
 |  388         gdb_test_no_output "set filename-display relative" | 
 |  389         verbose -log "expect: $filename" | 
 |  390         gdb_test "frame" " in $func \\(\\) at [string_to_regexp $filename]:999" 
     "relative" | 
 |  391     } | 
 |  392 } | 
 |  393  | 
 |  394 set bdir "${srcabsdir}" | 
 |  395 set file "${srctmpfile}" | 
 |  396 test "compdir_missing__ldir_missing__file_basename" "$bdir/rdir" "$file" | 
 |  397 test "compdir_missing__ldir_missing__file_relative" "$bdir/rdir" "fdir/$file" | 
 |  398 test "compdir_missing__ldir_missing__file_absolute" "" "$bdir/$file" | 
 |  399 test "compdir_missing__ldir_relative_file_basename" "$bdir/rdir" "ldir/$file" | 
 |  400 test "compdir_missing__ldir_relative_file_relative" "$bdir/rdir" "ldir/fdir/$fil
     e" | 
 |  401 test "compdir_missing__ldir_relative_file_absolute" "" "$bdir/$file" | 
 |  402 test "compdir_missing__ldir_absolute_file_basename" "" "$bdir/ldir/$file" | 
 |  403 test "compdir_missing__ldir_absolute_file_relative" "" "$bdir/ldir/fdir/$file" | 
 |  404 test "compdir_missing__ldir_absolute_file_absolute_same" "" "$bdir/$file" | 
 |  405 test "compdir_missing__ldir_absolute_file_absolute_different" "" "$bdir/$file" | 
 |  406 test "compdir_relative_ldir_missing__file_basename" "$bdir/rdir/compdir" "$file" | 
 |  407 test "compdir_relative_ldir_missing__file_relative" "$bdir/rdir/compdir" "fdir/$
     file" | 
 |  408 test "compdir_relative_ldir_missing__file_absolute" "" "$bdir/$file" | 
 |  409 test "compdir_relative_ldir_relative_file_basename" "$bdir/rdir/compdir" "ldir/$
     file" | 
 |  410 test "compdir_relative_ldir_relative_file_relative" "$bdir/rdir/compdir" "ldir/f
     dir/$file" | 
 |  411 test "compdir_relative_ldir_relative_file_absolute" "" "$bdir/$file" | 
 |  412 test "compdir_relative_ldir_absolute_file_basename" "" "$bdir/ldir/$file" | 
 |  413 test "compdir_relative_ldir_absolute_file_relative" "" "$bdir/ldir/fdir/$file" | 
 |  414 test "compdir_relative_ldir_absolute_file_absolute_same" "" "$bdir/$file" | 
 |  415 test "compdir_relative_ldir_absolute_file_absolute_different" "" "$bdir/$file" | 
 |  416 test "compdir_absolute_ldir_missing__file_basename" "$bdir/compdir" "$file" | 
 |  417 test "compdir_absolute_ldir_missing__file_relative" "$bdir/compdir" "fdir/$file" | 
 |  418 test "compdir_absolute_ldir_missing__file_absolute_same" "" "$bdir/$file" | 
 |  419 test "compdir_absolute_ldir_missing__file_absolute_different" "" "$bdir/$file" | 
 |  420 test "compdir_absolute_ldir_relative_file_basename" "$bdir/compdir" "ldir/$file" | 
 |  421 test "compdir_absolute_ldir_relative_file_relative" "$bdir/compdir" "ldir/fdir/$
     file" | 
 |  422 test "compdir_absolute_ldir_relative_file_absolute_same" "" "$bdir/$file" | 
 |  423 test "compdir_absolute_ldir_relative_file_absolute_different" "" "$bdir/$file" | 
 |  424 test "compdir_absolute_ldir_absolute_file_basename_same" "" "$bdir/ldir/$file" | 
 |  425 test "compdir_absolute_ldir_absolute_file_relative_different" "" "$bdir/ldir/fdi
     r/$file" | 
 |  426 test "compdir_absolute_ldir_absolute_file_absolute_same" "" "$bdir/$file" | 
 |  427 test "compdir_absolute_ldir_absolute_file_absolute_different" "" "$bdir/$file" | 
| OLD | NEW |