mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-21 18:24:23 +00:00
DWARF: Put all the pieces we have together and provide a single accessor to DIContext that provides line information when given an address.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139836 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -11,6 +11,7 @@
|
||||
#include "llvm/Support/Dwarf.h"
|
||||
#include "llvm/Support/Format.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include <algorithm>
|
||||
using namespace llvm;
|
||||
using namespace dwarf;
|
||||
|
||||
@ -112,3 +113,51 @@ void DWARFContext::parseCompileUnits() {
|
||||
offset = CUs.back().getNextCompileUnitOffset();
|
||||
}
|
||||
}
|
||||
|
||||
namespace {
|
||||
struct OffsetComparator {
|
||||
bool operator()(const DWARFCompileUnit &LHS,
|
||||
const DWARFCompileUnit &RHS) const {
|
||||
return LHS.getOffset() < RHS.getOffset();
|
||||
}
|
||||
bool operator()(const DWARFCompileUnit &LHS, uint32_t RHS) const {
|
||||
return LHS.getOffset() < RHS;
|
||||
}
|
||||
bool operator()(uint32_t LHS, const DWARFCompileUnit &RHS) const {
|
||||
return LHS < RHS.getOffset();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
DWARFCompileUnit *DWARFContext::getCompileUnitForOffset(uint32_t offset) {
|
||||
if (CUs.empty())
|
||||
parseCompileUnits();
|
||||
|
||||
DWARFCompileUnit *i = std::lower_bound(CUs.begin(), CUs.end(), offset,
|
||||
OffsetComparator());
|
||||
if (i != CUs.end())
|
||||
return &*i;
|
||||
return 0;
|
||||
}
|
||||
|
||||
DILineInfo DWARFContext::getLineInfoForAddress(uint64_t address) {
|
||||
// First, get the index for the arange.
|
||||
uint32_t arangeIndex = getDebugAranges()->findAddress(address);
|
||||
// From there, get the offset of the compile unit.
|
||||
uint32_t cuOffset = getDebugAranges()->offsetAtIndex(arangeIndex);
|
||||
// Retrieve the compile unit.
|
||||
DWARFCompileUnit *cu = getCompileUnitForOffset(cuOffset);
|
||||
// Get the line table for this compile unit.
|
||||
const DWARFDebugLine::LineTable *lineTable = getLineTableForCompileUnit(cu);
|
||||
// Get the index of the row we're looking for in the line table.
|
||||
uint64_t hiPC =
|
||||
cu->getCompileUnitDIE()->getAttributeValueAsUnsigned(cu, DW_AT_high_pc,
|
||||
-1ULL);
|
||||
uint32_t rowIndex = lineTable->lookupAddress(address, hiPC);
|
||||
|
||||
// From here, contruct the DILineInfo.
|
||||
const DWARFDebugLine::Row &row = lineTable->Rows[rowIndex];
|
||||
const std::string &fileName = lineTable->Prologue.FileNames[row.File-1].Name;
|
||||
|
||||
return DILineInfo(fileName.c_str(), row.Line, row.Column);
|
||||
}
|
||||
|
Reference in New Issue
Block a user