Andres Freund via llvm-dev
2020-Mar-16 18:54 UTC
[llvm-dev] ORC JIT Weekly #7 -- JITEventListener support and Swift Immediate Mode Migration
Hi, On 2020-03-09 21:20:44 +0100, Frank Tetzel via llvm-dev wrote:> I think, debugging and profiling support is very important for a JIT > engine. I could never get it to work with older LLVM versions. Is there > example code somewhere available?Since I added the perf listener I probably can help you with that. What exactly was the problem you were hitting? I don't have isolated example code, but it really shouldn't take much code to set up the event listener. All that PG (which is what I added the perf listener for) is doing is: https://github.com/postgres/postgres/blob/master/src/backend/jit/llvm/llvmjit.c#L676 When taking a profile of a program you need to specify -k 1 to perf, to have compatible clocks. E.g. you need to take it like $ perf record -k 1 --call-graph dwarf -o /tmp/perf.data -p 22950 and then you need to inject the JIT information into the profile: $ perf inject -v --jit -i /tmp/perf.data -o /tmp/perf.jit.data after that perf.jit.data is a perf profile enriched with the necessary information, and can normally be inspected by perf report (using -i /tmp/perf.jit.data). If you want debug information within the JITed code (e.g. to see associated source lines or such) that's a separate task - you need to emit debug information, which is unrelated to the listener itself. Greetings, Andres Freund
Frank Tetzel via llvm-dev
2020-Mar-17 18:32 UTC
[llvm-dev] ORC JIT Weekly #7 -- JITEventListener support and Swift Immediate Mode Migration
> On 2020-03-09 21:20:44 +0100, Frank Tetzel via llvm-dev wrote: > > I think, debugging and profiling support is very important for a JIT > > engine. I could never get it to work with older LLVM versions. Is > > there example code somewhere available? > > Since I added the perf listener I probably can help you with that. > What exactly was the problem you were hitting? > > I don't have isolated example code, but it really shouldn't take much > code to set up the event listener. All that PG (which is what I added > the perf listener for) is doing is: > https://github.com/postgres/postgres/blob/master/src/backend/jit/llvm/llvmjit.c#L676 > > When taking a profile of a program you need to specify -k 1 to perf, > to have compatible clocks. E.g. you need to take it like > $ perf record -k 1 --call-graph dwarf -o /tmp/perf.data -p 22950 > and then > you need to inject the JIT information into the profile: > $ perf inject -v --jit -i /tmp/perf.data -o /tmp/perf.jit.data > after that perf.jit.data is a perf profile enriched with the necessary > information, and can normally be inspected by perf report (using -i > /tmp/perf.jit.data).I followed all these steps. During recording, dump files are created in ~/.debug/. Unfortunately, perf report never allowed me to "zoom" into the jitted function and get an assembly view with profile information. Either inject or report do not work for some reason. The tools work fine when I'm using a different JIT library (AsmJit). Maybe it's just some path issue. I do not really like that the dump files are created in ~/.debug/. Last time I tried it was some months ago with LLVM 9. I'll try it shortly with LLVM trunk/master and report back.> If you want debug information within the JITed code (e.g. to see > associated source lines or such) that's a separate task - you need to > emit debug information, which is unrelated to the listener itself.Profiling on the assembly level would already be very helpful. Best regards, Frank
Frank Tetzel via llvm-dev
2020-Mar-31 11:51 UTC
[llvm-dev] ORC JIT Weekly #7 -- JITEventListener support and Swift Immediate Mode Migration
> Last time I tried it was some months ago with LLVM 9. I'll try it > shortly with LLVM trunk/master and report back.Finally, I found the time to try it out again. And it works fine in LLVM master. I haven't tried any other LLVM version. Profiling with perf on assembly level works fine. And so does gdb. One can set pending breakpoints on the to be generated function and execution stops when calling the function which shows that the jit integration in gdb works. I have not played around with debug information. For the perf support, it's a bit of a pain to remember to enable LLVM_USE_PERF when building LLVM. Why not enable it by default? Best regards, Frank