diff options
author | Frederic Riss <friss@apple.com> | 2014-11-12 23:48:04 +0000 |
---|---|---|
committer | Frederic Riss <friss@apple.com> | 2014-11-12 23:48:04 +0000 |
commit | e4576d2c46e66fbf2b7b076a688eb24424852376 (patch) | |
tree | 085b1dd368029f78d130e074261bb7de2c02dc02 /llvm/lib/DebugInfo/DWARFFormValue.cpp | |
parent | 6cbfa91e916a17166145a7b270f5ba284dfd9a90 (diff) | |
download | llvm-e4576d2c46e66fbf2b7b076a688eb24424852376.zip llvm-e4576d2c46e66fbf2b7b076a688eb24424852376.tar.gz llvm-e4576d2c46e66fbf2b7b076a688eb24424852376.tar.bz2 |
Allow DWARFFormValue::extractValue to be called with a null CU.
Currently FormValues are only used for attributes of DIEs and thus
uers always have a CU lying around when calling into the FormValue
API.
Accelerator tables encode their information using the same Forms
as the attributes, thus it is natural to use DWARFFormValue to
extract/dump them. There is no CU in that case though. Allow the
API to be called with a null CU arguemnt by making the RelocMap
lookup conditional on the CU pointer validity. And document this
new behvior in the header. (Test coverage for this use of the API
comes in the DwarfAccelTable support patch)
llvm-svn: 221835
Diffstat (limited to 'llvm/lib/DebugInfo/DWARFFormValue.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/DWARFFormValue.cpp | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/llvm/lib/DebugInfo/DWARFFormValue.cpp b/llvm/lib/DebugInfo/DWARFFormValue.cpp index 0a47861..69b9771 100644 --- a/llvm/lib/DebugInfo/DWARFFormValue.cpp +++ b/llvm/lib/DebugInfo/DWARFFormValue.cpp @@ -139,6 +139,8 @@ bool DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr, switch (Form) { case DW_FORM_addr: case DW_FORM_ref_addr: { + if (!cu) + return false; uint16_t AddrSize = (Form == DW_FORM_addr) ? cu->getAddressByteSize() @@ -179,8 +181,10 @@ bool DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr, break; case DW_FORM_data4: case DW_FORM_ref4: { - RelocAddrMap::const_iterator AI = cu->getRelocMap()->find(*offset_ptr); Value.uval = data.getU32(offset_ptr); + if (!cu) + break; + RelocAddrMap::const_iterator AI = cu->getRelocMap()->find(*offset_ptr-4); if (AI != cu->getRelocMap()->end()) Value.uval += AI->second.second; break; @@ -193,13 +197,12 @@ bool DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr, Value.sval = data.getSLEB128(offset_ptr); break; case DW_FORM_strp: { - RelocAddrMap::const_iterator AI - = cu->getRelocMap()->find(*offset_ptr); - if (AI != cu->getRelocMap()->end()) { - const std::pair<uint8_t, int64_t> &R = AI->second; - Value.uval = data.getU32(offset_ptr) + R.second; - } else - Value.uval = data.getU32(offset_ptr); + Value.uval = data.getU32(offset_ptr); + if (!cu) + break; + RelocAddrMap::const_iterator AI = cu->getRelocMap()->find(*offset_ptr-4); + if (AI != cu->getRelocMap()->end()) + Value.uval += AI->second.second; break; } case DW_FORM_udata: @@ -215,13 +218,12 @@ bool DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr, break; case DW_FORM_sec_offset: { // FIXME: This is 64-bit for DWARF64. - RelocAddrMap::const_iterator AI - = cu->getRelocMap()->find(*offset_ptr); - if (AI != cu->getRelocMap()->end()) { - const std::pair<uint8_t, int64_t> &R = AI->second; - Value.uval = data.getU32(offset_ptr) + R.second; - } else - Value.uval = data.getU32(offset_ptr); + Value.uval = data.getU32(offset_ptr); + if (!cu) + break; + RelocAddrMap::const_iterator AI = cu->getRelocMap()->find(*offset_ptr-4); + if (AI != cu->getRelocMap()->end()) + Value.uval += AI->second.second; break; } case DW_FORM_flag_present: |