+2004-11-23 Joel Brobecker <brobecker@gnat.com>
+
+ * sparc-tdep.c (sparc_is_unimp_insn): New function.
+ (sparc32_frame_cache): For functions where there is no debugging
+ information to help us determine whether it's a struct-return
+ function or not, fallback on checking whether the instruction
+ at the return address is an "unimp" instruction or not.
+
2004-11-22 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* MAINTAINERS: Add myself to write after approval section.
}
\f
+/* Return non-zero if the instruction corresponding to PC is an "unimp"
+ instruction. */
+
+static int
+sparc_is_unimp_insn (CORE_ADDR pc)
+{
+ const unsigned long insn = sparc_fetch_instruction (pc);
+
+ return ((insn & 0xc1c00000) == 0);
+}
+
/* OpenBSD/sparc includes StackGhost, which according to the author's
website http://stackghost.cerias.purdue.edu "... transparently and
automatically protects applications' stack frames; more
cache->struct_return_p = 1;
}
}
+ else
+ {
+ /* There is no debugging information for this function to
+ help us determine whether this function returns a struct
+ or not. So we rely on another heuristic which is to check
+ the instruction at the return address and see if this is
+ an "unimp" instruction. If it is, then it is a struct-return
+ function. */
+ CORE_ADDR pc;
+ int regnum = cache->frameless_p ? SPARC_O7_REGNUM : SPARC_I7_REGNUM;
+
+ pc = frame_unwind_register_unsigned (next_frame, regnum) + 8;
+ if (sparc_is_unimp_insn (pc))
+ cache->struct_return_p = 1;
+ }
return cache;
}