mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-22 19:38:40 +00:00
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:
parent
47bd03b277
commit
8c818fc35c
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user