diff options
author | Jeffrey Yasskin <jyasskin@google.com> | 2010-04-30 00:16:10 +0000 |
---|---|---|
committer | Jeffrey Yasskin <jyasskin@google.com> | 2010-04-30 00:16:10 +0000 |
commit | 8c818fc35cc7675e8c1743359f2ac23006d09c4c (patch) | |
tree | 455e1ce7e1a53515a7da15e5265f10f69461c5bb /lib/ExecutionEngine/JIT | |
parent | 47bd03b2779bc500fb0472518d0e278f080ee79a (diff) | |
download | external_llvm-8c818fc35cc7675e8c1743359f2ac23006d09c4c.zip external_llvm-8c818fc35cc7675e8c1743359f2ac23006d09c4c.tar.gz external_llvm-8c818fc35cc7675e8c1743359f2ac23006d09c4c.tar.bz2 |
Fix the OProfileJITEventListener build after r101844 removed
MachineFunction::DefaultDebugLoc. We now use the same technique as
DwarfDebug::beginFunction to find the starting line number for a
function.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102679 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/JIT')
-rw-r--r-- | lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp | 55 |
1 files changed, 36 insertions, 19 deletions
diff --git a/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp b/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp index 9c01b73..1ca084b 100644 --- a/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp +++ b/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp @@ -114,26 +114,43 @@ void OProfileJITEventListener::NotifyFunctionEmitted( return; } - // Now we convert the line number information from the address/DebugLoc format - // in Details to the address/filename/lineno format that OProfile expects. - // OProfile 0.9.4 (and maybe later versions) has a bug that causes it to - // ignore line numbers for addresses above 4G. - FilenameCache Filenames; - std::vector<debug_line_info> LineInfo; - LineInfo.reserve(1 + Details.LineStarts.size()); - if (!Details.MF->getDefaultDebugLoc().isUnknown()) { - LineInfo.push_back(LineStartToOProfileFormat( - *Details.MF, Filenames, - reinterpret_cast<uintptr_t>(FnStart), - Details.MF->getDefaultDebugLoc())); - } - for (std::vector<EmittedFunctionDetails::LineStart>::const_iterator + if (!Details.LineStarts.empty()) { + // Now we convert the line number information from the address/DebugLoc + // format in Details to the address/filename/lineno format that OProfile + // expects. Note that OProfile 0.9.4 has a bug that causes it to ignore + // line numbers for addresses above 4G. + FilenameCache Filenames; + std::vector<debug_line_info> LineInfo; + LineInfo.reserve(1 + Details.LineStarts.size()); + + DebugLoc FirstLoc = Details.LineStarts[0].Loc; + assert(!FirstLoc.isUnknown() + && "LineStarts should not contain unknown DebugLocs"); + MDNode *FirstLocScope = FirstLoc.getScope(F.getContext()); + DISubprogram FunctionDI = getDISubprogram(FirstLocScope); + if (FunctionDI.Verify()) { + // If we have debug info for the function itself, use that as the line + // number of the first several instructions. Otherwise, after filling + // LineInfo, we'll adjust the address of the first line number to point at + // the start of the function. + debug_line_info line_info; + line_info.vma = reinterpret_cast<uintptr_t>(FnStart); + line_info.lineno = FunctionDI.getLineNumber(); + line_info.filename = Filenames.getFilename(FirstLocScope); + LineInfo.push_back(line_info); + } + + for (std::vector<EmittedFunctionDetails::LineStart>::const_iterator I = Details.LineStarts.begin(), E = Details.LineStarts.end(); - I != E; ++I) { - LineInfo.push_back(LineStartToOProfileFormat( - *Details.MF, Filenames, I->Address, I->Loc)); - } - if (!LineInfo.empty()) { + I != E; ++I) { + LineInfo.push_back(LineStartToOProfileFormat( + *Details.MF, Filenames, I->Address, I->Loc)); + } + + // In case the function didn't have line info of its own, adjust the first + // line info's address to include the start of the function. + LineInfo[0].vma = reinterpret_cast<uintptr_t>(FnStart); + if (op_write_debug_line_info(Agent, FnStart, LineInfo.size(), &*LineInfo.begin()) == -1) { DEBUG(dbgs() |