[llvm-dev] How to correctly use PerfJITEventListener?

Zhang Boyang via llvm-dev llvm-dev at lists.llvm.org
Sat Jan 9 03:45:22 PST 2021


Hello,
   I encountered the same problem recently. Finally I found it's a bug 
of linux kernel or linux-perf. LLVM uses mmap() and mprotect() to 
generate code. However, mprotect() will merge adjacent VMAs (virtual 
memory area) and report a event of merged VMA, causing pref think prior 
allocated memory has gone. I have reported the bug to Linux Perf Users 
mailing list.
   As a quick & super dirty workaround, I modified 
SectionMemoryManager::allocateSection (in 
llvm/lib/ExecutionEngine/SectionMemoryManager.cpp), let it alloc two 
pieces of memory for each memory request, and use only one of them:

--- a/llvm/lib/ExecutionEngine/SectionMemoryManager.cpp
+++ b/llvm/lib/ExecutionEngine/SectionMemoryManager.cpp
@@ -101,6 +101,9 @@ uint8_t *SectionMemoryManager::allocateSection(
    // FIXME: Initialize the Near member for each memory group to avoid
    // interleaving.
    std::error_code ec;
+  if (1) MMapper.allocateMappedMemory(
+      Purpose, RequiredSize, &MemGroup.Near,
+      sys::Memory::MF_READ | sys::Memory::MF_WRITE, ec); // XXX: SUPER 
DIRTY
    sys::MemoryBlock MB = MMapper.allocateMappedMemory(
        Purpose, RequiredSize, &MemGroup.Near,
        sys::Memory::MF_READ | sys::Memory::MF_WRITE, ec);

   Of course this can't be merged into LLVM, but I think this code may 
help some people who encountered the same problem.

Zhang Boyang

On 2019/1/15 21:09, llvm-dev at lists.llvm.org (Frank Tetzel via 
llvm-dev) wrote:
> Hello,
> 
> I'm struggling to get PerfJITEventListener to work. It was already fun
> to find out that I need to enable LLVM_USE_PERF in cmake during
> compilation, and that the jitdump files are stored in ~/.debug/jit/ by
> default. But it's still not working.
> 
> The steps I do:
> 
> 1. Get event listener with JITEventListener::createPerfJITEventListener
> 2. In NotifyLoadedFunction passed to orc::RTDyldObjectLinkingLayer ctor
>     pass object and info to event listener's NotifyObjectEmitted
> 
> Then, I profile the application with:
> perf record -k 1 ./app
> 
> This generates a jit-*.dump file in ~/.debug/jit/llvm-IR-jit-*/.
> 
> Inject the events into the perf data
> perf inject -j -i perf.data -o perf.data.jitted
> 
> This creates jitted-*.so files in ~/.debug/jit/llvm-IR-jit-*/ for each
> JIT compiled function.
> 
> Finally, I open the profile report:
> perf report -i perf.data.jitted
> 
> But here is the problem. The JIT compiled functions are not "resolved".
> I cannot "zoom in" to the code and annotate the instructions with
> profile information.
> 
> Am I missing something here? Is there a small example somewhere which
> uses PerfJITEventListener with ORC?
> 
> Best regards,
> Frank
> 


More information about the llvm-dev mailing list