callgraph_container.h revision 8cfa702f803c5ef6a2b062a489a1b2cf66b45b5e
1/**
2 * @file callgraph_container.h
3 * Container associating symbols and caller/caller symbols
4 *
5 * @remark Copyright 2004 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author Philippe Elie
9 * @author John Levon
10 */
11
12#ifndef CALLGRAPH_CONTAINER_H
13#define CALLGRAPH_CONTAINER_H
14
15#include <set>
16#include <vector>
17#include <string>
18
19#include "symbol.h"
20#include "symbol_functors.h"
21#include "string_filter.h"
22#include "locate_images.h"
23
24class profile_container;
25class inverted_profile;
26class profile_t;
27class image_set;
28class op_bfd;
29
30
31/**
32 * During building a callgraph_container we store all caller/callee
33 * relationship in this container.
34 *
35 * An "arc" is simply a description of a call from one function to
36 * another.
37 */
38class arc_recorder {
39public:
40	~arc_recorder() {}
41
42	/**
43	 * Add a symbol arc.
44	 * @param caller  The calling symbol
45	 * @param callee  The called symbol
46	 * @param arc_count  profile data for the arcs
47	 *
48	 * If the callee is NULL, only the caller is added to the main
49	 * list. This is used to initially populate the recorder with
50	 * the symbols.
51	 */
52	void add(symbol_entry const & caller, symbol_entry const * callee,
53	         count_array_t const & arc_count);
54
55	/// return all the cg symbols
56	symbol_collection const & get_symbols() const;
57
58	/**
59	 * After population, build the final output, and do
60	 * thresholding.
61	 */
62	void process(count_array_t total, double threshold,
63	             string_filter const & filter);
64
65private:
66	/**
67	 * Internal structure used during collation. We use a map to
68	 * allow quick lookup of children (we'll do this several times
69	 * if we have more than one profile class). Each child maps from
70	 * the symbol to the relevant arc data.
71	 */
72	struct cg_data {
73		cg_data() {}
74
75		typedef std::map<symbol_entry, count_array_t, less_symbol> children;
76
77		/// callers of this symbol
78		children callers;
79		/// callees of this symbol
80		children callees;
81	};
82
83	/**
84	 * Sort and threshold callers and callees.
85	 */
86	void process_children(cg_symbol & sym, double threshold);
87
88	typedef std::map<symbol_entry, cg_data, less_symbol> map_t;
89
90	/// all the symbols (used during processing)
91	map_t sym_map;
92
93	/// symbol objects pointed to by pointers in vector cg_syms
94	cg_collection_objs cg_syms_objs;
95
96	/// final output data
97	symbol_collection cg_syms;
98};
99
100
101/**
102 * Store all callgraph information for the given profiles
103 */
104class callgraph_container {
105public:
106	/**
107	 * Populate the container, must be called once only.
108	 * @param iprofiles  sample file list including callgraph files.
109	 * @param extra  extra image list to fixup binary name.
110	 * @param debug_info  true if we must record linenr information
111	 * @param threshold  ignore sample percent below this threshold
112	 * @param merge_lib  merge library samples
113	 * @param sym_filter  symbol filter
114	 *
115	 * Currently all errors core dump.
116	 * FIXME: consider if this should be a ctor
117	 */
118	void populate(std::list<inverted_profile> const & iprofiles,
119		      extra_images const & extra, bool debug_info,
120		      double threshold, bool merge_lib,
121		      string_filter const & sym_filter);
122
123	/// return hint on how data must be displayed.
124	column_flags output_hint() const;
125
126	/// return the total number of samples.
127	count_array_t samples_count() const;
128
129	// return all the cg symbols
130	symbol_collection const & get_symbols() const;
131
132private:
133	/**
134	 * Record caller/callee for one cg file
135	 * @param profile  one callgraph file stored in a profile_t
136	 * @param caller_bfd  the caller bfd
137	 * @param bfd_caller_ok  true if we succefully open the binary
138	 * @param callee_bfd  the callee bfd
139	 * @param app_name  the owning application
140	 * @param pc  the profile_container holding all non cg samples.
141	 * @param debug_info  record linenr debug information
142	 * @param pclass  profile class nr
143	 */
144	void add(profile_t const & profile, op_bfd const & caller_bfd,
145	         bool bfd_caller_ok, op_bfd const & callee_bfd,
146		 std::string const & app_name, profile_container const & pc,
147		 bool debug_info, size_t pclass);
148
149	void populate(std::list<image_set> const & lset,
150		      std::string const & app_image,
151		      size_t pclass, profile_container const & pc,
152		      bool debug_info, bool merge_lib);
153	void populate(std::list<std::string> const & cg_files,
154		      std::string const & app_image,
155		      size_t pclass, profile_container const & pc,
156		      bool debug_info, bool merge_lib);
157
158	/// record all main symbols
159	void add_symbols(profile_container const & pc);
160
161	/// Cached value of samples count.
162	count_array_t total_count;
163
164	/// A structured representation of the callgraph.
165	arc_recorder recorder;
166
167public:  // FIXME
168	extra_images extra_found_images;
169};
170
171#endif /* !CALLGRAPH_CONTAINER_H */
172