This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hello Looks like we're no longer able to call functions on sparc target when the function hasn't been compiled with debugging information. I noticed this because calls to functions taking strings as an argument were now causing the debugger to crash - but the problem can be reduced to calling "malloc": (gdb) p malloc (1) zsh: 21029 segmentation fault (core dumped) ../gdb-head/gdb/gdb hello The problem has been introduced during the enhancement for multiple calling conventions, for which we added an extra argument (the function type) to the "struct_return" gdbarch method. The sparc-tdep.c code was then changed as follow: - if (using_struct_return (value_type)) + if (using_struct_return (SYMBOL_TYPE (find_pc_function (funcaddr)), + value_type)) Because "malloc" hasn't been compiled with debugging info, find_pc_function return NULL, and so SYMBOL_TYPE causes a SEGV. One approach would be to enhance the code above to also handle function calls when no symbol is found. This is what find_function_in_inferior does, and we could do something similar. But seems a bit absurd to do that, because we don't have multiple calling conventions on sparc. So finding the type would be useless. Following on the last observation, another way of fixing the problem would be to simply pass NULL as the function type to using_struct_return, since we don't need to check the function type to do what we need to do in this case. One final approach is to change the code in sparc32_push_dummy_code to call sparc32_return_value directly, instead of going through using_struct_return. That was more appealing that computing the function type, but that hard code the assumption that the return_value gdbarch method is in fact sparc32_return_value, and also re-introduces a new instance of "current_gdbarch". I think the best way to go in this case is option 2, which is to accept NULL as the function type, and document that fact. This is what my patch does. I checked Corinna's patch (which introduced this extra parameter), and there are only 2 instances that really use that new parameter, both in sh-tdep.c: sh_return_value_nofpu and sh_return_value_fpu. They already both handle the case when the function type is NULL by defaulting to the user-setting "set sh calling-convention". 2008-04-29 Joel Brobecker <brobecker@adacore.com> * gdbarch.sh: Document the return_value method. Explain that the FUNCTYPE parameter might be NULL. * gdbarch.h: Regenerated. * sparc-tdep.c (sparc32_push_dummy_code): Do not pass the function type when calling using_struct_return, as this is unnecessary on this target. Tested on sparc-solaris. Fixes many many regressions in gdb.ada, gdb.base and gdb.gdb. OK to apply? Thanks, -- Joel
Attachment:
struct_return.diff
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |