This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH/tilegx] tilegx bug fixes & improvements
- From: Yao Qi <yao at codesourcery dot com>
- To: Jiong Wang <jiwang at tilera dot com>
- Cc: <gdb-patches at sourceware dot org>, Walter Lee <walt at tilera dot com>, <palves at redhat dot com>
- Date: Thu, 6 Dec 2012 17:39:24 +0800
- Subject: Re: [PATCH/tilegx] tilegx bug fixes & improvements
- References: <50C04269.90304@tilera.com>
On 12/06/2012 02:59 PM, Jiong Wang wrote:
Hi All,
attachments fix several bugs on tilegx exposed by dejagnu and improve
tilegx gdb's info register output.
after these patches, the dejagnu test result improved from:
=== gdb Summary ===
# of expected passes 19030
# of unexpected failures 116
to:
=== gdb Summary ===
# of expected passes 19100
# of unexpected failures 61
The result looks good.
We don't attach multiple patches into a single mail. Assuming each of
your patches is independent, you can e-mail them one by one. In each
mail, the ChangeLog entry and description is included, helping people to
understand the patch.
0001-tilegx-tdep.c-tilegx_push_dummy_call-stack-alignment.patch
From 85696377fc2c76ea51463c5896f63c96a5ace92e Mon Sep 17 00:00:00 2001
From: Jiong Wang<jiwang@tilera.com>
Date: Thu, 6 Dec 2012 12:13:03 +0800
Subject: [PATCH 1/5] * tilegx-tdep.c (tilegx_push_dummy_call): stack
alignment should be 64bit
for tilegx, when push args on stack, the alignment should be 64bit
---
gdb/tilegx-tdep.c | 32 ++++++++------------------------
1 file changed, 8 insertions(+), 24 deletions(-)
diff --git a/gdb/tilegx-tdep.c b/gdb/tilegx-tdep.c
index 627a470..2f7f253 100644
--- a/gdb/tilegx-tdep.c
+++ b/gdb/tilegx-tdep.c
@@ -292,7 +292,7 @@ tilegx_push_dummy_call (struct gdbarch *gdbarch,
int argreg = TILEGX_R0_REGNUM;
int i, j;
int typelen, slacklen, alignlen;
- static const gdb_byte two_zero_words[8] = { 0 };
+ static const gdb_byte four_zero_words[16] = { 0 };
/* If struct_return is 1, then the struct return address will
consume one argument-passing register. */
@@ -324,44 +324,28 @@ tilegx_push_dummy_call (struct gdbarch *gdbarch,
}
/* Align SP. */
- stack_dest = tilegx_frame_align (gdbarch, stack_dest);
-
- /* Loop backwards through arguments to determine stack alignment. */
- alignlen = 0;
-
- for (j = nargs - 1; j >= i; j--)
- {
- typelen = TYPE_LENGTH (value_enclosing_type (args[j]));
- alignlen += (typelen + 3) & (~3);
- }
-
- if (alignlen & 0x4)
- stack_dest -= 4;
+ stack_dest = (stack_dest + 7) & ~0x7;
Your can use function 'align_up'.
/* Loop backwards through remaining arguments and push them on
the stack, word aligned. */
for (j = nargs - 1; j >= i; j--)
{x
gdb_byte *val;
- struct cleanup *back_to;
- const gdb_byte *contents = value_contents (args[j]);
typelen = TYPE_LENGTH (value_enclosing_type (args[j]));
- slacklen = ((typelen + 3) & (~3)) - typelen;
- val = xmalloc (typelen + slacklen);
- back_to = make_cleanup (xfree, val);
- memcpy (val, contents, typelen);
+ slacklen = ((typelen + 7) & (~7)) - typelen;
+ val = alloca (typelen + slacklen);
+ memcpy (val, value_contents (args[j]), typelen);
memset (val + typelen, 0, slacklen);
/* Now write data to the stack. The stack grows downwards. */
stack_dest -= typelen + slacklen;
write_memory (stack_dest, val, typelen + slacklen);
- do_cleanups (back_to);
alloca is unsafe, and we prefer to use xmalloc/cleanup+xfree.
0002-tilegx-tdep.c-tilegx_analyze_prologue-fix-prologue-a.patch
From 028cafa74fe2601ebf13e9a64e6de90e891cbed8 Mon Sep 17 00:00:00 2001
From: Jiong Wang<jiwang@tilera.com>
Date: Thu, 6 Dec 2012 12:15:32 +0800
Subject: [PATCH 2/5] * tilegx-tdep.c (tilegx_analyze_prologue): fix
prologue analysis overflow bug
when setting breakpoint by function name, if that function
is in .so and that .so is not loaded yet, then gdb will do
partial name match, which will match the corresponding plt
stub entry. We should take this situation into account when
doing prologue analysis.
---
gdb/tilegx-tdep.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/gdb/tilegx-tdep.c b/gdb/tilegx-tdep.c
index 2f7f253..93969c9 100644
--- a/gdb/tilegx-tdep.c
+++ b/gdb/tilegx-tdep.c
@@ -432,8 +432,22 @@ tilegx_analyze_prologue (struct gdbarch* gdbarch,
status = safe_frame_unwind_memory (next_frame, instbuf_start,
instbuf, instbuf_size);
- if (status == 0)
- memory_error (status, next_addr);
+ if (status == 0) {
+ /* fix gdb.base/gdb1250
+ * breakpoint is set before dynamic library loaded, thus gdb
+ * does a partial symbol name finding and sets the breakpoint
+ * in the plt stub. our 32-bundle prefetch window is too large
+ * for this situation to cause a memory access error.
+ * For plt stub, we just need to return directly.
+ *
+ * x86 does not have this problem, because the first instruction
+ * in their plt stub is jump, which ends the analysis also.
+ */
The comment style is not gnu style. The problems looks about plt. I
find tilegx port doesn't have a plt stub unwinder. I am not sure
creating a plt stub unwinder can fix this problem, but it should fix
other fails in testsuite.
+ if (strcmp(find_pc_section(instbuf_start)->the_bfd_section->name,
+ ".plt") == 0)
+ return instbuf_start;
+ memory_error (status, next_addr);
+ }
}
reverse_frame_valid = 0;
--
Yao (éå)