]>
Commit | Line | Data |
---|---|---|
252b5132 RH |
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 | #define NBBS 10 | |
20 | ||
21 | /* | |
22 | * Symbol-entry. For each external in the specified file we gather | |
23 | * its address, the number of calls and compute its share of cpu time. | |
24 | */ | |
25 | typedef struct sym | |
26 | { | |
27 | /* | |
28 | * Common information: | |
29 | * | |
30 | * In the symbol-table, fields ADDR and FUNC_NAME are guaranteed | |
31 | * to contain valid information. FILE may be 0, if unknown and | |
32 | * LINE_NUM maybe 0 if unknown. | |
33 | */ | |
34 | bfd_vma addr; /* address of entry point */ | |
35 | bfd_vma end_addr; /* end-address */ | |
36 | const char *name; /* name of function this sym is from */ | |
37 | Source_File *file; /* source file symbol comes from */ | |
38 | int line_num; /* source line number */ | |
39 | unsigned int is_func:1, /* is this a function entry point? */ | |
40 | is_static:1, /* is this a local (static) symbol? */ | |
41 | is_bb_head:1, /* is this the head of a basic-blk? */ | |
42 | mapped:1, /* this symbol was mapped to another name */ | |
43 | has_been_placed:1; /* have we placed this symbol? */ | |
44 | unsigned long ncalls; /* how many times executed */ | |
45 | int nuses; /* how many times this symbol appears in | |
46 | a particular context */ | |
47 | bfd_vma bb_addr[NBBS]; /* address of basic-block start */ | |
48 | unsigned long bb_calls[NBBS]; /* how many times basic-block was called */ | |
49 | struct sym *next; /* for building chains of syms */ | |
50 | struct sym *prev; /* for building chains of syms */ | |
51 | ||
52 | /* profile-specific information: */ | |
53 | ||
54 | /* histogram specific info: */ | |
55 | struct | |
56 | { | |
57 | double time; /* (weighted) ticks in this routine */ | |
58 | bfd_vma scaled_addr; /* scaled entry point */ | |
59 | } | |
60 | hist; | |
61 | ||
62 | /* call-graph specific info: */ | |
63 | struct | |
64 | { | |
65 | unsigned long self_calls; /* how many calls to self */ | |
66 | double child_time; /* cumulative ticks in children */ | |
67 | int index; /* index in the graph list */ | |
68 | int top_order; /* graph call chain top-sort order */ | |
69 | bool print_flag; /* should this be printed? */ | |
70 | struct | |
71 | { | |
72 | double fract; /* what % of time propagates */ | |
73 | double self; /* how much self time propagates */ | |
74 | double child; /* how much child time propagates */ | |
75 | } | |
76 | prop; | |
77 | struct | |
78 | { | |
79 | int num; /* internal number of cycle on */ | |
80 | struct sym *head; /* head of cycle */ | |
81 | struct sym *next; /* next member of cycle */ | |
82 | } | |
83 | cyc; | |
84 | struct arc *parents; /* list of caller arcs */ | |
85 | struct arc *children; /* list of callee arcs */ | |
86 | } | |
87 | cg; | |
88 | } | |
89 | Sym; | |
90 | ||
91 | /* | |
92 | * Symbol-tables are always assumed to be sorted in increasing order | |
93 | * of addresses: | |
94 | */ | |
95 | typedef struct | |
96 | { | |
97 | unsigned int len; /* # of symbols in this table */ | |
98 | Sym *base; /* first element in symbol table */ | |
99 | Sym *limit; /* limit = base + len */ | |
100 | } | |
101 | Sym_Table; | |
102 | ||
103 | extern Sym_Table symtab; /* the symbol table */ | |
104 | ||
105 | extern void sym_init PARAMS ((Sym * sym)); | |
106 | extern void symtab_finalize PARAMS ((Sym_Table * symtab)); | |
107 | extern Sym *sym_lookup PARAMS ((Sym_Table * symtab, bfd_vma address)); | |
108 | ||
109 | extern void find_call PARAMS ((Sym *, bfd_vma, bfd_vma)); | |
110 | ||
111 | #endif /* symtab_h */ |