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
This commit is contained in:
Jeffrey Yasskin 2010-04-30 00:16:10 +00:00
parent 47bd03b277
commit 8c818fc35c

View File

@ -114,26 +114,43 @@ void OProfileJITEventListener::NotifyFunctionEmitted(
return; return;
} }
// Now we convert the line number information from the address/DebugLoc format if (!Details.LineStarts.empty()) {
// in Details to the address/filename/lineno format that OProfile expects. // Now we convert the line number information from the address/DebugLoc
// OProfile 0.9.4 (and maybe later versions) has a bug that causes it to // format in Details to the address/filename/lineno format that OProfile
// ignore line numbers for addresses above 4G. // expects. Note that OProfile 0.9.4 has a bug that causes it to ignore
FilenameCache Filenames; // line numbers for addresses above 4G.
std::vector<debug_line_info> LineInfo; FilenameCache Filenames;
LineInfo.reserve(1 + Details.LineStarts.size()); std::vector<debug_line_info> LineInfo;
if (!Details.MF->getDefaultDebugLoc().isUnknown()) { LineInfo.reserve(1 + Details.LineStarts.size());
LineInfo.push_back(LineStartToOProfileFormat(
*Details.MF, Filenames, DebugLoc FirstLoc = Details.LineStarts[0].Loc;
reinterpret_cast<uintptr_t>(FnStart), assert(!FirstLoc.isUnknown()
Details.MF->getDefaultDebugLoc())); && "LineStarts should not contain unknown DebugLocs");
} MDNode *FirstLocScope = FirstLoc.getScope(F.getContext());
for (std::vector<EmittedFunctionDetails::LineStart>::const_iterator 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 = Details.LineStarts.begin(), E = Details.LineStarts.end();
I != E; ++I) { I != E; ++I) {
LineInfo.push_back(LineStartToOProfileFormat( LineInfo.push_back(LineStartToOProfileFormat(
*Details.MF, Filenames, I->Address, I->Loc)); *Details.MF, Filenames, I->Address, I->Loc));
} }
if (!LineInfo.empty()) {
// 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, if (op_write_debug_line_info(Agent, FnStart,
LineInfo.size(), &*LineInfo.begin()) == -1) { LineInfo.size(), &*LineInfo.begin()) == -1) {
DEBUG(dbgs() DEBUG(dbgs()