objtool: Free insns when done
authorJosh Poimboeuf <jpoimboe@kernel.org>
Tue, 30 May 2023 17:21:13 +0000 (10:21 -0700)
committerJosh Poimboeuf <jpoimboe@kernel.org>
Wed, 7 Jun 2023 17:03:27 +0000 (10:03 -0700)
Free the decoded instructions as they're no longer needed after this
point.  This frees up a big chunk of heap, which will come handy when
skipping the reading of DWARF section data.

Link: https://lore.kernel.org/r/4d4bca1a0f869de020dac80d91f9acbf6df77eab.1685464332.git.jpoimboe@kernel.org
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
tools/objtool/check.c

index 47ff130..8936a05 100644 (file)
@@ -4596,6 +4596,34 @@ static int disas_warned_funcs(struct objtool_file *file)
        return 0;
 }
 
+struct insn_chunk {
+       void *addr;
+       struct insn_chunk *next;
+};
+
+/*
+ * Reduce peak RSS usage by freeing insns memory before writing the ELF file,
+ * which can trigger more allocations for .debug_* sections whose data hasn't
+ * been read yet.
+ */
+static void free_insns(struct objtool_file *file)
+{
+       struct instruction *insn;
+       struct insn_chunk *chunks = NULL, *chunk;
+
+       for_each_insn(file, insn) {
+               if (!insn->idx) {
+                       chunk = malloc(sizeof(*chunk));
+                       chunk->addr = insn;
+                       chunk->next = chunks;
+                       chunks = chunk;
+               }
+       }
+
+       for (chunk = chunks; chunk; chunk = chunk->next)
+               free(chunk->addr);
+}
+
 int check(struct objtool_file *file)
 {
        int ret, warnings = 0;
@@ -4742,6 +4770,8 @@ int check(struct objtool_file *file)
                warnings += ret;
        }
 
+       free_insns(file);
+
        if (opts.verbose)
                disas_warned_funcs(file);