struct annotation_line { struct list_head node; struct rb_node rb_node;
s64 offset; char *line; int line_nr; char *fileloc; char *path; struct cycles_info *cycles; int num_aggr; int br_cntr_nr;
u64 *br_cntr; struct evsel *evsel; int jump_sources;
u32 idx; int idx_asm; int data_nr; struct annotation_data data[];
};
struct disasm_line { struct ins ins; struct ins_operands ops; union {
u8 bytes[4];
u32 raw_insn;
} raw; /* This needs to be at the end. */ struct annotation_line al;
};
/* * Is this offset in the same function as the line it is used? * asm functions jump to other functions, for instance.
*/ staticinlinebool disasm_line__has_local_offset(conststruct disasm_line *dl)
{ return dl->ops.target.offset_avail && !dl->ops.target.outside;
}
/* * Can we draw an arrow from the jump to its target, for instance? I.e. * is the jump and its target in the same function?
*/ bool disasm_line__is_valid_local_jump(struct disasm_line *dl, struct symbol *sym);
/** * struct sym_hist - symbol histogram information for an event * * @nr_samples: Total number of samples. * @period: Sum of sample periods.
*/ struct sym_hist {
u64 nr_samples;
u64 period;
};
/** * struct cyc_hist - (CPU) cycle histogram for a basic block * * @start: Start address of current block (if known). * @cycles: Sum of cycles for the longest basic block. * @cycles_aggr: Total cycles for this address. * @cycles_max: Max cycles for this address. * @cycles_min: Min cycles for this address. * @cycles_spark: History of cycles for the longest basic block. * @num: Number of samples for the longest basic block. * @num_aggr: Total number of samples for this address. * @have_start: Whether the current branch info has a start address. * @reset: Number of resets due to a different start address. * * If sample has branch_stack and cycles info, it can construct basic blocks * between two adjacent branches. It'd have start and end addresses but * sometimes the start address may not be available. So the cycles are * accounted at the end address. If multiple basic blocks end at the same * address, it will take the longest one. * * The @start, @cycles, @cycles_spark and @num fields are used for the longest * block only. Other fields are used for all cases. * * See __symbol__account_cycles().
*/ struct cyc_hist {
u64 start;
u64 cycles;
u64 cycles_aggr;
u64 cycles_max;
u64 cycles_min;
s64 cycles_spark[NUM_SPARKS];
u32 num;
u32 num_aggr;
u8 have_start; /* 1 byte padding */
u16 reset;
};
/** * struct annotated_source - symbols with hits have this attached as in annotation * * @source: List head for annotated_line (embeded in disasm_line). * @histograms: Array of symbol histograms per event to maintain the total number * of samples and period. * @nr_histograms: This may not be the same as evsel->evlist->core.nr_entries if * we have more than a group in a evlist, where we will want * to see each group separately, that is why symbol__annotate2() * sets src->nr_histograms to evsel->nr_members. * @samples: Hash map of sym_hist_entry. Keyed by event index and offset in symbol. * @nr_events: Number of events in the current output. * @nr_entries: Number of annotated_line in the source list. * @nr_asm_entries: Number of annotated_line with actual asm instruction in the * source list. * @max_jump_sources: Maximum number of jump instructions targeting to the same * instruction. * @widths: Precalculated width of each column in the TUI output. * * disasm_lines are allocated, percentages calculated and all sorted by percentage * when the annotation is about to be presented, so the percentages are for * one of the entries in the histogram array, i.e. for the event/counter being * presented. It is deallocated right after symbol__{tui,tty,etc}_annotate * returns.
*/ struct annotated_source { struct list_head source; struct sym_hist *histograms; struct hashmap *samples; int nr_histograms; int nr_events; int nr_entries; int nr_asm_entries; int max_jump_sources; bool tried_source;
u64 start; struct {
u8 addr;
u8 jumps;
u8 target;
u8 min_addr;
u8 max_addr;
u8 max_ins_name;
u16 max_line_len;
} widths;
};
/* A branch counter once saturated */ #define ANNOTATION__BR_CNTR_SATURATED_FLAG (1ULL << 63)
/** * struct annotated_branch - basic block and IPC information for a symbol. * * @hit_cycles: Total executed cycles. * @hit_insn: Total number of instructions executed. * @total_insn: Number of instructions in the function. * @cover_insn: Number of distinct, actually executed instructions. * @cycles_hist: Array of cyc_hist for each instruction. * @max_coverage: Maximum number of covered basic block (used for block-range). * @br_cntr: Array of the occurrences of events (branch counters) during a block. * * This struct is used by two different codes when the sample has branch stack * and cycles information. annotation__compute_ipc() calculates average IPC * using @hit_insn / @hit_cycles. The actual coverage can be calculated using * @cover_insn / @total_insn. The @cycles_hist can give IPC for each (longest) * basic block ends at the given address. * process_basic_block() calculates coverage of instructions (or basic blocks) * in the function.
*/ struct annotated_branch {
u64 hit_cycles;
u64 hit_insn; unsignedint total_insn; unsignedint cover_insn; struct cyc_hist *cycles_hist;
u64 max_coverage;
u64 *br_cntr;
};
/* * Choose an arbitrary negative big number not to clash with standard * errno since SUS requires the errno has distinct positive values. * See 'Issue 6' in the link below. * * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
*/
__SYMBOL_ANNOTATE_ERRNO__START = -10000,
int annotate_parse_percent_type(conststruct option *opt, constchar *_str, int unset);
int annotate_check_args(void);
/** * struct annotated_op_loc - Location info of instruction operand * @reg1: First register in the operand * @reg2: Second register in the operand * @offset: Memory access offset in the operand * @segment: Segment selector register * @mem_ref: Whether the operand accesses memory * @multi_regs: Whether the second register is used * @imm: Whether the operand is an immediate value (in offset)
*/ struct annotated_op_loc { int reg1; int reg2; int offset;
u8 segment; bool mem_ref; bool multi_regs; bool imm;
};
/** * struct annotated_insn_loc - Location info of instruction * @ops: Array of location info for source and target operands
*/ struct annotated_insn_loc { struct annotated_op_loc ops[INSN_OP_MAX];
};
#define for_each_insn_op_loc(insn_loc, i, op_loc) \ for (i = INSN_OP_SOURCE, op_loc = &(insn_loc)->ops[i]; \
i < INSN_OP_MAX; \
i++, op_loc++)
/* Get detailed location info in the instruction */ int annotate_get_insn_location(struct arch *arch, struct disasm_line *dl, struct annotated_insn_loc *loc);
/* Returns a data type from the sample instruction (if any) */ struct annotated_data_type *hist_entry__get_data_type(struct hist_entry *he);
struct annotated_item_stat { struct list_head list; char *name; int good; int bad;
}; externstruct list_head ann_insn_stat;
/** * struct annotated_basic_block - Basic block of instructions * @list: List node * @begin: start instruction in the block * @end: end instruction in the block
*/ struct annotated_basic_block { struct list_head list; struct disasm_line *begin; struct disasm_line *end;
};
/* Get a list of basic blocks from src to dst addresses */ int annotate_get_basic_blocks(struct symbol *sym, s64 src, s64 dst, struct list_head *head);
void debuginfo_cache__delete(void);
int annotation_br_cntr_entry(char **str, int br_cntr_nr, u64 *br_cntr, int num_aggr, struct evsel *evsel); int annotation_br_cntr_abbr_list(char **str, struct evsel *evsel, bool header); #endif/* __PERF_ANNOTATE_H */
Messung V0.5
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.