[Lldb-commits] [lldb] r212630 - Dont' use a random probe & alloc strategy for the IRMemoryMap.

Zachary Turner zturner at google.com
Wed Jul 9 09:42:28 PDT 2014


Author: zturner
Date: Wed Jul  9 11:42:27 2014
New Revision: 212630

URL: http://llvm.org/viewvc/llvm-project?rev=212630&view=rev
Log:
Dont' use a random probe & alloc strategy for the IRMemoryMap.

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 that use a very small RAND_MAX allocations will fail
with very high probability.  On such platforms (Windows is one),
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.

There is no good reason that 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.

Reviewed By: Sean Callanan

Differential Revision: http://reviews.llvm.org/D4300

Modified:
    lldb/trunk/source/Expression/IRMemoryMap.cpp

Modified: lldb/trunk/source/Expression/IRMemoryMap.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/IRMemoryMap.cpp?rev=212630&r1=212629&r2=212630&view=diff
==============================================================================
--- lldb/trunk/source/Expression/IRMemoryMap.cpp (original)
+++ lldb/trunk/source/Expression/IRMemoryMap.cpp Wed Jul  9 11:42:27 2014
@@ -53,6 +53,8 @@ IRMemoryMap::FindSpace (size_t size)
     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 @@ IRMemoryMap::FindSpace (size_t size)
             return ret;
     }
 
-    for (int iterations = 0; iterations < 16; ++iterations)
+    ret = 0;
+    if (!m_allocations.empty())
     {
-        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;
+        auto back = m_allocations.rbegin();
+        lldb::addr_t addr = back->first;
+        size_t alloc_size = back->second.m_size;
+        ret = llvm::RoundUpToAlignment(addr+alloc_size, 4096);
     }
 
     return ret;





More information about the lldb-commits mailing list