[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