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
141 insn && insn->offset < sym->offset + sym->len; \141 insn && insn->offset < sym->offset + sym->len; \
142 insn = next_insn_same_sec(file, insn))142 insn = next_insn_same_sec(file, insn))
143 143
144const char *objtool_disas_insn(struct instruction *insn);
145
144#endif /* _CHECK_H */146#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
17int disas_info_init(struct disassemble_info *dinfo,17int disas_info_init(struct disassemble_info *dinfo,
18 int arch, int mach32, int mach64,18 int arch, int mach32, int mach64,
19 const char *options);19 const char *options);
20size_t disas_insn(struct disas_context *dctx, struct instruction *insn);
21char *disas_result(struct disas_context *dctx);
20 22
21#else /* DISAS */23#else /* DISAS */
22 24
@@ -38,6 +40,17 @@ static inline int disas_info_init(struct disassemble_info *dinfo, · 15 unmodified lines
38 return -1;40 return -1;
39}41}
40 42
43static inline size_t disas_insn(struct disas_context *dctx,
44 struct instruction *insn)
45{
46 return -1;
47}
48
49static inline char *disas_result(struct disas_context *dctx)
50{
51 return NULL;
52}
53
41#endif /* DISAS */54#endif /* DISAS */
42 55
43#endif /* _DISAS_H */56#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
77#define WARN_INSN(insn, format, ...) \77#define WARN_INSN(insn, format, ...) \
78({ \78({ \
79 struct instruction *_insn = (insn); \79 struct instruction *_insn = (insn); \
80 if (!_insn->sym || !_insn->sym->warned) \80 if (!_insn->sym || !_insn->sym->warned) { \
81 WARN_FUNC(_insn->sec, _insn->offset, format, \81 WARN_FUNC(_insn->sec, _insn->offset, format, \
82 ##__VA_ARGS__); \82 ##__VA_ARGS__); \
83 BT_INSN(_insn, ""); \
84 } \
83 if (_insn->sym) \85 if (_insn->sym) \
84 _insn->sym->warned = 1; \86 _insn->sym->warned = 1; \
85})87})
@@ -87,10 +89,14 @@ static inline char *offstr(struct section *sec, unsigned long offset) · 1 unmodified line
87#define BT_INSN(insn, format, ...) \89#define BT_INSN(insn, format, ...) \
88({ \90({ \
89 if (opts.verbose || opts.backtrace) { \91 if (opts.verbose || opts.backtrace) { \
90 struct instruction *_insn = (insn); \92 struct instruction *__insn = (insn); \
91 char *_str = offstr(_insn->sec, _insn->offset); \93 char *_str = offstr(__insn->sec, __insn->offset); \
92 WARN(" %s: " format, _str, ##__VA_ARGS__); \94 const char *_istr = objtool_disas_insn(__insn); \
93 free(_str); \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); \
94 } \100 } \
95})101})
96 102

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