On Mon, Dec 04, 2023 at 10:37:03AM +0100, Peter Zijlstra wrote: > Avoid endless .discard.foo sections for each annotation, create a > single .discard.annotate section that takes an annotation type along > with the instruction. > > Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx> > --- > --- a/include/linux/objtool.h > +++ b/include/linux/objtool.h > @@ -57,6 +57,13 @@ > ".long 998b\n\t" \ > ".popsection\n\t" > > +#define ASM_ANNOTATE(x) \ > + "911:\n\t" \ > + ".pushsection .discard.annotate,\"M\",@progbits,8\n\t" \ > + ".long 911b - .\n\t" \ > + ".long " __stringify(x) "\n\t" \ > + ".popsection\n\t" > + > #else /* __ASSEMBLY__ */ > > /* > @@ -146,6 +153,14 @@ > .popsection > .endm > > +.macro ANNOTATE type:req > +.Lhere_\@: > + .pushsection .discard.annotate,"M",@progbits,8 > + .long .Lhere_\@ - . > + .long \type > + .popsection > +.endm > + > #endif /* __ASSEMBLY__ */ > > #else /* !CONFIG_OBJTOOL */ > @@ -167,6 +182,8 @@ > .endm > .macro REACHABLE > .endm > +.macro ANNOTATE > +.endm > #endif > > #endif /* CONFIG_OBJTOOL */ > --- a/tools/objtool/check.c > +++ b/tools/objtool/check.c > @@ -2308,6 +2308,41 @@ static int read_unwind_hints(struct objt > return 0; > } > > +static int read_annotate(struct objtool_file *file, void (*func)(int type, struct instruction *insn)) > +{ > + struct section *rsec, *sec; > + struct instruction *insn; > + struct reloc *reloc; > + int type; > + > + rsec = find_section_by_name(file->elf, ".rela.discard.annotate"); > + if (!rsec) > + return 0; > + > + sec = find_section_by_name(file->elf, ".discard.annotate"); > + if (!sec) > + return 0; > + > + for_each_reloc(rsec, reloc) { > + insn = find_insn(file, reloc->sym->sec, > + reloc->sym->offset + reloc_addend(reloc)); > + if (!insn) { > + WARN("bad .discard.annotate entry: %d", reloc_idx(reloc)); > + return -1; > + } > + > + type = *(u32 *)(sec->data->d_buf + (reloc_idx(reloc) * sec->sh.sh_entsize) + 4); > + > + func(type, insn); > + } > + > + return 0; > +} So... ld.lld hates this :-(