From patchwork Sat Oct 11 21:01:05 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kwok Cheung Yeung X-Patchwork-Id: 3205 Received: (qmail 6582 invoked by alias); 11 Oct 2014 21:01:15 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 6569 invoked by uid 89); 11 Oct 2014 21:01:14 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.2 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 11 Oct 2014 21:01:12 +0000 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=SVR-IES-FEM-01.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1Xd3mm-0003lq-Mb from Kwok_Yeung@mentor.com for gdb-patches@sourceware.org; Sat, 11 Oct 2014 14:01:09 -0700 Received: from [192.168.1.49] (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server id 14.3.181.6; Sat, 11 Oct 2014 22:01:07 +0100 Message-ID: <54399A91.8000006@mentor.com> Date: Sat, 11 Oct 2014 22:01:05 +0100 From: Kwok Cheung Yeung User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.1.2 MIME-Version: 1.0 To: Subject: [PATCH] Fix gdb.dwarf2/dw2-dir-file-name.exp test for MIPS architectures 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. Kwok 2014-08-14 Kwok Cheung Yeung gdb/testsuite/ * 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. 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..6c92441 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