[llvm] r234299 - [RuntimeDyld] Always allocate at least 1 byte for object sections in the JIT to

David Blaikie dblaikie at gmail.com
Tue Apr 7 11:57:21 PDT 2015


On Tue, Apr 7, 2015 at 11:52 AM, Lang Hames <lhames at gmail.com> wrote:

> Actually that was lazy thinking on my part - I didn't follow an
> allocate.*Section call all the way to the bottom. I just assumed it was
> mallocing, but it's probably using a bump-ptr allocator. Arguably we should
> have an assertion for zero-sized allocations in our bump-ptr allocators to
> catch zero-sized allocs - I can't think of any situation where they're
> useful.
>
> This fix is required either way, though it may be on the conservative
> side. If I can convince myself that zero-sized sections don't need unique
> addresses (which is almost certainly true) then we can just assign null for
> them rather than calling allocate.*Section.
>
> - Lang.
>
> p.s. In case you're curious, I dug up the relevant malloc rule: "If the
> size of the space requested is 0, the behavior is implementation-defined:
> the value returned shall be either a null pointer or a unique pointer".
> That's almost consistent with new char[0], but not quite, since it sounds
> like the new can't return null.
>

That's correct.


> It's not consistent with the behavior I was seeing, which was non-unique,
> non-null results.
>

I'd wonder whether we should just provide the non-null, unique guarantee to
BumpPtrAllocator, but I haven't thought about it/feel strongly about it/etc.

- David


>
> On Tue, Apr 7, 2015 at 10:58 AM, David Blaikie <dblaikie at gmail.com> wrote:
>
>>
>>
>> On Mon, Apr 6, 2015 at 11:27 PM, Lang Hames <lhames at gmail.com> wrote:
>>
>>> Author: lhames
>>> Date: Tue Apr  7 01:27:56 2015
>>> New Revision: 234299
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=234299&view=rev
>>> Log:
>>> [RuntimeDyld] Always allocate at least 1 byte for object sections in the
>>> JIT to
>>> ensure that section addresses are distinct.
>>>
>>> mapSectionAddress will fail if two sections are allocated the same
>>> address,
>>> which can happen if any section has zero size (since malloc(0) is
>>> implementation
>>> defined). Unfortunately I've been unable to repro this with a simple
>>> test case.
>>>
>>
>> Not sure about malloc, but new is guaranteed to give unique addresses
>> even for zero size allocations...
>>
>>
>>>
>>> Fixes <rdar://problem/20314015>.
>>>
>>>
>>> Modified:
>>>     llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
>>>
>>> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=234299&r1=234298&r2=234299&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)
>>> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Tue Apr
>>> 7 01:27:56 2015
>>> @@ -361,19 +361,20 @@ void RuntimeDyldImpl::computeTotalAllocS
>>>        if (Name == ".eh_frame")
>>>          SectionSize += 4;
>>>
>>> -      if (SectionSize > 0) {
>>> -        // save the total size of the section
>>> -        if (IsCode) {
>>> -          CodeSectionSizes.push_back(SectionSize);
>>> -        } else if (IsReadOnly) {
>>> -          ROSectionSizes.push_back(SectionSize);
>>> -        } else {
>>> -          RWSectionSizes.push_back(SectionSize);
>>> -        }
>>> -        // update the max alignment
>>> -        if (Alignment > MaxAlignment) {
>>> -          MaxAlignment = Alignment;
>>> -        }
>>> +      if (!SectionSize)
>>> +        SectionSize = 1;
>>> +
>>> +      if (IsCode) {
>>> +        CodeSectionSizes.push_back(SectionSize);
>>> +      } else if (IsReadOnly) {
>>> +        ROSectionSizes.push_back(SectionSize);
>>> +      } else {
>>> +        RWSectionSizes.push_back(SectionSize);
>>> +      }
>>> +
>>> +      // update the max alignment
>>> +      if (Alignment > MaxAlignment) {
>>> +        MaxAlignment = Alignment;
>>>        }
>>>      }
>>>    }
>>> @@ -578,6 +579,8 @@ unsigned RuntimeDyldImpl::emitSection(co
>>>    if (IsRequired) {
>>>      Check(Section.getContents(data));
>>>      Allocate = DataSize + PaddingSize + StubBufSize;
>>> +    if (!Allocate)
>>> +      Allocate = 1;
>>>      Addr = IsCode ? MemMgr.allocateCodeSection(Allocate, Alignment,
>>> SectionID,
>>>                                                 Name)
>>>                    : MemMgr.allocateDataSection(Allocate, Alignment,
>>> SectionID,
>>>
>>>
>>> _______________________________________________
>>> 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/20150407/ec469c2d/attachment.html>


More information about the llvm-commits mailing list