]>
git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - tools/perf/ui/gtk/annotate.c
2 #include "util/debug.h"
3 #include "util/annotate.h"
4 #include "ui/helpline.h"
15 static const char *const col_names
[] = {
21 static int perf_gtk__get_percent(char *buf
, size_t size
, struct symbol
*sym
,
22 struct disasm_line
*dl
, int evidx
)
24 struct sym_hist
*symhist
;
31 if (dl
->offset
== (s64
) -1)
34 symhist
= annotation__histogram(symbol__annotation(sym
), evidx
);
35 if (!symhist
->addr
[dl
->offset
])
38 percent
= 100.0 * symhist
->addr
[dl
->offset
] / symhist
->sum
;
40 markup
= perf_gtk__get_percent_color(percent
);
42 ret
+= scnprintf(buf
, size
, "%s", markup
);
43 ret
+= scnprintf(buf
+ ret
, size
- ret
, "%6.2f%%", percent
);
45 ret
+= scnprintf(buf
+ ret
, size
- ret
, "</span>");
50 static int perf_gtk__get_offset(char *buf
, size_t size
, struct symbol
*sym
,
51 struct map
*map
, struct disasm_line
*dl
)
53 u64 start
= map__rip_2objdump(map
, sym
->start
);
57 if (dl
->offset
== (s64
) -1)
60 return scnprintf(buf
, size
, "%"PRIx64
, start
+ dl
->offset
);
63 static int perf_gtk__annotate_symbol(GtkWidget
*window
, struct symbol
*sym
,
64 struct map
*map
, int evidx
,
65 struct hist_browser_timer
*hbt __maybe_unused
)
67 struct disasm_line
*pos
, *n
;
68 struct annotation
*notes
;
69 GType col_types
[MAX_ANN_COLS
];
70 GtkCellRenderer
*renderer
;
76 if (map
->dso
->annotate_warned
)
79 if (symbol__annotate(sym
, map
, 0) < 0) {
80 ui__error("%s", ui_helpline__current
);
84 notes
= symbol__annotation(sym
);
86 for (i
= 0; i
< MAX_ANN_COLS
; i
++) {
87 col_types
[i
] = G_TYPE_STRING
;
89 store
= gtk_list_store_newv(MAX_ANN_COLS
, col_types
);
91 view
= gtk_tree_view_new();
92 renderer
= gtk_cell_renderer_text_new();
94 for (i
= 0; i
< MAX_ANN_COLS
; i
++) {
95 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view
),
96 -1, col_names
[i
], renderer
,
97 i
== ANN_COL__PERCENT
? "markup" : "text",
101 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), GTK_TREE_MODEL(store
));
102 g_object_unref(GTK_TREE_MODEL(store
));
104 list_for_each_entry(pos
, ¬es
->src
->source
, node
) {
107 gtk_list_store_append(store
, &iter
);
109 if (perf_gtk__get_percent(s
, sizeof(s
), sym
, pos
, evidx
))
110 gtk_list_store_set(store
, &iter
, ANN_COL__PERCENT
, s
, -1);
111 if (perf_gtk__get_offset(s
, sizeof(s
), sym
, map
, pos
))
112 gtk_list_store_set(store
, &iter
, ANN_COL__OFFSET
, s
, -1);
113 gtk_list_store_set(store
, &iter
, ANN_COL__LINE
, pos
->line
, -1);
116 gtk_container_add(GTK_CONTAINER(window
), view
);
118 list_for_each_entry_safe(pos
, n
, ¬es
->src
->source
, node
) {
119 list_del(&pos
->node
);
120 disasm_line__free(pos
);
126 int symbol__gtk_annotate(struct symbol
*sym
, struct map
*map
, int evidx
,
127 struct hist_browser_timer
*hbt
)
134 GtkWidget
*scrolled_window
;
135 GtkWidget
*tab_label
;
137 signal(SIGSEGV
, perf_gtk__signal
);
138 signal(SIGFPE
, perf_gtk__signal
);
139 signal(SIGINT
, perf_gtk__signal
);
140 signal(SIGQUIT
, perf_gtk__signal
);
141 signal(SIGTERM
, perf_gtk__signal
);
143 window
= gtk_window_new(GTK_WINDOW_TOPLEVEL
);
144 gtk_window_set_title(GTK_WINDOW(window
), "perf annotate");
146 g_signal_connect(window
, "delete_event", gtk_main_quit
, NULL
);
148 pgctx
= perf_gtk__activate_context(window
);
152 vbox
= gtk_vbox_new(FALSE
, 0);
153 notebook
= gtk_notebook_new();
154 scrolled_window
= gtk_scrolled_window_new(NULL
, NULL
);
155 tab_label
= gtk_label_new(sym
->name
);
157 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window
),
158 GTK_POLICY_AUTOMATIC
,
159 GTK_POLICY_AUTOMATIC
);
161 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), scrolled_window
,
163 gtk_box_pack_start(GTK_BOX(vbox
), notebook
, TRUE
, TRUE
, 0);
165 infobar
= perf_gtk__setup_info_bar();
167 gtk_box_pack_start(GTK_BOX(vbox
), infobar
, FALSE
, FALSE
, 0);
169 statbar
= perf_gtk__setup_statusbar();
170 gtk_box_pack_start(GTK_BOX(vbox
), statbar
, FALSE
, FALSE
, 0);
172 gtk_container_add(GTK_CONTAINER(window
), vbox
);
174 perf_gtk__annotate_symbol(scrolled_window
, sym
, map
, evidx
, hbt
);
176 gtk_widget_show_all(window
);
178 perf_gtk__resize_window(window
);
179 gtk_window_set_position(GTK_WINDOW(window
), GTK_WIN_POS_CENTER
);
183 perf_gtk__deactivate_context(&pgctx
);