[llvm] r221835 - Allow DWARFFormValue::extractValue to be called with a null CU.

David Blaikie dblaikie at gmail.com
Wed Nov 12 16:42:48 PST 2014


On Wed, Nov 12, 2014 at 4:06 PM, Frédéric Riss <friss at apple.com> wrote:

>
> On Nov 12, 2014, at 3:59 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
>
> 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)
>
>
> OK, I’ll fix that up.
>
> 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.
>
>
> With this patch, the extractValue fails, ie. it returns false.
>
I prefer that over the assertion,
>

Why do you prefer that over an assertion? I assume that encoding isn't
valid in the accelerator table - is the table self-describing (does it
include the form code in the data read from the file? So it could, in
theory (if mangled/fuzzed/etc) include a relocatable form?)? In that case I
get where you're coming from, we shouldn't crash/assert on the bytes read
from the file no matter how absurd they are.


> but then disallowed is misleading. I should maybe reword that as "will
> result in an extraction failure”.
>
> Fred
>
> +  /// \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/c9afe1f0/attachment.html>


More information about the llvm-commits mailing list