Commit | Line | Data |
---|---|---|
5489fcc3 KR |
1 | #ifndef symtab_h |
2 | #define symtab_h | |
3 | ||
4 | #include "bfd.h" | |
5 | #include "gprof.h" | |
6 | ||
7 | /* | |
8 | * For a profile to be intelligible to a human user, it is necessary | |
9 | * to map code-addresses into source-code information. Source-code | |
10 | * information can be any combination of: (i) function-name, (ii) | |
11 | * source file-name, and (iii) source line number. | |
12 | * | |
13 | * The symbol table is used to map addresses into source-code | |
14 | * information. | |
15 | */ | |
16 | ||
17 | #include "source.h" | |
18 | ||
19 | /* | |
20 | * Symbol-entry. For each external in the specified file we gather | |
21 | * its address, the number of calls and compute its share of cpu time. | |
22 | */ | |
12516a37 KR |
23 | typedef struct sym |
24 | { | |
5489fcc3 KR |
25 | /* |
26 | * Common information: | |
27 | * | |
28 | * In the symbol-table, fields ADDR and FUNC_NAME are guaranteed | |
29 | * to contain valid information. FILE may be 0, if unknown and | |
30 | * LINE_NUM maybe 0 if unknown. | |
31 | */ | |
12516a37 KR |
32 | bfd_vma addr; /* address of entry point */ |
33 | bfd_vma end_addr; /* end-address */ | |
34 | const char *name; /* name of function this sym is from */ | |
35 | Source_File *file; /* source file symbol comes from */ | |
36 | int line_num; /* source line number */ | |
37 | unsigned int is_func:1, /* is this a function entry point? */ | |
38 | is_static:1, /* is this a local (static) symbol? */ | |
39 | is_bb_head:1; /* is this the head of a basic-blk? */ | |
40 | int ncalls; /* how many times executed */ | |
41 | struct sym *next; /* for building chains of syms */ | |
5489fcc3 KR |
42 | |
43 | /* profile-specific information: */ | |
44 | ||
45 | /* histogram specific info: */ | |
12516a37 KR |
46 | struct |
47 | { | |
48 | double time; /* (weighted) ticks in this routine */ | |
49 | bfd_vma scaled_addr; /* scaled entry point */ | |
50 | } | |
51 | hist; | |
5489fcc3 KR |
52 | |
53 | /* call-graph specific info: */ | |
12516a37 KR |
54 | struct |
55 | { | |
56 | int self_calls; /* how many calls to self */ | |
57 | double child_time; /* cumulative ticks in children */ | |
58 | int index; /* index in the graph list */ | |
59 | int top_order; /* graph call chain top-sort order */ | |
60 | bool print_flag; /* should this be printed? */ | |
61 | struct | |
62 | { | |
63 | double fract; /* what % of time propagates */ | |
64 | double self; /* how much self time propagates */ | |
65 | double child; /* how much child time propagates */ | |
66 | } | |
67 | prop; | |
68 | struct | |
69 | { | |
70 | int num; /* internal number of cycle on */ | |
71 | struct sym *head; /* head of cycle */ | |
72 | struct sym *next; /* next member of cycle */ | |
73 | } | |
74 | cyc; | |
75 | struct arc *parents; /* list of caller arcs */ | |
76 | struct arc *children; /* list of callee arcs */ | |
77 | } | |
78 | cg; | |
79 | } | |
80 | Sym; | |
5489fcc3 KR |
81 | |
82 | /* | |
83 | * Symbol-tables are always assumed to be sorted in increasing order | |
84 | * of addresses: | |
85 | */ | |
12516a37 KR |
86 | typedef struct |
87 | { | |
88 | int len; /* # of symbols in this table */ | |
89 | Sym *base; /* first element in symbol table */ | |
90 | Sym *limit; /* limit = base + len */ | |
91 | } | |
92 | Sym_Table; | |
5489fcc3 | 93 | |
12516a37 | 94 | extern Sym_Table symtab; /* the symbol table */ |
5489fcc3 | 95 | |
12516a37 KR |
96 | extern void sym_init PARAMS ((Sym * sym)); |
97 | extern void symtab_finalize PARAMS ((Sym_Table * symtab)); | |
98 | extern Sym *sym_lookup PARAMS ((Sym_Table * symtab, bfd_vma address)); | |
5489fcc3 KR |
99 | |
100 | #endif /* symtab_h */ |