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 24 class profile_container; 25 class inverted_profile; 26 class profile_t; 27 class image_set; 28 class 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 */ 38 class arc_recorder { 39 public: 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 65 private: 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 */ 104 class callgraph_container { 105 public: 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 132 private: 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 167 public: // FIXME 168 extra_images extra_found_images; 169 }; 170 171 #endif /* !CALLGRAPH_CONTAINER_H */ 172