mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-20 02:28:23 +00:00
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:
parent
0cf613c15a
commit
8fee8dc998
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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),
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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";
|
||||
|
Loading…
Reference in New Issue
Block a user