[PATCH v6 11/15] perf llvm: Disassemble cleanup

Ian Rogers
2025-09-29T19:09:13Z

Move the 3 LLVM initialization routines to be called in a single
init_llvm function that has its own bool to avoid repeated
initialization. Reduce the scope of triplet and avoid copying strings
for x86.

Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/util/llvm.c | 32 ++++++++++++++++++++------------
1 file changed, 20 insertions(+), 12 deletions(-)

diff --git a/tools/perf/util/llvm.c b/tools/perf/util/llvm.c
index a0774373f0d6..a28f130c8951 100644
--- a/tools/perf/util/llvm.c
+++ b/tools/perf/util/llvm.c
@@ -244,6 +244,17 @@ static void perf_LLVMDisasmDispose(LLVMDisasmContextRef context)
#endif
}

+static void init_llvm(void)
+{
+ static bool init;
+
+ if (!init) {
+ perf_LLVMInitializeAllTargetInfos();
+ perf_LLVMInitializeAllTargetMCs();
+ perf_LLVMInitializeAllDisassemblers();
+ init = true;
+ }
+}

static void free_llvm_inline_frames(struct llvm_a2l_frame *inline_frames,
int num_frames)
@@ -339,7 +350,6 @@ int symbol__disassemble_llvm(const char *filename, struct symbol *sym,
u64 buf_len;
u64 pc;
bool is_64bit;
- char triplet[64];
char disasm_buf[2048];
size_t disasm_len;
struct disasm_line *dl;
@@ -352,27 +362,25 @@ int symbol__disassemble_llvm(const char *filename, struct symbol *sym,
if (args->options->objdump_path)
return -1;

- perf_LLVMInitializeAllTargetInfos();
- perf_LLVMInitializeAllTargetMCs();
- perf_LLVMInitializeAllDisassemblers();
-
buf = dso__read_symbol(dso, filename, map, sym,
&code_buf, &buf_len, &is_64bit);
if (buf == NULL)
return -1;

+ init_llvm();
if (arch__is(args->arch, "x86")) {
- if (is_64bit)
- scnprintf(triplet, sizeof(triplet), "x86_64-pc-linux");
- else
- scnprintf(triplet, sizeof(triplet), "i686-pc-linux");
+ const char *triplet = is_64bit ? "x86_64-pc-linux" : "i686-pc-linux";
+
+ disasm = perf_LLVMCreateDisasm(triplet, &storage, /*tag_type=*/0,
+ /*get_op_info=*/NULL, symbol_lookup_callback);
} else {
+ char triplet[64];
+
scnprintf(triplet, sizeof(triplet), "%s-linux-gnu",
args->arch->name);
+ disasm = perf_LLVMCreateDisasm(triplet, &storage, /*tag_type=*/0,
+ /*get_op_info=*/NULL, symbol_lookup_callback);
}
-
- disasm = perf_LLVMCreateDisasm(triplet, &storage, 0, NULL,
- symbol_lookup_callback);
if (disasm == NULL)
goto err;

--
2.51.0.570.gb178f27e6d-goog