Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf llvm: Reduce LLVM initialization

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>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexandre Ghiti <alexghiti@rivosinc.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.ibm.com>
Cc: Bill Wendling <morbo@google.com>
Cc: Charlie Jenkins <charlie@rivosinc.com>
Cc: Collin Funk <collin.funk1@gmail.com>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Dr. David Alan Gilbert <linux@treblig.org>
Cc: Eric Biggers <ebiggers@kernel.org>
Cc: Haibo Xu <haibo1.xu@intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Justin Stitt <justinstitt@google.com>
Cc: Li Huafei <lihuafei1@huawei.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Nick Desaulniers <nick.desaulniers+lkml@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <song@kernel.org>
Cc: Stephen Brennan <stephen.s.brennan@oracle.com>
[ Move init_llvm() under HAVE_LIBLLVM_SUPPORT to fix the build ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Ian Rogers and committed by
Arnaldo Carvalho de Melo
0e52f3f9 e444c2d4

+21 -12
+21 -12
tools/perf/util/llvm.c
··· 74 74 /* Nothing to free. */ 75 75 } 76 76 77 + #ifdef HAVE_LIBLLVM_SUPPORT 78 + static void init_llvm(void) 79 + { 80 + static bool init; 77 81 78 - #if defined(HAVE_LIBLLVM_SUPPORT) 82 + if (!init) { 83 + LLVMInitializeAllTargetInfos(); 84 + LLVMInitializeAllTargetMCs(); 85 + LLVMInitializeAllDisassemblers(); 86 + init = true; 87 + } 88 + } 89 + 79 90 struct find_file_offset_data { 80 91 u64 ip; 81 92 u64 offset; ··· 195 184 u64 len; 196 185 u64 pc; 197 186 bool is_64bit; 198 - char triplet[64]; 199 187 char disasm_buf[2048]; 200 188 size_t disasm_len; 201 189 struct disasm_line *dl; ··· 207 197 if (args->options->objdump_path) 208 198 return -1; 209 199 210 - LLVMInitializeAllTargetInfos(); 211 - LLVMInitializeAllTargetMCs(); 212 - LLVMInitializeAllDisassemblers(); 213 - 214 200 buf = read_symbol(filename, map, sym, &len, &is_64bit); 215 201 if (buf == NULL) 216 202 return -1; 217 203 204 + init_llvm(); 218 205 if (arch__is(args->arch, "x86")) { 219 - if (is_64bit) 220 - scnprintf(triplet, sizeof(triplet), "x86_64-pc-linux"); 221 - else 222 - scnprintf(triplet, sizeof(triplet), "i686-pc-linux"); 206 + const char *triplet = is_64bit ? "x86_64-pc-linux" : "i686-pc-linux"; 207 + 208 + disasm = LLVMCreateDisasm(triplet, &storage, /*tag_type=*/0, 209 + /*get_op_info=*/NULL, symbol_lookup_callback); 223 210 } else { 211 + char triplet[64]; 212 + 224 213 scnprintf(triplet, sizeof(triplet), "%s-linux-gnu", 225 214 args->arch->name); 215 + disasm = LLVMCreateDisasm(triplet, &storage, /*tag_type=*/0, 216 + /*get_op_info=*/NULL, symbol_lookup_callback); 226 217 } 227 218 228 - disasm = LLVMCreateDisasm(triplet, &storage, 0, NULL, 229 - symbol_lookup_callback); 230 219 if (disasm == NULL) 231 220 goto err; 232 221