bool branch,
                            struct branch_flags *flags,
                            struct iterations *iter,
-                           u64 branch_from)
+                           u64 branch_from,
+                           bool symbols)
 {
        struct map_symbol ms = {};
        struct addr_location al;
                        }
                        goto out;
                }
-               thread__find_symbol(thread, *cpumode, ip, &al);
+               if (symbols)
+                       thread__find_symbol(thread, *cpumode, ip, &al);
        }
 
        if (al.sym != NULL) {
                                       struct symbol **parent,
                                       struct addr_location *root_al,
                                       u64 branch_from,
-                                      bool callee, int end)
+                                      bool callee, int end,
+                                      bool symbols)
 {
        struct ip_callchain *chain = sample->callchain;
        u8 cpumode = PERF_RECORD_MISC_USER;
                for (i = 0; i < end + 1; i++) {
                        err = add_callchain_ip(thread, cursor, parent,
                                               root_al, &cpumode, chain->ips[i],
-                                              false, NULL, NULL, branch_from);
+                                              false, NULL, NULL, branch_from,
+                                              symbols);
                        if (err)
                                return err;
                }
        for (i = end; i >= 0; i--) {
                err = add_callchain_ip(thread, cursor, parent,
                                       root_al, &cpumode, chain->ips[i],
-                                      false, NULL, NULL, branch_from);
+                                      false, NULL, NULL, branch_from,
+                                      symbols);
                if (err)
                        return err;
        }
                                    struct symbol **parent,
                                    struct addr_location *root_al,
                                    u64 *branch_from,
-                                   bool callee)
+                                   bool callee,
+                                   bool symbols)
 {
        struct branch_stack *lbr_stack = sample->branch_stack;
        struct branch_entry *entries = perf_sample__branch_entries(sample);
                err = add_callchain_ip(thread, cursor, parent,
                                       root_al, &cpumode, ip,
                                       true, flags, NULL,
-                                      *branch_from);
+                                      *branch_from, symbols);
                if (err)
                        return err;
 
                        err = add_callchain_ip(thread, cursor, parent,
                                               root_al, &cpumode, ip,
                                               true, flags, NULL,
-                                              *branch_from);
+                                              *branch_from, symbols);
                        if (err)
                                return err;
                        save_lbr_cursor_node(thread, cursor, i);
                err = add_callchain_ip(thread, cursor, parent,
                                       root_al, &cpumode, ip,
                                       true, flags, NULL,
-                                      *branch_from);
+                                      *branch_from, symbols);
                if (err)
                        return err;
                save_lbr_cursor_node(thread, cursor, i);
                err = add_callchain_ip(thread, cursor, parent,
                                root_al, &cpumode, ip,
                                true, flags, NULL,
-                               *branch_from);
+                               *branch_from, symbols);
                if (err)
                        return err;
        }
                                        struct symbol **parent,
                                        struct addr_location *root_al,
                                        int max_stack,
-                                       unsigned int max_lbr)
+                                       unsigned int max_lbr,
+                                       bool symbols)
 {
        bool callee = (callchain_param.order == ORDER_CALLEE);
        struct ip_callchain *chain = sample->callchain;
                /* Add kernel ip */
                err = lbr_callchain_add_kernel_ip(thread, cursor, sample,
                                                  parent, root_al, branch_from,
-                                                 true, i);
+                                                 true, i, symbols);
                if (err)
                        goto error;
 
                err = lbr_callchain_add_lbr_ip(thread, cursor, sample, parent,
-                                              root_al, &branch_from, true);
+                                              root_al, &branch_from, true, symbols);
                if (err)
                        goto error;
 
                                goto error;
                }
                err = lbr_callchain_add_lbr_ip(thread, cursor, sample, parent,
-                                              root_al, &branch_from, false);
+                                              root_al, &branch_from, false, symbols);
                if (err)
                        goto error;
 
                /* Add kernel ip */
                err = lbr_callchain_add_kernel_ip(thread, cursor, sample,
                                                  parent, root_al, branch_from,
-                                                 false, i);
+                                                 false, i, symbols);
                if (err)
                        goto error;
        }
                             struct callchain_cursor *cursor,
                             struct symbol **parent,
                             struct addr_location *root_al,
-                            u8 *cpumode, int ent)
+                            u8 *cpumode, int ent, bool symbols)
 {
        int err = 0;
 
                if (ip >= PERF_CONTEXT_MAX) {
                        err = add_callchain_ip(thread, cursor, parent,
                                               root_al, cpumode, ip,
-                                              false, NULL, NULL, 0);
+                                              false, NULL, NULL, 0, symbols);
                        break;
                }
        }
                                            struct perf_sample *sample,
                                            struct symbol **parent,
                                            struct addr_location *root_al,
-                                           int max_stack)
+                                           int max_stack,
+                                           bool symbols)
 {
        struct branch_stack *branch = sample->branch_stack;
        struct branch_entry *entries = perf_sample__branch_entries(sample);
 
                err = resolve_lbr_callchain_sample(thread, cursor, sample, parent,
                                                   root_al, max_stack,
-                                                  !env ? 0 : env->max_branches);
+                                                  !env ? 0 : env->max_branches,
+                                                  symbols);
                if (err)
                        return (err < 0) ? err : 0;
        }
                                               root_al,
                                               NULL, be[i].to,
                                               true, &be[i].flags,
-                                              NULL, be[i].from);
+                                              NULL, be[i].from, symbols);
 
-                       if (!err)
+                       if (!err) {
                                err = add_callchain_ip(thread, cursor, parent, root_al,
                                                       NULL, be[i].from,
                                                       true, &be[i].flags,
-                                                      &iter[i], 0);
+                                                      &iter[i], 0, symbols);
+                       }
                        if (err == -EINVAL)
                                break;
                        if (err)
 check_calls:
        if (chain && callchain_param.order != ORDER_CALLEE) {
                err = find_prev_cpumode(chain, thread, cursor, parent, root_al,
-                                       &cpumode, chain->nr - first_call);
+                                       &cpumode, chain->nr - first_call, symbols);
                if (err)
                        return (err < 0) ? err : 0;
        }
                        ++nr_entries;
                else if (callchain_param.order != ORDER_CALLEE) {
                        err = find_prev_cpumode(chain, thread, cursor, parent,
-                                               root_al, &cpumode, j);
+                                               root_al, &cpumode, j, symbols);
                        if (err)
                                return (err < 0) ? err : 0;
                        continue;
                        if (leaf_frame_caller && leaf_frame_caller != ip) {
 
                                err = add_callchain_ip(thread, cursor, parent,
-                                              root_al, &cpumode, leaf_frame_caller,
-                                              false, NULL, NULL, 0);
+                                               root_al, &cpumode, leaf_frame_caller,
+                                               false, NULL, NULL, 0, symbols);
                                if (err)
                                        return (err < 0) ? err : 0;
                        }
 
                err = add_callchain_ip(thread, cursor, parent,
                                       root_al, &cpumode, ip,
-                                      false, NULL, NULL, 0);
+                                      false, NULL, NULL, 0, symbols);
 
                if (err)
                        return (err < 0) ? err : 0;
                                            struct callchain_cursor *cursor,
                                            struct evsel *evsel,
                                            struct perf_sample *sample,
-                                           int max_stack)
+                                           int max_stack, bool symbols)
 {
        /* Can we do dwarf post unwind? */
        if (!((evsel->core.attr.sample_type & PERF_SAMPLE_REGS_USER) &&
            (!sample->user_stack.size))
                return 0;
 
+       if (!symbols)
+               pr_debug("Not resolving symbols with an unwinder isn't currently supported\n");
+
        return unwind__get_entries(unwind_entry, cursor,
                                   thread, sample, max_stack, false);
 }
 
-int thread__resolve_callchain(struct thread *thread,
-                             struct callchain_cursor *cursor,
-                             struct evsel *evsel,
-                             struct perf_sample *sample,
-                             struct symbol **parent,
-                             struct addr_location *root_al,
-                             int max_stack)
+int __thread__resolve_callchain(struct thread *thread,
+                               struct callchain_cursor *cursor,
+                               struct evsel *evsel,
+                               struct perf_sample *sample,
+                               struct symbol **parent,
+                               struct addr_location *root_al,
+                               int max_stack,
+                               bool symbols)
 {
        int ret = 0;
 
                ret = thread__resolve_callchain_sample(thread, cursor,
                                                       evsel, sample,
                                                       parent, root_al,
-                                                      max_stack);
+                                                      max_stack, symbols);
                if (ret)
                        return ret;
                ret = thread__resolve_callchain_unwind(thread, cursor,
                                                       evsel, sample,
-                                                      max_stack);
+                                                      max_stack, symbols);
        } else {
                ret = thread__resolve_callchain_unwind(thread, cursor,
                                                       evsel, sample,
-                                                      max_stack);
+                                                      max_stack, symbols);
                if (ret)
                        return ret;
                ret = thread__resolve_callchain_sample(thread, cursor,
                                                       evsel, sample,
                                                       parent, root_al,
-                                                      max_stack);
+                                                      max_stack, symbols);
        }
 
        return ret;