Skip to contentSkip to conversation

perf annotate browser: Be more robust when drawing jump arrows

tip:perf/core tip-bot for Arnaldo Carvalho de Melo 1 participant 1 message Mar 6, 2018 perf events

lore
Share & tools
lore
#0 lore raw
Commit-ID:  9c04409d7f5c325233961673356ea8aced6a4ef3
Gitweb:     https://git.kernel.org/tip/9c04409d7f5c325233961673356ea8aced6a4ef3
Author:     Arnaldo Carvalho de Melo <[email protected]>
AuthorDate: Thu, 1 Mar 2018 11:33:59 -0300
Committer:  Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Mon, 5 Mar 2018 09:57:57 -0300

perf annotate browser: Be more robust when drawing jump arrows

This first happened with a gcc function, _cpp_lex_token, that has the usual jumps:

│1159e6c: ↓ jne 115aa32 <_cpp_lex_token@@Base+0xf92>

I.e. jumps to a label inside that function (_cpp_lex_token), and those works, but also this kind:

│1159e8b: ↓ jne c469be <cpp_named_operator2name@@Base+0xa72>

I.e. jumps to another function, outside _cpp_lex_token, which are not being correctly handled generating as a side effect references to ab->offset[] entries that are set to NULL, so to make this code more robust, check that here.

A proper fix for will be put in place, looking at the function name right after the '<' token and probably treating this like a 'call' instruction.

For now just don't draw the arrow.

---
 tools/perf/ui/browsers/annotate.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)
tools/perf/ui/browsers/annotate.c +25 -0
index e2f666391ac4..6ff6839558b0 100644
@@ -328,7 +328,32 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
 	if (!disasm_line__is_valid_jump(cursor, sym))
 		return;
 
+	/*
+	 * This first was seen with a gcc function, _cpp_lex_token, that
+	 * has the usual jumps:
+	 *
+	 *  │1159e6c: ↓ jne    115aa32 <_cpp_lex_token@@Base+0xf92>
+	 *
+	 * I.e. jumps to a label inside that function (_cpp_lex_token), and
+	 * those works, but also this kind:
+	 *
+	 *  │1159e8b: ↓ jne    c469be <cpp_named_operator2name@@Base+0xa72>
+	 *
+	 *  I.e. jumps to another function, outside _cpp_lex_token, which
+	 *  are not being correctly handled generating as a side effect references
+	 *  to ab->offset[] entries that are set to NULL, so to make this code
+	 *  more robust, check that here.
+	 *
+	 *  A proper fix for will be put in place, looking at the function
+	 *  name right after the '<' token and probably treating this like a
+	 *  'call' instruction.
+	 */
 	target = ab->offsets[cursor->ops.target.offset];
+	if (target == NULL) {
+		ui_helpline__printf("WARN: jump target inconsistency, press 'o', ab->offsets[%#x] = NULL\n",
+				    cursor->ops.target.offset);
+		return;
+	}
 
 	bcursor = browser_line(&cursor->al);
 	btarget = browser_line(target);