Fix the gdb.dwarf2/dw2-dir-file-name.exp test on MIPS
authorKwok Cheung Yeung <kcy@codesourcery.com>
Sat, 18 Oct 2014 20:45:36 +0000 (21:45 +0100)
committerKwok Cheung Yeung <kcy@codesourcery.com>
Sat, 18 Oct 2014 20:53:15 +0000 (21:53 +0100)
This patch fixes the failures that occur with the
gdb.dwarf2/dw2-dir-file-name.exp test on 64-bit MIPS and compressed
MIPS ISAs (i.e. MIPS16 and microMIPS).

The failures on 64-bit occur because the generated DWARF address
information is always 32-bit, which causes the upper 32-bits of
addresses to be truncated and causes breakpoints to be set on the
wrong address if any of the upper 32-bits are non-zero.  I suspect
that other 64-bit architectures get away with it because they
place all their instructions at a VMA lower than 2^32 by default.
This patch causes 64-bit addresses to be generated if a 64-bit
target is detected.

The failures on MIPS16 and microMIPS occur because the breakpoint
address needs to have the LSB set to 1 (used to indicate that the
code is compressed). However, the function name is interpreted as
a data label, causing GDB to set breakpoints at even addresses.
This is fixed by explicitly adding a '.insn' directive (see
https://sourceware.org/binutils/docs/as/MIPS-insn.html) after the
label on MIPS only.

gdb/testsuite/

2014-10-18  Kwok Cheung Yeung  <kcy@codesourcery.com>

* gdb.dwarf2/dw2-dir-file-name.exp (addr_len): New.
(out_cu): Use addr_len for the size of addresses.
(out_line): Likewise.  Size DW_LNE_set_address instruction
according to addr_len.
* gdb.dwarf2/dw2-dir-file-name.c (START_INSNS): New.
(FUNC): Add START_INSNS to definition.

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

index 9d2f287f17bae61b04838d57a49d722ee149f1db..75c497a82fbe1efcec6a1f3991b1671e9b07e953 100644 (file)
@@ -1,3 +1,12 @@
+2014-10-18  Kwok Cheung Yeung  <kcy@codesourcery.com>
+
+       * gdb.dwarf2/dw2-dir-file-name.exp (addr_len): New.
+       (out_cu): Use addr_len for the size of addresses.
+       (out_line): Likewise.  Size DW_LNE_set_address instruction
+       according to addr_len.
+       * gdb.dwarf2/dw2-dir-file-name.c (START_INSNS): New.
+       (FUNC): Add START_INSNS to definition.
+
 2014-10-18  Yao Qi  <yao@codesourcery.com>
 
        * gdb.base/argv0-symlink.exp: Check argv[0] value if
index 517df9001fd6031a2d2fef5351df0281ed188708..69aad30ccace3ae4d2d97d21a5f77cbae3ee92ad 100644 (file)
@@ -63,6 +63,12 @@ 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
@@ -72,6 +78,7 @@ FUNC (compdir_absolute_ldir_absolute_file_absolute_different)
 #define FUNC(name)                                     \
   asm (".balign 8");                                   \
   asm (#name "_start: .globl " #name "_start\n");      \
+  START_INSNS                                          \
   static void                                          \
   name (void)                                          \
   {                                                    \
index 7f29581dcd757d1ccd940315178845bcd13aa12f..c0050f59f268f164142a004539e8939bcfdb29aa 100644 (file)
@@ -19,6 +19,13 @@ if {![dwarf2_support]} {
     return 0  
 }
 
+# Find length of addresses in bytes.
+if {[is_64_target]} {
+    set addr_len 8
+} else {
+    set addr_len 4
+}
+
 standard_testfile
 set asmsrcfile [standard_output_file ${testfile}asm.S]
 set asmobjfile [standard_output_file ${testfile}asm.o]
@@ -36,6 +43,7 @@ puts $f "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */"
 
 proc out_cu { name cu_dir cu_name line_dir line_name } {
     global f
+    global addr_len
 
     puts -nonewline $f "\
 .L${name}_begin:
@@ -43,7 +51,7 @@ proc out_cu { name cu_dir cu_name line_dir line_name } {
 .L${name}_start:
        .2byte  2                               /* DWARF Version */
        .4byte  .Labbrev1_begin                 /* Offset into abbrev section */
-       .byte   4                               /* Pointer size */
+       .byte   ${addr_len}                     /* Pointer size */
 "
     if { $cu_dir != "" } {
        puts $f "  .uleb128 ABBREV_COMP_DIR_NAME /* Abbrev: DW_TAG_compile_unit */"
@@ -54,8 +62,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 */
-       .4byte  ${name}_start                   /* DW_AT_low_pc */
-       .4byte  ${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 */"
@@ -65,8 +73,8 @@ proc out_cu { name cu_dir cu_name line_dir line_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 */
+       .${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:
@@ -75,6 +83,7 @@ proc out_cu { name cu_dir cu_name line_dir line_name } {
 
 proc out_line { name cu_dir cu_name line_dir line_name } {
     global f
+    global addr_len
 
     puts -nonewline $f "\
 .Lline_${name}_begin:
@@ -120,16 +129,16 @@ proc out_line { name cu_dir cu_name line_dir line_name } {
        .byte           3       /* DW_LNS_advance_line */
        .sleb128        998     /* ... to 999 */
        .byte           0       /* DW_LNE_set_address */
-       .uleb128        5
+       .uleb128        ${addr_len}+1
        .byte           2
-       .4byte          ${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        5
+       .uleb128        ${addr_len}+1
        .byte           2
-       .4byte          ${name}_end
+       .${addr_len}byte ${name}_end
        .byte           1       /* DW_LNS_copy */
        .byte           0       /* DW_LNE_end_of_sequence */
        .uleb128        1