Fixup for r167558: Store raw pointer (instead of reference) to RelocMap in DIContext. This is needed to prevent crashes because of dangling reference if the clients don't provide RelocMap to DIContext constructor.

llvm-svn: 167728
This commit is contained in:
Alexey Samsonov 2012-11-12 14:25:36 +00:00
parent 0cf613c15a
commit 8fee8dc998
5 changed files with 30 additions and 22 deletions

View File

@ -109,7 +109,7 @@ public:
StringRef lineSection = StringRef(),
StringRef stringSection = StringRef(),
StringRef rangeSection = StringRef(),
const RelocAddrMap &Map = RelocAddrMap());
const RelocAddrMap *Map = 0);
virtual void dump(raw_ostream &OS) = 0;

View File

@ -20,7 +20,7 @@ DIContext *DIContext::getDWARFContext(bool isLittleEndian,
StringRef lineSection,
StringRef stringSection,
StringRef rangeSection,
const RelocAddrMap &Map) {
const RelocAddrMap *Map) {
return new DWARFContextInMemory(isLittleEndian, infoSection, abbrevSection,
aRangeSection, lineSection, stringSection,
rangeSection, Map);

View File

@ -26,7 +26,7 @@ namespace llvm {
/// 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;
@ -39,7 +39,7 @@ class DWARFContext : public DIContext {
/// 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);
@ -73,7 +73,7 @@ public:
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;
@ -113,7 +113,7 @@ public:
StringRef lineSection,
StringRef stringSection,
StringRef rangeSection,
const RelocAddrMap &Map = RelocAddrMap())
const RelocAddrMap *Map = 0)
: DWARFContext(isLittleEndian, Map),
InfoSection(infoSection),
AbbrevSection(abbrevSection),

View File

@ -100,16 +100,20 @@ DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr,
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);
@ -148,13 +152,17 @@ DWARFFormValue::extractValue(DataExtractor data, uint32_t *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;
}

View File

@ -162,7 +162,7 @@ static void DumpInput(const StringRef &Filename) {
DebugLineSection,
DebugStringSection,
DebugRangesSection,
RelocMap));
&RelocMap));
if (Address == -1ULL) {
outs() << Filename
<< ":\tfile format " << Obj->getFileFormatName() << "\n\n";