diff options
author | Kwok Cheung Yeung <kcy@codesourcery.com> | 2014-10-18 21:45:36 +0100 |
---|---|---|
committer | Kwok Cheung Yeung <kcy@codesourcery.com> | 2014-10-18 21:53:15 +0100 |
commit | bd286a290bbfe7039cf9fe0291ab9b1f20937e52 (patch) | |
tree | 4a92136265ff39756d97a43fc48d14f6b94c3ea6 /gdb | |
parent | 673dc4a0542b54d8da67e53eaaa94ace90085421 (diff) | |
download | gdb-bd286a290bbfe7039cf9fe0291ab9b1f20937e52.zip gdb-bd286a290bbfe7039cf9fe0291ab9b1f20937e52.tar.gz gdb-bd286a290bbfe7039cf9fe0291ab9b1f20937e52.tar.bz2 |
Fix the gdb.dwarf2/dw2-dir-file-name.exp test on MIPS
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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.c | 7 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.exp | 27 |
3 files changed, 34 insertions, 9 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 9d2f287..75c497a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -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 diff --git a/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.c b/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.c index 517df90..69aad30 100644 --- a/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.c +++ b/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.c @@ -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) \ { \ diff --git a/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.exp b/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.exp index 7f29581..c0050f5 100644 --- a/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.exp +++ b/gdb/testsuite/gdb.dwarf2/dw2-dir-file-name.exp @@ -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 |