[Lldb-commits] [PATCH] Don't use a random probe / allocation scheme in the IRMemoryMap

Zachary Turner zturner at google.com
Mon Jun 30 10:29:04 PDT 2014


Hope it's ok to bump this again.  No worries if you're busy, just want to
make sure this doesn't get lost.


On Thu, Jun 26, 2014 at 7:49 PM, Zachary Turner <zturner at google.com> wrote:

> +scallanan
>
> I tried to add you to the review through Phab, but it looks like you
> weren't registered.  Thanks
>
>
> On Wed, Jun 25, 2014 at 4:15 PM, Zachary Turner <zturner at google.com>
> wrote:
>
>> The current strategy for host allocation is to choose a random address
>> and attempt to allocate there, eventually failing if the allocation cannot
>> be satisfied.
>>
>> The C standard only guarantees that RAND_MAX >= 32767, so for platforms
>> where this is true allocations will fail with very high probability.   On
>> such platforms, you can reproduce this trivially by running lldb, typing
>> "expr (3)" and then hitting enter you see a failure.  Failures generally
>> happen with a frequency of about 1 failure every 5 evaluations.
>>
>> I cannot come up with a good reason that the allocations need to look
>> like "real" pointers, so this patch changes the allocation scheme to simply
>> jump straight to the end and grab a free chunk of memory.
>>
>> http://reviews.llvm.org/D4300
>>
>> Files:
>>   source/Expression/IRMemoryMap.cpp
>>
>> Index: source/Expression/IRMemoryMap.cpp
>> ===================================================================
>> --- source/Expression/IRMemoryMap.cpp
>> +++ source/Expression/IRMemoryMap.cpp
>> @@ -53,6 +53,8 @@
>>      lldb::ProcessSP process_sp = m_process_wp.lock();
>>
>>      lldb::addr_t ret = LLDB_INVALID_ADDRESS;
>> +    if (size == 0)
>> +      return ret;
>>
>>      if (process_sp && process_sp->CanJIT() && process_sp->IsAlive())
>>      {
>> @@ -66,37 +68,13 @@
>>              return ret;
>>      }
>>
>> -    for (int iterations = 0; iterations < 16; ++iterations)
>> -    {
>> -        lldb::addr_t candidate = LLDB_INVALID_ADDRESS;
>> -
>> -        switch (target_sp->GetArchitecture().GetAddressByteSize())
>> -        {
>> -        case 4:
>> -            {
>> -                uint32_t random_data = rand();
>> -                candidate = random_data;
>> -                candidate &= ~0xfffull;
>> -                break;
>> -            }
>> -        case 8:
>> -            {
>> -                uint32_t random_low = rand();
>> -                uint32_t random_high = rand();
>> -                candidate = random_high;
>> -                candidate <<= 32ull;
>> -                candidate |= random_low;
>> -                candidate &= ~0xfffull;
>> -                break;
>> -            }
>> -        }
>> -
>> -        if (IntersectsAllocation(candidate, size))
>> -            continue;
>> -
>> -        ret = candidate;
>> -
>> -        return ret;
>> +    // Don't allocate from the zero page.
>> +    ret = 0x1000;
>> +    if (!m_allocations.empty()) {
>> +      auto back = m_allocations.rbegin();
>> +      lldb::addr_t addr = back->first;
>> +      size_t size = back->second.m_size;
>> +      ret = llvm::RoundUpToAlignment(addr+size, 4096);
>>      }
>>
>>      return ret;
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20140630/2472a45a/attachment.html>


More information about the lldb-commits mailing list