StringRef lineSection = StringRef(),
StringRef stringSection = StringRef(),
StringRef rangeSection = StringRef(),
- const RelocAddrMap &Map = RelocAddrMap());
+ const RelocAddrMap *Map = 0);
virtual void dump(raw_ostream &OS) = 0;
StringRef lineSection,
StringRef stringSection,
StringRef rangeSection,
- const RelocAddrMap &Map) {
+ const RelocAddrMap *Map) {
return new DWARFContextInMemory(isLittleEndian, infoSection, abbrevSection,
aRangeSection, lineSection, stringSection,
rangeSection, Map);
/// methods that a concrete implementation provides.
class DWARFContext : public DIContext {
bool IsLittleEndian;
- const RelocAddrMap &RelocMap;
+ const RelocAddrMap *RelocMap;
SmallVector<DWARFCompileUnit, 1> CUs;
OwningPtr<DWARFDebugAbbrev> Abbrev;
/// Read compile units from the debug_info section and store them in CUs.
void parseCompileUnits();
protected:
- DWARFContext(bool isLittleEndian, const RelocAddrMap &Map) :
+ DWARFContext(bool isLittleEndian, const RelocAddrMap *Map) :
IsLittleEndian(isLittleEndian), RelocMap(Map) {}
public:
virtual void dump(raw_ostream &OS);
DILineInfoSpecifier Specifier = DILineInfoSpecifier());
bool isLittleEndian() const { return IsLittleEndian; }
- const RelocAddrMap &relocMap() const { return RelocMap; }
+ const RelocAddrMap *relocMap() const { return RelocMap; }
virtual StringRef getInfoSection() = 0;
virtual StringRef getAbbrevSection() = 0;
StringRef lineSection,
StringRef stringSection,
StringRef rangeSection,
- const RelocAddrMap &Map = RelocAddrMap())
+ const RelocAddrMap *Map = 0)
: DWARFContext(isLittleEndian, Map),
InfoSection(infoSection),
AbbrevSection(abbrevSection),
switch (Form) {
case DW_FORM_addr:
case DW_FORM_ref_addr: {
- RelocAddrMap::const_iterator AI
- = cu->getContext().relocMap().find(*offset_ptr);
- if (AI != cu->getContext().relocMap().end()) {
- const std::pair<uint8_t, int64_t> &R = AI->second;
- Value.uval = R.second;
- *offset_ptr += R.first;
- } else
+ bool InRelocMap = false;
+ if (const RelocAddrMap *RelocMap = cu->getContext().relocMap()) {
+ RelocAddrMap::const_iterator AI = RelocMap->find(*offset_ptr);
+ if (AI != RelocMap->end()) {
+ const std::pair<uint8_t, int64_t> &R = AI->second;
+ Value.uval = R.second;
+ *offset_ptr += R.first;
+ InRelocMap = true;
+ }
+ }
+ if (!InRelocMap)
Value.uval = data.getUnsigned(offset_ptr, cu->getAddressByteSize());
- }
break;
+ }
case DW_FORM_exprloc:
case DW_FORM_block:
Value.uval = data.getULEB128(offset_ptr);
Value.sval = data.getSLEB128(offset_ptr);
break;
case DW_FORM_strp: {
- RelocAddrMap::const_iterator AI
- = cu->getContext().relocMap().find(*offset_ptr);
- if (AI != cu->getContext().relocMap().end()) {
- const std::pair<uint8_t, int64_t> &R = AI->second;
- Value.uval = R.second;
- *offset_ptr += R.first;
- } else
+ bool InRelocMap = false;
+ if (const RelocAddrMap *RelocMap = cu->getContext().relocMap()) {
+ RelocAddrMap::const_iterator AI = RelocMap->find(*offset_ptr);
+ if (AI != RelocMap->end()) {
+ const std::pair<uint8_t, int64_t> &R = AI->second;
+ Value.uval = R.second;
+ *offset_ptr += R.first;
+ InRelocMap = true;
+ }
+ }
+ if (!InRelocMap)
Value.uval = data.getU32(offset_ptr);
break;
}
DebugLineSection,
DebugStringSection,
DebugRangesSection,
- RelocMap));
+ &RelocMap));
if (Address == -1ULL) {
outs() << Filename
<< ":\tfile format " << Obj->getFileFormatName() << "\n\n";