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 |