diff options
author | Alexey Samsonov <samsonov@google.com> | 2012-11-12 14:25:36 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2012-11-12 14:25:36 +0000 |
commit | 9cb13d59b73a6b04466ad84a7c0e04d4d18413f8 (patch) | |
tree | 51b56d783cffb9600a78e184dcd8abb126d34cd3 /llvm/lib/DebugInfo/DWARFFormValue.cpp | |
parent | c835b9e4a3858d8e19e09e67827f48f93b456abd (diff) | |
download | bcm5719-llvm-9cb13d59b73a6b04466ad84a7c0e04d4d18413f8.tar.gz bcm5719-llvm-9cb13d59b73a6b04466ad84a7c0e04d4d18413f8.zip |
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
Diffstat (limited to 'llvm/lib/DebugInfo/DWARFFormValue.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/DWARFFormValue.cpp | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/llvm/lib/DebugInfo/DWARFFormValue.cpp b/llvm/lib/DebugInfo/DWARFFormValue.cpp index fea9fd7f7d3..b75b0c17b38 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<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; } |