From 9cb13d59b73a6b04466ad84a7c0e04d4d18413f8 Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Mon, 12 Nov 2012 14:25:36 +0000 Subject: [PATCH] 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 --- llvm/include/llvm/DebugInfo/DIContext.h | 2 +- llvm/lib/DebugInfo/DIContext.cpp | 2 +- llvm/lib/DebugInfo/DWARFContext.h | 8 ++--- llvm/lib/DebugInfo/DWARFFormValue.cpp | 38 ++++++++++++-------- llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp | 2 +- 5 files changed, 30 insertions(+), 22 deletions(-) diff --git a/llvm/include/llvm/DebugInfo/DIContext.h b/llvm/include/llvm/DebugInfo/DIContext.h index 26bd1f627526..23223414bfa7 100644 --- a/llvm/include/llvm/DebugInfo/DIContext.h +++ b/llvm/include/llvm/DebugInfo/DIContext.h @@ -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; diff --git a/llvm/lib/DebugInfo/DIContext.cpp b/llvm/lib/DebugInfo/DIContext.cpp index 691a92c392c2..6484abcfe829 100644 --- a/llvm/lib/DebugInfo/DIContext.cpp +++ b/llvm/lib/DebugInfo/DIContext.cpp @@ -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); diff --git a/llvm/lib/DebugInfo/DWARFContext.h b/llvm/lib/DebugInfo/DWARFContext.h index 4001792b3d5f..d3e9470a8496 100644 --- a/llvm/lib/DebugInfo/DWARFContext.h +++ b/llvm/lib/DebugInfo/DWARFContext.h @@ -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 CUs; OwningPtr 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), diff --git a/llvm/lib/DebugInfo/DWARFFormValue.cpp b/llvm/lib/DebugInfo/DWARFFormValue.cpp index fea9fd7f7d34..b75b0c17b38b 100644 --- a/llvm/lib/DebugInfo/DWARFFormValue.cpp +++ b/llvm/lib/DebugInfo/DWARFFormValue.cpp @@ -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 &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 &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 &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 &R = AI->second; + Value.uval = R.second; + *offset_ptr += R.first; + InRelocMap = true; + } + } + if (!InRelocMap) Value.uval = data.getU32(offset_ptr); break; } diff --git a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp index e73300a0cd8d..c0e3491509d5 100644 --- a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp +++ b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp @@ -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";