[llvm] r252192 - Reapply r250906 with many suggested updates from Rafael Espindola.

Pasi Parviainen via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 6 17:38:09 PST 2015


On 6.11.2015 22:00, Rafael Espíndola wrote:
> Should be fixed by r252336.
>
> sorry about that.

Thank you, that did indeed fix the crashes.

Pasi.

> Cheers,
> Rafael
>
>
> On 6 November 2015 at 14:48, Rafael Espíndola
> <rafael.espindola at gmail.com> wrote:
>> I am taking a look. That buffer has just been created by lld, it is
>> odd that it is failing.
>>
>> On 6 November 2015 at 14:38, Pasi Parviainen <pasi.parviainen at iki.fi> wrote:
>>> On 6.11.2015 20:15, Kevin Enderby wrote:
>>>>
>>>> Hello Pasi,
>>>>
>>>> When I ran a make check-all I did not see any crashes.  Can you point me
>>>> to the test case for the lld-link crash?  Then I can fix this. Top of tree
>>>> for my just now with a make check-all also is clean and the 4 lld build bots
>>>> appear to be green at this time.
>>>
>>>
>>> Failing tests are:
>>>      lld :: COFF/dll.test
>>>      lld :: COFF/export-exe.test
>>>      lld :: COFF/export.test
>>>      lld :: COFF/export32.test
>>>      lld :: COFF/noentry.test
>>>
>>> All these tests are marked to require winlib, so windows bot
>>> (lld-x86_64-win7) could have detected these, if it only were running the
>>> tests.
>>>
>>>> The constructor for Archive::Child::Child() only allows nullptr as EC
>>>> argument when Parent and Start are also nullptr.  Which is needed for the
>>>> default constructor of child_iterator().  At one point we needed this as I
>>>> think ArchiveWriter was using this.  As it would have seemed to be more
>>>> correct to pass EC as a reference but I didn’t see how to make that work
>>>> with a default constructor for child_iterator().
>>>>
>>>> In the original diff I had this as an assert (see
>>>> http://reviews.llvm.org/D13989 <http://reviews.llvm.org/D13989> ):
>>>>
>>>>       if (MemberSize.getError()) {
>>>>         assert (EC && "Error must be caught");
>>>>         *EC = MemberSize.getError();
>>>>         return;
>>>>       }
>>>>
>>>> But Rafael said in the review: "You can write this as”:
>>>>
>>>>        if ((EC = MemberSize.getError())
>>>>         return;
>>>>
>>>> The fix to a crash lld-link is likely simply passing a proper value for EC
>>>> and testing for the error.  And I suspect this is what Rafael would like to
>>>> see as he doesn’t want the code to eat these errors in any place.
>>>
>>>
>>> Then the interface contract is violated in ShortImportCreator::create method
>>> (lld/COFF/DriverUtils.cpp) where constructor is called with non-null Start
>>> argument. It ends with:
>>>
>>>          object::Archive::Child C(Parent, Buf, nullptr);
>>>          return NewArchiveIterator(C, DLLName);
>>>
>>> Pasi
>>>
>>>
>>>> Happy to make this change if you can point me to the crash or the test
>>>> case.
>>>>
>>>> Kev
>>>>
>>>>> On Nov 6, 2015, at 12:23 AM, Pasi Parviainen <pasi.parviainen at iki.fi>
>>>>> wrote:
>>>>>
>>>>>> @@ -86,7 +86,8 @@ Archive::Child::Child(const Archive *Par
>>>>>>                          uint16_t StartOfFile)
>>>>>>        : Parent(Parent), Data(Data), StartOfFile(StartOfFile) {}
>>>>>>
>>>>>> -Archive::Child::Child(const Archive *Parent, const char *Start)
>>>>>> +Archive::Child::Child(const Archive *Parent, const char *Start,
>>>>>> +                      std::error_code *EC)
>>>>>>        : Parent(Parent) {
>>>>>>      if (!Start)
>>>>>>        return;
>>>>>> @@ -94,7 +95,10 @@ Archive::Child::Child(const Archive *Par
>>>>>>      uint64_t Size = sizeof(ArchiveMemberHeader);
>>>>>>      Data = StringRef(Start, Size);
>>>>>>      if (!isThinMember()) {
>>>>>> -    Size += getRawSize();
>>>>>> +    ErrorOr<uint64_t> MemberSize = getRawSize();
>>>>>> +    if ((*EC = MemberSize.getError()))
>>>>>> +      return;
>>>>>
>>>>>
>>>>> lld-link is crashing here since matching changes to lld in r252193. Crash
>>>>> is caused by passing nullptr as EC argument. If nullptr is valid value for
>>>>> EC then this check should be more like:
>>>>>
>>>>>      if (!MemberSize) {
>>>>>        if (EC)
>>>>>          *EC = MemberSize.getError();
>>>>>        return;
>>>>>      }
>>>>>
>>>>> Pasi
>>>>
>>>>
>>>>
>>>



More information about the llvm-commits mailing list