[llvm] r221835 - Allow DWARFFormValue::extractValue to be called with a null CU.
David Blaikie
dblaikie at gmail.com
Wed Nov 12 15:59:36 PST 2014
On Wed, Nov 12, 2014 at 3:48 PM, Frederic Riss <friss at apple.com> wrote:
> Author: friss
> Date: Wed Nov 12 17:48:04 2014
> New Revision: 221835
>
> URL: http://llvm.org/viewvc/llvm-project?rev=221835&view=rev
> Log:
> 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)
>
> Modified:
> llvm/trunk/include/llvm/DebugInfo/DWARFFormValue.h
> llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARFFormValue.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARFFormValue.h?rev=221835&r1=221834&r2=221835&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARFFormValue.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARFFormValue.h Wed Nov 12 17:48:04
> 2014
> @@ -57,6 +57,13 @@ public:
> bool isFormClass(FormClass FC) const;
>
> void dump(raw_ostream &OS, const DWARFUnit *U) const;
> +
> + /// \brief extracts a value in data at offset *offset_ptr.
> + ///
> + /// The passed DWARFUnit is allowed to be nullptr,
"to be null" (nullptr is just one null pointer literal - "null" is the
general concept)
> in which
> + /// case no relocation processing will be performed and some
> + /// kind of forms that depend on Unit information are disallowed.
>
Disallowed is a bit vague - elegant failure? Assertion? I would probably
prefer assertion failure, if that's reasonable/possible.
> + /// \returns wether the extraction succeeded.
> bool extractValue(DataExtractor data, uint32_t *offset_ptr,
> const DWARFUnit *u);
> bool isInlinedCStr() const {
>
> Modified: llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp?rev=221835&r1=221834&r2=221835&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp Wed Nov 12 17:48:04 2014
> @@ -139,6 +139,8 @@ bool DWARFFormValue::extractValue(DataEx
> 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(DataEx
> 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(DataEx
> 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(DataEx
> 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:
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141112/d43e2f50/attachment.html>
More information about the llvm-commits
mailing list