diff options
author | Josh Poimboeuf | 2023-05-30 10:21:13 -0700 |
---|---|---|
committer | Josh Poimboeuf | 2023-06-07 10:03:27 -0700 |
commit | d93b5935fd47007597aed5105a902a10204bc30e (patch) | |
tree | c304b31a243b26eb531fabed65df75e252fa12cc /tools/objtool | |
parent | ec24b927c1fbfc91cf7a48276d9fd92072b17d3b (diff) |
objtool: Free insns when done
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>
Diffstat (limited to 'tools/objtool')
-rw-r--r-- | tools/objtool/check.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 47ff130a9460..8936a05f0e5a 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -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); |