@@ -671,8 +671,14 @@ elf_nodebug (struct backtrace_state *state, uintptr_t pc,
bdata.full_error_callback = error_callback;
bdata.full_data = data;
bdata.ret = 0;
- state->syminfo_fn (state, pc, backtrace_syminfo_to_full_callback,
- backtrace_syminfo_to_full_error_callback, &bdata);
+ if (state->moredata)
+ state->syminfo_fn (state, pc,
+ backtrace_syminfo_to_full_callback_moredata,
+ backtrace_syminfo_to_full_error_callback_moredata,
+ &bdata);
+ else
+ state->syminfo_fn (state, pc, backtrace_syminfo_to_full_callback,
+ backtrace_syminfo_to_full_error_callback, &bdata);
return bdata.ret;
}
@@ -63,6 +63,7 @@ POSSIBILITY OF SUCH DAMAGE. */
#include <windows.h>
#endif
+#include <string.h>
#include "backtrace.h"
#include "internal.h"
@@ -425,15 +426,31 @@ backtrace_syminfo_to_full_callback (void *data, uintptr_t pc,
{
struct backtrace_call_full *bdata = (struct backtrace_call_full *) data;
- /* If STATE->MOREDATA is set, then data will point to a
- backtrace_moredata struct, which is what full_callback expects. */
-
bdata->ret = bdata->full_callback (bdata->full_data, pc, NULL, 0, symname);
}
+/* Variant of backtrace_syminfo_to_full_callback that handles the exta wrapping
+ of moredata. */
+
+void
+backtrace_syminfo_to_full_callback_moredata (void *data, uintptr_t pc,
+ const char *symname,
+ uintptr_t symval ATTRIBUTE_UNUSED,
+ uintptr_t symsize ATTRIBUTE_UNUSED)
+{
+ struct backtrace_moredata *md = (struct backtrace_moredata *) data;
+ struct backtrace_moredata callback_md;
+ struct backtrace_call_full *bdata;
+
+ bdata = (struct backtrace_call_full *) md->backtrace_data;
+ memset (&callback_md, 0, sizeof callback_md);
+ callback_md.backtrace_version = BACKTRACE_MOREDATA_VERSION;
+ callback_md.backtrace_data = bdata->full_data;
+ bdata->ret = bdata->full_callback (&callback_md, pc, NULL, 0, symname);
+}
+
/* An error callback that corresponds to
backtrace_syminfo_to_full_callback. */
-
void
backtrace_syminfo_to_full_error_callback (void *data, const char *msg,
int errnum)
@@ -442,3 +459,14 @@ backtrace_syminfo_to_full_error_callback (void *data, const char *msg,
bdata->full_error_callback (bdata->full_data, msg, errnum);
}
+
+void
+backtrace_syminfo_to_full_error_callback_moredata (void *data, const char *msg,
+ int errnum)
+{
+ struct backtrace_moredata *md = (struct backtrace_moredata *) data;
+ struct backtrace_call_full *bdata;
+
+ bdata = (struct backtrace_call_full *) md->backtrace_data;
+ bdata->full_error_callback (bdata->full_data, msg, errnum);
+}
@@ -395,12 +395,18 @@ extern void backtrace_syminfo_to_full_callback (void *data, uintptr_t pc,
const char *symname,
uintptr_t symval,
uintptr_t symsize);
+extern void backtrace_syminfo_to_full_callback_moredata (void *data, uintptr_t pc,
+ const char *symname,
+ uintptr_t symval,
+ uintptr_t symsize);
/* An error callback that corresponds to
backtrace_syminfo_to_full_callback. */
extern void backtrace_syminfo_to_full_error_callback (void *, const char *,
int);
+extern void backtrace_syminfo_to_full_error_callback_moredata (void *, const char *,
+ int);
/* A test-only hook for elf_uncompress_zdebug. */
@@ -629,7 +629,7 @@ coff_syminfo (struct backtrace_state *state, uintptr_t addr,
else
{
memset (&md, 0, sizeof md);
- md.backtrace_version = 3;
+ md.backtrace_version = BACKTRACE_MOREDATA_VERSION;
md.backtrace_data = data;
mdata = (void *) &md;
}
@@ -54,7 +54,7 @@ unknown_fileline (struct backtrace_state *state, uintptr_t pc,
struct backtrace_moredata md;
memset (&md, 0, sizeof md);
- md.backtrace_version = 3;
+ md.backtrace_version = BACKTRACE_MOREDATA_VERSION;
md.backtrace_data = data;
return callback ((void *) &md, pc, NULL, 0, NULL);
}
@@ -554,7 +554,7 @@ xcoff_syminfo (struct backtrace_state *state ATTRIBUTE_UNUSED, uintptr_t addr,
else
{
memset (&md, 0, sizeof md);
- md.backtrace_version = 3;
+ md.backtrace_version = BACKTRACE_MOREDATA_VERSION;
md.backtrace_data = data;
mdata = (void *) &md;
}
@@ -825,7 +825,7 @@ xcoff_lookup_pc (struct backtrace_state *state,
struct backtrace_moredata md;
memset (&md, 0, sizeof md);
- md.backtrace_version = 3;
+ md.backtrace_version = BACKTRACE_MOREDATA_VERSION;
md.backtrace_data = data;
return callback ((void *) &md, pc, filename, lnno, function);
}
@@ -885,9 +885,9 @@ xcoff_fileline (struct backtrace_state *state, uintptr_t pc,
struct backtrace_moredata md;
memset (&md, 0, sizeof md);
- md.backtrace_version = 3;
+ md.backtrace_version = BACKTRACE_MOREDATA_VERSION;
md.backtrace_data = data;
- return callback ((void *) data, pc, NULL, 0, NULL);
+ return callback ((void *) &md, pc, NULL, 0, NULL);
}
}