summaryrefslogtreecommitdiff
path: root/libbacktrace/btest.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbacktrace/btest.c')
-rw-r--r--libbacktrace/btest.c267
1 files changed, 13 insertions, 254 deletions
diff --git a/libbacktrace/btest.c b/libbacktrace/btest.c
index 92cb325fdce..30d9e14526c 100644
--- a/libbacktrace/btest.c
+++ b/libbacktrace/btest.c
@@ -43,237 +43,7 @@ POSSIBILITY OF SUCH DAMAGE. */
#include "backtrace.h"
#include "backtrace-supported.h"
-/* Portable attribute syntax. Actually some of these tests probably
- won't work if the attributes are not recognized. */
-
-#ifndef GCC_VERSION
-# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
-#endif
-
-#if (GCC_VERSION < 2007)
-# define __attribute__(x)
-#endif
-
-#ifndef ATTRIBUTE_UNUSED
-# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-#endif
-
-/* Used to collect backtrace info. */
-
-struct info
-{
- char *filename;
- int lineno;
- char *function;
-};
-
-/* Passed to backtrace callback function. */
-
-struct bdata
-{
- struct info *all;
- size_t index;
- size_t max;
- int failed;
-};
-
-/* Passed to backtrace_simple callback function. */
-
-struct sdata
-{
- uintptr_t *addrs;
- size_t index;
- size_t max;
- int failed;
-};
-
-/* Passed to backtrace_syminfo callback function. */
-
-struct symdata
-{
- const char *name;
- uintptr_t val, size;
- int failed;
-};
-
-/* The backtrace state. */
-
-static void *state;
-
-/* The number of failures. */
-
-static int failures;
-
-/* Return the base name in a path. */
-
-static const char *
-base (const char *p)
-{
- const char *last;
- const char *s;
-
- last = NULL;
- for (s = p; *s != '\0'; ++s)
- {
- if (IS_DIR_SEPARATOR (*s))
- last = s + 1;
- }
- return last != NULL ? last : p;
-}
-
-/* Check an entry in a struct info array. */
-
-static void
-check (const char *name, int index, const struct info *all, int want_lineno,
- const char *want_function, int *failed)
-{
- if (*failed)
- return;
- if (all[index].filename == NULL || all[index].function == NULL)
- {
- fprintf (stderr, "%s: [%d]: missing file name or function name\n",
- name, index);
- *failed = 1;
- return;
- }
- if (strcmp (base (all[index].filename), "btest.c") != 0)
- {
- fprintf (stderr, "%s: [%d]: got %s expected test.c\n", name, index,
- all[index].filename);
- *failed = 1;
- }
- if (all[index].lineno != want_lineno)
- {
- fprintf (stderr, "%s: [%d]: got %d expected %d\n", name, index,
- all[index].lineno, want_lineno);
- *failed = 1;
- }
- if (strcmp (all[index].function, want_function) != 0)
- {
- fprintf (stderr, "%s: [%d]: got %s expected %s\n", name, index,
- all[index].function, want_function);
- *failed = 1;
- }
-}
-
-/* The backtrace callback function. */
-
-static int
-callback_one (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED,
- const char *filename, int lineno, const char *function)
-{
- struct bdata *data = (struct bdata *) vdata;
- struct info *p;
-
- if (data->index >= data->max)
- {
- fprintf (stderr, "callback_one: callback called too many times\n");
- data->failed = 1;
- return 1;
- }
-
- p = &data->all[data->index];
- if (filename == NULL)
- p->filename = NULL;
- else
- {
- p->filename = strdup (filename);
- assert (p->filename != NULL);
- }
- p->lineno = lineno;
- if (function == NULL)
- p->function = NULL;
- else
- {
- p->function = strdup (function);
- assert (p->function != NULL);
- }
- ++data->index;
-
- return 0;
-}
-
-/* An error callback passed to backtrace. */
-
-static void
-error_callback_one (void *vdata, const char *msg, int errnum)
-{
- struct bdata *data = (struct bdata *) vdata;
-
- fprintf (stderr, "%s", msg);
- if (errnum > 0)
- fprintf (stderr, ": %s", strerror (errnum));
- fprintf (stderr, "\n");
- data->failed = 1;
-}
-
-/* The backtrace_simple callback function. */
-
-static int
-callback_two (void *vdata, uintptr_t pc)
-{
- struct sdata *data = (struct sdata *) vdata;
-
- if (data->index >= data->max)
- {
- fprintf (stderr, "callback_two: callback called too many times\n");
- data->failed = 1;
- return 1;
- }
-
- data->addrs[data->index] = pc;
- ++data->index;
-
- return 0;
-}
-
-/* An error callback passed to backtrace_simple. */
-
-static void
-error_callback_two (void *vdata, const char *msg, int errnum)
-{
- struct sdata *data = (struct sdata *) vdata;
-
- fprintf (stderr, "%s", msg);
- if (errnum > 0)
- fprintf (stderr, ": %s", strerror (errnum));
- fprintf (stderr, "\n");
- data->failed = 1;
-}
-
-/* The backtrace_syminfo callback function. */
-
-static void
-callback_three (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED,
- const char *symname, uintptr_t symval,
- uintptr_t symsize)
-{
- struct symdata *data = (struct symdata *) vdata;
-
- if (symname == NULL)
- data->name = NULL;
- else
- {
- data->name = strdup (symname);
- assert (data->name != NULL);
- }
- data->val = symval;
- data->size = symsize;
-}
-
-/* The backtrace_syminfo error callback function. */
-
-static void
-error_callback_three (void *vdata, const char *msg, int errnum)
-{
- struct symdata *data = (struct symdata *) vdata;
-
- fprintf (stderr, "%s", msg);
- if (errnum > 0)
- fprintf (stderr, ": %s", strerror (errnum));
- fprintf (stderr, "\n");
- data->failed = 1;
-}
+#include "testlib.h"
/* Test the backtrace function with non-inlined functions. */
@@ -325,9 +95,9 @@ f3 (int f1line, int f2line)
data.failed = 1;
}
- check ("test1", 0, all, f3line, "f3", &data.failed);
- check ("test1", 1, all, f2line, "f2", &data.failed);
- check ("test1", 2, all, f1line, "test1", &data.failed);
+ check ("test1", 0, all, f3line, "f3", "btest.c", &data.failed);
+ check ("test1", 1, all, f2line, "f2", "btest.c", &data.failed);
+ check ("test1", 2, all, f1line, "test1", "btest.c", &data.failed);
printf ("%s: backtrace_full noinline\n", data.failed ? "FAIL" : "PASS");
@@ -377,9 +147,9 @@ f13 (int f1line, int f2line)
data.failed = 1;
}
- check ("test2", 0, all, f3line, "f13", &data.failed);
- check ("test2", 1, all, f2line, "f12", &data.failed);
- check ("test2", 2, all, f1line, "test2", &data.failed);
+ check ("test2", 0, all, f3line, "f13", "btest.c", &data.failed);
+ check ("test2", 1, all, f2line, "f12", "btest.c", &data.failed);
+ check ("test2", 2, all, f1line, "test2", "btest.c", &data.failed);
printf ("%s: backtrace_full inline\n", data.failed ? "FAIL" : "PASS");
@@ -462,9 +232,9 @@ f23 (int f1line, int f2line)
}
}
- check ("test3", 0, all, f3line, "f23", &bdata.failed);
- check ("test3", 1, all, f2line, "f22", &bdata.failed);
- check ("test3", 2, all, f1line, "test3", &bdata.failed);
+ check ("test3", 0, all, f3line, "f23", "btest.c", &bdata.failed);
+ check ("test3", 1, all, f2line, "f22", "btest.c", &bdata.failed);
+ check ("test3", 2, all, f1line, "test3", "btest.c", &bdata.failed);
if (bdata.failed)
data.failed = 1;
@@ -600,9 +370,9 @@ f33 (int f1line, int f2line)
bdata.failed = 1;
}
- check ("test4", 0, all, f3line, "f33", &bdata.failed);
- check ("test4", 1, all, f2line, "f32", &bdata.failed);
- check ("test4", 2, all, f1line, "test4", &bdata.failed);
+ check ("test4", 0, all, f3line, "f33", "btest.c", &bdata.failed);
+ check ("test4", 1, all, f2line, "f32", "btest.c", &bdata.failed);
+ check ("test4", 2, all, f1line, "test4", "btest.c", &bdata.failed);
if (bdata.failed)
data.failed = 1;
@@ -686,17 +456,6 @@ test5 (void)
return failures;
}
-static void
-error_callback_create (void *data ATTRIBUTE_UNUSED, const char *msg,
- int errnum)
-{
- fprintf (stderr, "%s", msg);
- if (errnum > 0)
- fprintf (stderr, ": %s", strerror (errnum));
- fprintf (stderr, "\n");
- exit (EXIT_FAILURE);
-}
-
/* Run all the tests. */
int