Commit 0a7fb6f0 authored by Josh Poimboeuf's avatar Josh Poimboeuf Committed by Peter Zijlstra
Browse files

objtool: Increase per-function WARN_FUNC() rate limit



Increase the per-function WARN_FUNC() rate limit from 1 to 2.  If the
number of warnings for a given function goes beyond 2, print "skipping
duplicate warning(s)".  This helps root out additional warnings in a
function that might be hiding behind the first one.

Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/aec318d66c037a51c9f376d6fb0e8ff32812a037.1741975349.git.jpoimboe@kernel.org
parent dd95beba
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -4547,7 +4547,7 @@ static int disas_warned_funcs(struct objtool_file *file)
	char *funcs = NULL, *tmp;

	for_each_sym(file, sym) {
		if (sym->warned) {
		if (sym->warnings) {
			if (!funcs) {
				funcs = malloc(strlen(sym->name) + 1);
				strcpy(funcs, sym->name);
+1 −1
Original line number Diff line number Diff line
@@ -65,10 +65,10 @@ struct symbol {
	u8 return_thunk      : 1;
	u8 fentry            : 1;
	u8 profiling_func    : 1;
	u8 warned	     : 1;
	u8 embedded_insn     : 1;
	u8 local_label       : 1;
	u8 frame_pointer     : 1;
	u8 warnings	     : 2;
	struct list_head pv_target;
	struct reloc *relocs;
};
+11 −3
Original line number Diff line number Diff line
@@ -53,14 +53,22 @@ static inline char *offstr(struct section *sec, unsigned long offset)
	free(_str);					\
})

#define WARN_LIMIT 2

#define WARN_INSN(insn, format, ...)					\
({									\
	struct instruction *_insn = (insn);				\
	if (!_insn->sym || !_insn->sym->warned)				\
	BUILD_BUG_ON(WARN_LIMIT > 2);					\
	if (!_insn->sym || _insn->sym->warnings < WARN_LIMIT) {		\
		WARN_FUNC(format, _insn->sec, _insn->offset,		\
			  ##__VA_ARGS__);				\
		if (_insn->sym)						\
		_insn->sym->warned = 1;					\
			_insn->sym->warnings++;				\
	} else if (_insn->sym && _insn->sym->warnings == WARN_LIMIT) {	\
		WARN_FUNC("skipping duplicate warning(s)",		\
			  _insn->sec, _insn->offset);			\
		_insn->sym->warnings++;					\
	}								\
})

#define BT_INSN(insn, format, ...)				\