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.
This commit is contained in:
parent
673dc4a054
commit
bd286a290b
|
@ -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
|
||||
|
|
|
@ -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) \
|
||||
{ \
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue