|
@@ -37,6 +37,19 @@ static int init_live_machine(struct machine *machine)
|
|
mmap_handler, machine, true, 500);
|
|
mmap_handler, machine, true, 500);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * We need to keep these functions global, despite the
|
|
|
|
+ * fact that they are used only locally in this object,
|
|
|
|
+ * in order to keep them around even if the binary is
|
|
|
|
+ * stripped. If they are gone, the unwind check for
|
|
|
|
+ * symbol fails.
|
|
|
|
+ */
|
|
|
|
+int test_dwarf_unwind__thread(struct thread *thread);
|
|
|
|
+int test_dwarf_unwind__compare(void *p1, void *p2);
|
|
|
|
+int test_dwarf_unwind__krava_3(struct thread *thread);
|
|
|
|
+int test_dwarf_unwind__krava_2(struct thread *thread);
|
|
|
|
+int test_dwarf_unwind__krava_1(struct thread *thread);
|
|
|
|
+
|
|
#define MAX_STACK 8
|
|
#define MAX_STACK 8
|
|
|
|
|
|
static int unwind_entry(struct unwind_entry *entry, void *arg)
|
|
static int unwind_entry(struct unwind_entry *entry, void *arg)
|
|
@@ -45,12 +58,12 @@ static int unwind_entry(struct unwind_entry *entry, void *arg)
|
|
char *symbol = entry->sym ? entry->sym->name : NULL;
|
|
char *symbol = entry->sym ? entry->sym->name : NULL;
|
|
static const char *funcs[MAX_STACK] = {
|
|
static const char *funcs[MAX_STACK] = {
|
|
"test__arch_unwind_sample",
|
|
"test__arch_unwind_sample",
|
|
- "unwind_thread",
|
|
|
|
- "compare",
|
|
|
|
|
|
+ "test_dwarf_unwind__thread",
|
|
|
|
+ "test_dwarf_unwind__compare",
|
|
"bsearch",
|
|
"bsearch",
|
|
- "krava_3",
|
|
|
|
- "krava_2",
|
|
|
|
- "krava_1",
|
|
|
|
|
|
+ "test_dwarf_unwind__krava_3",
|
|
|
|
+ "test_dwarf_unwind__krava_2",
|
|
|
|
+ "test_dwarf_unwind__krava_1",
|
|
"test__dwarf_unwind"
|
|
"test__dwarf_unwind"
|
|
};
|
|
};
|
|
/*
|
|
/*
|
|
@@ -77,7 +90,7 @@ static int unwind_entry(struct unwind_entry *entry, void *arg)
|
|
return strcmp((const char *) symbol, funcs[idx]);
|
|
return strcmp((const char *) symbol, funcs[idx]);
|
|
}
|
|
}
|
|
|
|
|
|
-static noinline int unwind_thread(struct thread *thread)
|
|
|
|
|
|
+noinline int test_dwarf_unwind__thread(struct thread *thread)
|
|
{
|
|
{
|
|
struct perf_sample sample;
|
|
struct perf_sample sample;
|
|
unsigned long cnt = 0;
|
|
unsigned long cnt = 0;
|
|
@@ -108,7 +121,7 @@ static noinline int unwind_thread(struct thread *thread)
|
|
|
|
|
|
static int global_unwind_retval = -INT_MAX;
|
|
static int global_unwind_retval = -INT_MAX;
|
|
|
|
|
|
-static noinline int compare(void *p1, void *p2)
|
|
|
|
|
|
+noinline int test_dwarf_unwind__compare(void *p1, void *p2)
|
|
{
|
|
{
|
|
/* Any possible value should be 'thread' */
|
|
/* Any possible value should be 'thread' */
|
|
struct thread *thread = *(struct thread **)p1;
|
|
struct thread *thread = *(struct thread **)p1;
|
|
@@ -117,17 +130,17 @@ static noinline int compare(void *p1, void *p2)
|
|
/* Call unwinder twice for both callchain orders. */
|
|
/* Call unwinder twice for both callchain orders. */
|
|
callchain_param.order = ORDER_CALLER;
|
|
callchain_param.order = ORDER_CALLER;
|
|
|
|
|
|
- global_unwind_retval = unwind_thread(thread);
|
|
|
|
|
|
+ global_unwind_retval = test_dwarf_unwind__thread(thread);
|
|
if (!global_unwind_retval) {
|
|
if (!global_unwind_retval) {
|
|
callchain_param.order = ORDER_CALLEE;
|
|
callchain_param.order = ORDER_CALLEE;
|
|
- global_unwind_retval = unwind_thread(thread);
|
|
|
|
|
|
+ global_unwind_retval = test_dwarf_unwind__thread(thread);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
return p1 - p2;
|
|
return p1 - p2;
|
|
}
|
|
}
|
|
|
|
|
|
-static noinline int krava_3(struct thread *thread)
|
|
|
|
|
|
+noinline int test_dwarf_unwind__krava_3(struct thread *thread)
|
|
{
|
|
{
|
|
struct thread *array[2] = {thread, thread};
|
|
struct thread *array[2] = {thread, thread};
|
|
void *fp = &bsearch;
|
|
void *fp = &bsearch;
|
|
@@ -141,18 +154,19 @@ static noinline int krava_3(struct thread *thread)
|
|
size_t, int (*)(void *, void *));
|
|
size_t, int (*)(void *, void *));
|
|
|
|
|
|
_bsearch = fp;
|
|
_bsearch = fp;
|
|
- _bsearch(array, &thread, 2, sizeof(struct thread **), compare);
|
|
|
|
|
|
+ _bsearch(array, &thread, 2, sizeof(struct thread **),
|
|
|
|
+ test_dwarf_unwind__compare);
|
|
return global_unwind_retval;
|
|
return global_unwind_retval;
|
|
}
|
|
}
|
|
|
|
|
|
-static noinline int krava_2(struct thread *thread)
|
|
|
|
|
|
+noinline int test_dwarf_unwind__krava_2(struct thread *thread)
|
|
{
|
|
{
|
|
- return krava_3(thread);
|
|
|
|
|
|
+ return test_dwarf_unwind__krava_3(thread);
|
|
}
|
|
}
|
|
|
|
|
|
-static noinline int krava_1(struct thread *thread)
|
|
|
|
|
|
+noinline int test_dwarf_unwind__krava_1(struct thread *thread)
|
|
{
|
|
{
|
|
- return krava_2(thread);
|
|
|
|
|
|
+ return test_dwarf_unwind__krava_2(thread);
|
|
}
|
|
}
|
|
|
|
|
|
int test__dwarf_unwind(struct test *test __maybe_unused, int subtest __maybe_unused)
|
|
int test__dwarf_unwind(struct test *test __maybe_unused, int subtest __maybe_unused)
|
|
@@ -189,7 +203,7 @@ int test__dwarf_unwind(struct test *test __maybe_unused, int subtest __maybe_unu
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|
|
- err = krava_1(thread);
|
|
|
|
|
|
+ err = test_dwarf_unwind__krava_1(thread);
|
|
thread__put(thread);
|
|
thread__put(thread);
|
|
|
|
|
|
out:
|
|
out:
|