History

objtool: Disassemble instruction on warning or backtrace

When an instruction warning (WARN_INSN) or backtrace (BT_INSN) is issued, disassemble the instruction to provide more context.

Alexandre Chartre committed 11 months ago

Commit 0bb080b1 parent d4e13c25 files · +58 −14Browse files

Showing the changes to tools/objtool/include/objtool (3 of 5 files). Show all

Unified · Split

3 files
  1. tools/objtool/include/objtool/check.h +2 −0
  2. tools/objtool/include/objtool/disas.h +13 −0
  3. tools/objtool/include/objtool/warn.h +11 −5
tools/objtool/include/objtool/check.h+2−0
@@ -141,4 +141,6 @@ struct instruction *next_insn_same_sec(struct objtool_file *file, struct instruc · 140 unmodified lines
141141 insn && insn->offset < sym->offset + sym->len; \
142142 insn = next_insn_same_sec(file, insn))
143143
144+const char *objtool_disas_insn(struct instruction *insn);
145+
144146 #endif /* _CHECK_H */
tools/objtool/include/objtool/disas.h+13−0
@@ -17,6 +17,8 @@ void disas_warned_funcs(struct disas_context *dctx); · 16 unmodified lines
1717 int disas_info_init(struct disassemble_info *dinfo,
1818 int arch, int mach32, int mach64,
1919 const char *options);
20+size_t disas_insn(struct disas_context *dctx, struct instruction *insn);
21+char *disas_result(struct disas_context *dctx);
2022
2123 #else /* DISAS */
2224
@@ -38,6 +40,17 @@ static inline int disas_info_init(struct disassemble_info *dinfo, · 15 unmodified lines
3840 return -1;
3941 }
4042
43+static inline size_t disas_insn(struct disas_context *dctx,
44+ struct instruction *insn)
45+{
46+ return -1;
47+}
48+
49+static inline char *disas_result(struct disas_context *dctx)
50+{
51+ return NULL;
52+}
53+
4154 #endif /* DISAS */
4255
4356 #endif /* _DISAS_H */
tools/objtool/include/objtool/warn.h+11−5
@@ -77,9 +77,11 @@ static inline char *offstr(struct section *sec, unsigned long offset) · 76 unmodified lines
7777 #define WARN_INSN(insn, format, ...) \
7878 ({ \
7979 struct instruction *_insn = (insn); \
80− if (!_insn->sym || !_insn->sym->warned) \
80+ if (!_insn->sym || !_insn->sym->warned) { \
8181 WARN_FUNC(_insn->sec, _insn->offset, format, \
8282 ##__VA_ARGS__); \
83+ BT_INSN(_insn, ""); \
84+ } \
8385 if (_insn->sym) \
8486 _insn->sym->warned = 1; \
8587 })
@@ -87,10 +89,14 @@ static inline char *offstr(struct section *sec, unsigned long offset) · 1 unmodified line
8789 #define BT_INSN(insn, format, ...) \
8890 ({ \
8991 if (opts.verbose || opts.backtrace) { \
90− struct instruction *_insn = (insn); \
91− char *_str = offstr(_insn->sec, _insn->offset); \
92− WARN(" %s: " format, _str, ##__VA_ARGS__); \
93− free(_str); \
92+ struct instruction *__insn = (insn); \
93+ char *_str = offstr(__insn->sec, __insn->offset); \
94+ const char *_istr = objtool_disas_insn(__insn); \
95+ int _len; \
96+ _len = snprintf(NULL, 0, " %s: " format, _str, ##__VA_ARGS__); \
97+ _len = (_len < 50) ? 50 - _len : 0; \
98+ WARN(" %s: " format " %*s%s", _str, ##__VA_ARGS__, _len, "", _istr); \
99+ free(_str); \
94100 } \
95101 })
96102

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t