[gdb/testsuite] Fix gdb.dwarf2/dw2-dir-file-name.exp with clang
authorTom de Vries <tdevries@suse.de>
Mon, 12 Sep 2022 08:05:18 +0000 (10:05 +0200)
committerTom de Vries <tdevries@suse.de>
Mon, 12 Sep 2022 08:05:18 +0000 (10:05 +0200)
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.

gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.c
gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.exp

index a2a0db27155e22b54ed3ae4a3bf92ba93bee7404..8041053b4d8e992b8dbf1ddacae046a4a5b6cb9d 100644 (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
 
index 4c4c1ff07af04332354231622cd6b3fa341bc5b0..08b5c645fa2f1caa2ccfc7d92d29cc6f13ea40b8 100644 (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