/** * @file symbol.h * Symbol containers * * @remark Copyright 2002, 2004 OProfile authors * @remark Read the file COPYING * * @author Philippe Elie * @author John Levon */ #ifndef SYMBOL_H #define SYMBOL_H #include "name_storage.h" #include "growable_vector.h" #include "sparse_array.h" #include "format_flags.h" #include "op_types.h" #include <bfd.h> #include <stdint.h> #include <list> class extra_images; /// for storing sample counts typedef sparse_array<u32, count_type> count_array_t; /// A simple container for a fileno:linenr location. struct file_location { file_location() : linenr(0) {} /// empty if not valid. debug_name_id filename; /// 0 means invalid or code is generated internally by the compiler unsigned int linenr; bool operator<(file_location const & rhs) const { // Note we sort on filename id not on string return filename < rhs.filename || (filename == rhs.filename && linenr < rhs.linenr); } }; /// associate vma address with a file location and a samples count struct sample_entry { sample_entry() : vma(0) {} /// From where file location comes the samples file_location file_loc; /// From where virtual memory address comes the samples bfd_vma vma; /// the samples count count_array_t counts; }; /// associate a symbol with a file location, samples count and vma address class symbol_entry { public: symbol_entry() : size(0) {} virtual ~symbol_entry() {} /// which image this symbol belongs to image_name_id image_name; /// owning application name: identical to image name if profiling /// session did not separate samples for shared libs or if image_name /// is not a shared lib image_name_id app_name; // index into the op_bfd symbol table size_t sym_index; /// file location, vma and cumulated samples count for this symbol sample_entry sample; /// name of symbol symbol_name_id name; /// symbol size as calculated by op_bfd, start of symbol is sample.vma size_t size; /** * @param fl input hint * * combine fl with the calculated hint. It's theoretically possible * that we get a symbol where its samples pass the border line, but * the start is below it, but the the hint is only used for formatting */ column_flags output_hint(column_flags fl) const; uint64_t spu_offset; image_name_id embedding_filename; }; /// a collection of sorted symbols typedef std::vector<symbol_entry const *> symbol_collection; /** * The public data for call-graph symbols. Each caller/callee has * the sample counts replaced with the relevant arc counts, whilst * the cg_symbol retains its self count. */ class cg_symbol : public symbol_entry { public: cg_symbol(symbol_entry const & sym) : symbol_entry(sym) {} typedef std::vector<symbol_entry> children; /// all callers of this symbol children callers; /// total count of callers count_array_t total_caller_count; /// all symbols called by this symbol children callees; /// total count of callees count_array_t total_callee_count; }; /// a collection of sorted callgraph symbol objects typedef std::list<cg_symbol> cg_collection_objs; /// for storing diff %ages typedef growable_vector<double> diff_array_t; /** * Data for a diffed symbol. */ struct diff_symbol : public symbol_entry { diff_symbol(symbol_entry const & sym) : symbol_entry(sym) {} /// diff %age values for each profile class diff_array_t diffs; }; /// a collection of diffed symbols typedef std::vector<diff_symbol> diff_collection; bool has_sample_counts(count_array_t const & counts, size_t lo, size_t hi); std::string const & get_image_name(image_name_id id, image_name_storage::image_name_type type, extra_images const & extra); #endif /* !SYMBOL_H */