[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