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 Index: lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp =================================================================== --- lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp +++ lib/ExecutionEngine/OProfileJIT/OProfileJITEventListener.cpp @@ -86,6 +86,7 @@ OwningBinary DebugObjOwner = L.getObjectForDebug(Obj); const ObjectFile &DebugObj = *DebugObjOwner.getBinary(); + std::unique_ptr Context = DWARFContext::create(DebugObj); // Use symbol info to iterate functions in the object. for (const std::pair &P : computeSymbolSizes(DebugObj)) { @@ -110,7 +111,28 @@ << ((char *)Addr + Size) << "]\n"); continue; } - // TODO: support line number info (similar to IntelJITEventListener.cpp) + + DILineInfoTable Lines = Context->getLineInfoForAddressRange(Addr, Size); + size_t i = 0; + size_t num_entries = Lines.size(); + struct debug_line_info *debug_line; + debug_line = (struct debug_line_info *)calloc( + num_entries, sizeof(struct debug_line_info)); + + for (auto& It : Lines) { + debug_line[i].vma = (unsigned long)It.first; + debug_line[i].lineno = It.second.Line; + debug_line[i].filename = + const_cast(Lines.front().second.FileName.c_str()); + ++i; + } + + 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);