Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH] 32 bit-ism in lm32-tdep.c (and some sloppy macros)
@ 2011-11-11 23:38 Werner Almesberger
  2011-11-14 15:49 ` Tom Tromey
  0 siblings, 1 reply; 10+ messages in thread
From: Werner Almesberger @ 2011-11-11 23:38 UTC (permalink / raw)
  To: gdb-patches; +Cc: Jon Beniston

Hello,

since at least gdb 7.1, stack traces (where or bt) of LM32 failed
on 64 bit hosts after just a few frames with

  Backtrace stopped: previous frame inner to this frame (corrupt stack?)

The reason for this is that stack frames weren't unwound correctly.
The bug is in the LM32_IMM16 macro, which tries to do sign expansion
by shifting the value to the left edge of a long, expecting it to
be 32 bits. This trick produces incorrect results on 64 bit systems.

I've observed this problem in all gdb versions I tried, namely 7.1
through 7.3.1.

The patch below delegates the work of figuring out such details to
the compiler. I've also taken the liberty of protecting all the
macro arguments, just in case.

- Werner

--- gdb-7.3.1/gdb/lm32-tdep.c.orig	2011-11-11 18:03:54.000000000 -0300
+++ gdb-7.3.1/gdb/lm32-tdep.c	2011-11-11 18:04:24.000000000 -0300
@@ -40,11 +40,11 @@
 #include "gdb_string.h"
 
 /* Macros to extract fields from an instruction.  */
-#define LM32_OPCODE(insn)       ((insn >> 26) & 0x3f)
-#define LM32_REG0(insn)         ((insn >> 21) & 0x1f)
-#define LM32_REG1(insn)         ((insn >> 16) & 0x1f)
-#define LM32_REG2(insn)         ((insn >> 11) & 0x1f)
-#define LM32_IMM16(insn)        ((((long)insn & 0xffff) << 16) >> 16)
+#define LM32_OPCODE(insn)       (((insn) >> 26) & 0x3f)
+#define LM32_REG0(insn)         (((insn) >> 21) & 0x1f)
+#define LM32_REG1(insn)         (((insn) >> 16) & 0x1f)
+#define LM32_REG2(insn)         (((insn) >> 11) & 0x1f)
+#define LM32_IMM16(insn)        ((long) (int16_t) (insn))
 
 struct gdbarch_tdep
 {
_______________________________________________
http://lists.milkymist.org/listinfo.cgi/devel-milkymist.org
IRC: #milkymist@Freenode

----- End forwarded message -----


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2011-11-23 19:19 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-11 23:38 [PATCH] 32 bit-ism in lm32-tdep.c (and some sloppy macros) Werner Almesberger
2011-11-14 15:49 ` Tom Tromey
2011-11-14 15:55   ` Jon Beniston
2011-11-14 15:58     ` Tom Tromey
2011-11-14 16:12   ` Pedro Alves
2011-11-14 16:21     ` Tom Tromey
2011-11-14 16:28       ` Pedro Alves
2011-11-14 16:41         ` Tom Tromey
2011-11-23 14:16       ` Mark Kettenis
2011-11-23 19:19       ` Mike Frysinger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox