aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/llvm.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/llvm.c')
-rw-r--r--tools/perf/util/llvm.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/tools/perf/util/llvm.c b/tools/perf/util/llvm.c
index ddc737194692..b71649d616e3 100644
--- a/tools/perf/util/llvm.c
+++ b/tools/perf/util/llvm.c
@@ -74,8 +74,19 @@ void dso__free_a2l_llvm(struct dso *dso __maybe_unused)
/* Nothing to free. */
}
+#ifdef HAVE_LIBLLVM_SUPPORT
+static void init_llvm(void)
+{
+ static bool init;
+
+ if (!init) {
+ LLVMInitializeAllTargetInfos();
+ LLVMInitializeAllTargetMCs();
+ LLVMInitializeAllDisassemblers();
+ init = true;
+ }
+}
-#if defined(HAVE_LIBLLVM_SUPPORT)
struct find_file_offset_data {
u64 ip;
u64 offset;
@@ -184,7 +195,6 @@ int symbol__disassemble_llvm(const char *filename, struct symbol *sym,
u64 len;
u64 pc;
bool is_64bit;
- char triplet[64];
char disasm_buf[2048];
size_t disasm_len;
struct disasm_line *dl;
@@ -197,26 +207,25 @@ int symbol__disassemble_llvm(const char *filename, struct symbol *sym,
if (args->options->objdump_path)
return -1;
- LLVMInitializeAllTargetInfos();
- LLVMInitializeAllTargetMCs();
- LLVMInitializeAllDisassemblers();
-
buf = read_symbol(filename, map, sym, &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 = 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 = LLVMCreateDisasm(triplet, &storage, /*tag_type=*/0,
+ /*get_op_info=*/NULL, symbol_lookup_callback);
}
- disasm = LLVMCreateDisasm(triplet, &storage, 0, NULL,
- symbol_lookup_callback);
if (disasm == NULL)
goto err;