[PATCH] D47925: Add debug info for OProfile porifling support

Gaetano Priori via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 7 19:24:33 PDT 2018


gipri created this revision.
gipri added reviewers: lhames, rafael.espindola, andrew.w.kaylor.
Herald added subscribers: llvm-commits, JDevlieghere, aprantl.

The LLVM implementation of the OProfile interface is almost complete, except for the support of line level code annotations.
This is an attempt to fill this gap, as the Oprofile wrapper is already capable of registering debug events.


Repository:
  rL LLVM

https://reviews.llvm.org/D47925

Files:
  lib/ExecutionEngine/OProfileJIT/LLVMBuild.txt
  lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp


Index: lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp
===================================================================
--- lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp
+++ lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp
@@ -14,6 +14,8 @@
 
 #include "llvm/CodeGen/MachineFunction.h"
 #include "llvm/Config/config.h"
+#include "llvm/DebugInfo/DIContext.h"
+#include "llvm/DebugInfo/DWARF/DWARFContext.h"
 #include "llvm/ExecutionEngine/JITEventListener.h"
 #include "llvm/ExecutionEngine/OProfileWrapper.h"
 #include "llvm/ExecutionEngine/RuntimeDyld.h"
@@ -84,10 +86,12 @@
 
   OwningBinary<ObjectFile> DebugObjOwner = L.getObjectForDebug(Obj);
   const ObjectFile &DebugObj = *DebugObjOwner.getBinary();
+  std::unique_ptr<DIContext> Context = DWARFContext::create(DebugObj);
 
   // Use symbol info to iterate functions in the object.
   for (const std::pair<SymbolRef, uint64_t> &P : computeSymbolSizes(DebugObj)) {
     SymbolRef Sym = P.first;
+    std::string SourceFileName;
     if (!Sym.getType() || *Sym.getType() != SymbolRef::ST_Function)
       continue;
 
@@ -108,7 +112,29 @@
                    << "]\n");
       continue;
     }
-    // TODO: support line number info (similar to IntelJITEventListener.cpp)
+    DILineInfoTable Lines = Context->getLineInfoForAddressRange(Addr, Size);
+    DILineInfoTable::iterator Begin = Lines.begin();
+    DILineInfoTable::iterator End = Lines.end();
+    size_t i = 0;
+
+    size_t num_entries = std::distance(Begin, End);
+    static struct debug_line_info* debug_line;
+    debug_line = (struct debug_line_info * )calloc(num_entries, sizeof(struct debug_line_info));
+
+    for(DILineInfoTable::iterator It=Begin; It != End; ++It){
+        i = std::distance(Begin,It);
+        debug_line[i].vma = (unsigned long) It->first;
+        debug_line[i].lineno = It->second.Line;
+        SourceFileName = Lines.front().second.FileName;
+        debug_line[i].filename = const_cast<char *>(SourceFileName.c_str());
+    }
+
+    if(Wrapper->op_write_debug_line_info((void*) Addr, num_entries, debug_line) == -1) {
+        DEBUG(dbgs() << "Failed to tell OProfiler about debug object at ["
+                     << (void*) Addr << "-" << ((char *) Addr + Size)
+                     <<  "]\n");
+        continue;
+    }
   }
 
   DebugObjects[Obj.getData().data()] = std::move(DebugObjOwner);
Index: lib/ExecutionEngine/OProfileJIT/LLVMBuild.txt
===================================================================
--- lib/ExecutionEngine/OProfileJIT/LLVMBuild.txt
+++ lib/ExecutionEngine/OProfileJIT/LLVMBuild.txt
@@ -21,4 +21,4 @@
 type = OptionalLibrary
 name = OProfileJIT
 parent = ExecutionEngine
-required_libraries = Support Object ExecutionEngine
+required_libraries = DebugInfoDWARF Support Object ExecutionEngine


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D47925.150439.patch
Type: text/x-patch
Size: 2824 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180608/b1b332a0/attachment.bin>


More information about the llvm-commits mailing list