69 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * call-path.h: Manipulate a tree data structure containing function call paths4 * Copyright (c) 2014, Intel Corporation.5 */6 7#ifndef __PERF_CALL_PATH_H8#define __PERF_CALL_PATH_H9 10#include <sys/types.h>11 12#include <linux/types.h>13#include <linux/rbtree.h>14 15/**16 * struct call_path - node in list of calls leading to a function call.17 * @parent: call path to the parent function call18 * @sym: symbol of function called19 * @ip: only if sym is null, the ip of the function20 * @db_id: id used for db-export21 * @in_kernel: whether function is a in the kernel22 * @rb_node: node in parent's tree of called functions23 * @children: tree of call paths of functions called24 *25 * In combination with the call_return structure, the call_path structure26 * defines a context-sensitive call-graph.27 */28struct call_path {29 struct call_path *parent;30 struct symbol *sym;31 u64 ip;32 u64 db_id;33 bool in_kernel;34 struct rb_node rb_node;35 struct rb_root children;36};37 38#define CALL_PATH_BLOCK_SHIFT 839#define CALL_PATH_BLOCK_SIZE (1 << CALL_PATH_BLOCK_SHIFT)40#define CALL_PATH_BLOCK_MASK (CALL_PATH_BLOCK_SIZE - 1)41 42struct call_path_block {43 struct call_path cp[CALL_PATH_BLOCK_SIZE];44 struct list_head node;45};46 47/**48 * struct call_path_root - root of all call paths.49 * @call_path: root call path50 * @blocks: list of blocks to store call paths51 * @next: next free space52 * @sz: number of spaces53 */54struct call_path_root {55 struct call_path call_path;56 struct list_head blocks;57 size_t next;58 size_t sz;59};60 61struct call_path_root *call_path_root__new(void);62void call_path_root__free(struct call_path_root *cpr);63 64struct call_path *call_path__findnew(struct call_path_root *cpr,65 struct call_path *parent,66 struct symbol *sym, u64 ip, u64 ks);67 68#endif69