[gdb/testsuite] Fix gdb.dwarf2/dw2-dir-file-name.exp with clang

When running test-case gdb.dwarf2/dw2-dir-file-name.exp with clang, we run
into:
...
(gdb) break *compdir_missing__ldir_missing__file_basename^M
Breakpoint 2 at 0x400580^M
(gdb) continue^M
Continuing.^M
^M
Breakpoint 2, 0x0000000000400580 in \
  compdir_missing.ldir_missing.file_basename ()^M
(gdb) FAIL: gdb.dwarf2/dw2-dir-file-name.exp: \
  compdir_missing__ldir_missing__file_basename: continue to breakpoint: \
  compdir_missing__ldir_missing__file_basename
...

The problem is that the test-case uses labels outside functions, which is know
to cause problem with clang, as documented in the comment for proc
function_range.

Fix this by using get_func_info instead.

Tested on x86_64-linux, with both gcc 7.5.0 and clang 13.0.0.
This commit is contained in:
Tom de Vries
2022-09-12 10:05:18 +02:00
parent ac3fe48fd6
commit 9e338b141b
2 changed files with 62 additions and 23 deletions

View File

@ -63,28 +63,13 @@ FUNC (compdir_absolute_ldir_absolute_file_relative_different) \
FUNC (compdir_absolute_ldir_absolute_file_absolute_same) \
FUNC (compdir_absolute_ldir_absolute_file_absolute_different)
#ifdef __mips__
#define START_INSNS asm (".insn\n");
#else
#define START_INSNS
#endif
/* Notes: (1) The '*_start' label below is needed because 'name' may
point to a function descriptor instead of to the actual code. (2)
The '.balign' should specify the highest possible function
alignment across all supported architectures, such that the label
never points into the alignment gap. */
#define FUNC(name) \
asm (".balign 8"); \
asm (#name "_start: .globl " #name "_start\n"); \
START_INSNS \
static void \
name (void) \
{ \
asm (#name "_label: .globl " #name "_label\n"); \
v++; \
} \
asm (#name "_end: .globl " #name "_end\n");
}
FUNCBLOCK
#undef FUNC

View File

@ -34,6 +34,50 @@ if {[is_64_target]} {
}
standard_testfile
set func_info_names {
compdir_missing__ldir_missing__file_basename
compdir_missing__ldir_missing__file_relative
compdir_missing__ldir_missing__file_absolute
compdir_missing__ldir_relative_file_basename
compdir_missing__ldir_relative_file_relative
compdir_missing__ldir_relative_file_absolute
compdir_missing__ldir_absolute_file_basename
compdir_missing__ldir_absolute_file_relative
compdir_missing__ldir_absolute_file_absolute_same
compdir_missing__ldir_absolute_file_absolute_different
compdir_relative_ldir_missing__file_basename
compdir_relative_ldir_missing__file_relative
compdir_relative_ldir_missing__file_absolute
compdir_relative_ldir_relative_file_basename
compdir_relative_ldir_relative_file_relative
compdir_relative_ldir_relative_file_absolute
compdir_relative_ldir_absolute_file_basename
compdir_relative_ldir_absolute_file_relative
compdir_relative_ldir_absolute_file_absolute_same
compdir_relative_ldir_absolute_file_absolute_different
compdir_absolute_ldir_missing__file_basename
compdir_absolute_ldir_missing__file_relative
compdir_absolute_ldir_missing__file_absolute_same
compdir_absolute_ldir_missing__file_absolute_different
compdir_absolute_ldir_relative_file_basename
compdir_absolute_ldir_relative_file_relative
compdir_absolute_ldir_relative_file_absolute_same
compdir_absolute_ldir_relative_file_absolute_different
compdir_absolute_ldir_absolute_file_basename_same
compdir_absolute_ldir_absolute_file_basename_different
compdir_absolute_ldir_absolute_file_relative_same
compdir_absolute_ldir_absolute_file_relative_different
compdir_absolute_ldir_absolute_file_absolute_same
compdir_absolute_ldir_absolute_file_absolute_different
}
with_shared_gdb {
foreach func_info_name $func_info_names {
get_func_info $func_info_name
}
}
set asmsrcfile [standard_output_file ${testfile}asm.S]
set asmobjfile [standard_output_file ${testfile}asm.o]
set srcabsdir [standard_output_file ${testfile}.d]
@ -52,6 +96,11 @@ proc out_cu { name cu_dir cu_name line_dir line_name } {
global f
global addr_len
global ${name}_start
global ${name}_end
set name_start [set ${name}_start]
set name_end [set ${name}_end]
puts -nonewline $f "\
.L${name}_begin:
.4byte .L${name}_end - .L${name}_start /* Length of Compilation Unit */
@ -69,8 +118,8 @@ proc out_cu { name cu_dir cu_name line_dir line_name } {
.ascii \"GNU C\\0\" /* DW_AT_producer */
.byte 2 /* DW_AT_language (DW_LANG_C) */
.4byte .Lline_${name}_begin /* DW_AT_stmt_list */
.${addr_len}byte ${name}_start /* DW_AT_low_pc */
.${addr_len}byte ${name}_end /* DW_AT_high_pc */
.${addr_len}byte $name_start /* DW_AT_low_pc */
.${addr_len}byte $name_end /* DW_AT_high_pc */
"
if { $cu_dir != "" } {
puts $f " .ascii $cu_dir /* DW_AT_comp_dir */"
@ -80,8 +129,8 @@ proc out_cu { name cu_dir cu_name line_dir line_name } {
.uleb128 3 /* Abbrev: DW_TAG_subprogram */
.asciz \"${name}\" /* DW_AT_name */
.${addr_len}byte ${name}_start /* DW_AT_low_pc */
.${addr_len}byte ${name}_end /* DW_AT_high_pc */
.${addr_len}byte $name_start /* DW_AT_low_pc */
.${addr_len}byte $name_end /* DW_AT_high_pc */
.byte 0 /* End of children of CU */
.L${name}_end:
@ -92,6 +141,11 @@ proc out_line { name cu_dir cu_name line_dir line_name } {
global f
global addr_len
global ${name}_start
global ${name}_end
set name_start [set ${name}_start]
set name_end [set ${name}_end]
puts -nonewline $f "\
.Lline_${name}_begin:
.4byte .Lline_${name}_end - .Lline_${name}_start /* Initial length */
@ -138,14 +192,14 @@ proc out_line { name cu_dir cu_name line_dir line_name } {
.byte 0 /* DW_LNE_set_address */
.uleb128 ${addr_len}+1
.byte 2
.${addr_len}byte ${name}_start
.${addr_len}byte $name_start
.byte 1 /* DW_LNS_copy */
.byte 3 /* DW_LNS_advance_line */
.sleb128 1 /* ... to 1000 */
.byte 0 /* DW_LNE_set_address */
.uleb128 ${addr_len}+1
.byte 2
.${addr_len}byte ${name}_end
.${addr_len}byte $name_end
.byte 1 /* DW_LNS_copy */
.byte 0 /* DW_LNE_end_of_sequence */
.uleb128 1