[Lldb-commits] [lldb] r333700 - [IRMemoryMap] Test interleaved Mallocs and Frees

Vedant Kumar via lldb-commits lldb-commits at lists.llvm.org
Thu May 31 15:09:01 PDT 2018


Author: vedantk
Date: Thu May 31 15:09:01 2018
New Revision: 333700

URL: http://llvm.org/viewvc/llvm-project?rev=333700&view=rev
Log:
[IRMemoryMap] Test interleaved Mallocs and Frees

This adds a new command to the ir-memory-map tester:

  free <allocation-index>

The argument to free is an index which identifies which live allocation
to free. Index 0 identifies the first live allocation in the address
space, index 1 identifies the second, etc. where the allocations are
sorted in increasing order.

For illustrative purposes, assume malloc returns monotonically
increasing addresses. Here are some examples of how free would work:

Example 1
---------

malloc 16 1
malloc 32 1
free 1      //< Free the 32-byte allocation.
free 0      //< Next, free the 16-byte allocation.

Example 2
---------

malloc 16 1
malloc 32 1
free 0      //< Free the 16-byte allocation.
free 0      //< Next, free the 32-byte allocation.

Added:
    lldb/trunk/lit/Expr/Inputs/ir-memory-map-mix-malloc-free
Modified:
    lldb/trunk/lit/Expr/TestIRMemoryMap.test
    lldb/trunk/tools/lldb-test/lldb-test.cpp

Added: lldb/trunk/lit/Expr/Inputs/ir-memory-map-mix-malloc-free
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Expr/Inputs/ir-memory-map-mix-malloc-free?rev=333700&view=auto
==============================================================================
--- lldb/trunk/lit/Expr/Inputs/ir-memory-map-mix-malloc-free (added)
+++ lldb/trunk/lit/Expr/Inputs/ir-memory-map-mix-malloc-free Thu May 31 15:09:01 2018
@@ -0,0 +1,275 @@
+# This file was generated by a slightly extended version of a script
+# attached to https://reviews.llvm.org/D47508.
+
+malloc 2 4
+malloc 4095 128
+malloc 3 16
+malloc 8192 2
+malloc 1 128
+malloc 3 2
+free 3
+free 3
+malloc 32 2
+malloc 2 16
+free 1
+malloc 2048 2
+free 2
+malloc 2049 4
+malloc 4097 2
+malloc 2 16
+free 1
+free 6
+malloc 1 16
+malloc 33 128
+malloc 2 128
+malloc 2 16
+malloc 2 4
+malloc 2 4
+free 4
+malloc 4 4
+malloc 2 16
+free 3
+malloc 0 128
+free 6
+free 2
+malloc 33 2
+malloc 4095 2
+free 6
+malloc 2 4
+malloc 0 2
+free 1
+free 9
+free 5
+malloc 32 2
+malloc 4096 2
+free 2
+free 9
+free 6
+malloc 8192 16
+malloc 2 4
+malloc 4096 16
+free 10
+malloc 4 4
+free 7
+malloc 4 4
+malloc 8193 2
+malloc 1 2
+free 3
+free 7
+malloc 4096 2
+free 0
+malloc 4096 4
+free 3
+malloc 4097 128
+malloc 1 2
+malloc 4 2
+free 10
+free 8
+malloc 0 16
+malloc 2049 16
+free 9
+malloc 8193 16
+free 10
+free 1
+malloc 8193 2
+free 11
+malloc 3 16
+free 5
+malloc 33 128
+free 0
+malloc 2049 4
+malloc 1 128
+malloc 32 16
+free 1
+free 9
+malloc 2048 4
+free 0
+free 2
+malloc 5 4
+free 11
+malloc 2048 4
+malloc 4097 16
+malloc 8192 4
+free 2
+free 8
+free 11
+malloc 8192 4
+free 2
+malloc 8191 4
+malloc 32 128
+free 7
+malloc 4 16
+malloc 4096 128
+free 12
+malloc 2 4
+free 9
+malloc 8193 128
+malloc 4095 4
+malloc 2049 16
+malloc 2 4
+free 16
+malloc 0 128
+malloc 5 2
+malloc 2047 4
+malloc 2 2
+free 10
+malloc 0 128
+free 6
+malloc 2047 128
+free 11
+free 0
+free 9
+malloc 4 4
+malloc 3 2
+free 7
+malloc 1 128
+free 13
+malloc 8193 16
+malloc 4097 128
+free 15
+free 3
+malloc 1 2
+malloc 2049 4
+malloc 2048 2
+free 7
+malloc 31 4
+free 5
+free 14
+free 4
+free 10
+malloc 4 4
+free 6
+malloc 3 2
+malloc 1 128
+free 13
+malloc 4 16
+free 4
+free 8
+malloc 3 16
+free 13
+malloc 0 4
+free 8
+free 13
+malloc 1 2
+malloc 8192 128
+free 12
+malloc 2049 2
+malloc 1 16
+free 4
+free 7
+malloc 4 16
+malloc 4 128
+malloc 4096 16
+malloc 2048 16
+malloc 32 4
+malloc 8193 4
+free 2
+malloc 3 16
+malloc 8192 4
+free 1
+malloc 8191 2
+free 3
+malloc 8192 2
+malloc 8192 2
+free 3
+free 7
+malloc 31 4
+malloc 2049 2
+free 4
+free 3
+free 14
+free 1
+malloc 2048 4
+malloc 1 4
+malloc 1 4
+malloc 2 4
+malloc 4 16
+free 12
+free 14
+free 3
+free 0
+free 12
+free 10
+malloc 32 16
+free 5
+free 9
+free 4
+free 9
+free 3
+malloc 4096 16
+malloc 4 2
+free 12
+free 10
+free 3
+free 7
+malloc 4097 4
+malloc 4095 16
+free 3
+malloc 2047 16
+free 12
+malloc 8193 2
+free 2
+free 3
+malloc 0 4
+free 2
+free 9
+malloc 8192 16
+malloc 2 2
+malloc 4096 4
+malloc 5 128
+malloc 4095 4
+malloc 4095 4
+free 9
+malloc 32 4
+malloc 31 16
+free 15
+malloc 4097 16
+malloc 2048 128
+malloc 2048 2
+malloc 4096 128
+malloc 3 16
+free 2
+malloc 1 4
+malloc 3 4
+free 3
+malloc 31 2
+malloc 1 128
+free 21
+malloc 0 128
+free 8
+malloc 3 128
+free 5
+malloc 1 16
+free 9
+malloc 2048 4
+free 8
+free 4
+malloc 31 2
+malloc 1 16
+free 19
+malloc 2 4
+malloc 2 2
+free 8
+malloc 8193 16
+free 11
+free 8
+free 6
+free 12
+free 4
+free 0
+free 10
+free 1
+free 0
+free 5
+free 5
+free 3
+free 6
+free 1
+free 2
+free 6
+free 5
+free 4
+free 3
+free 1
+free 1
+free 0

Modified: lldb/trunk/lit/Expr/TestIRMemoryMap.test
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Expr/TestIRMemoryMap.test?rev=333700&r1=333699&r2=333700&view=diff
==============================================================================
--- lldb/trunk/lit/Expr/TestIRMemoryMap.test (original)
+++ lldb/trunk/lit/Expr/TestIRMemoryMap.test Thu May 31 15:09:01 2018
@@ -1,5 +1,10 @@
 # RUN: %cxx %p/Inputs/call-function.cpp -g -o %t
+
 # RUN: lldb-test ir-memory-map %t %S/Inputs/ir-memory-map-basic.test
 # RUN: lldb-test ir-memory-map -host-only %t %S/Inputs/ir-memory-map-basic.test
+
 # RUN: lldb-test ir-memory-map %t %S/Inputs/ir-memory-map-overlap1.test
 # RUN: lldb-test ir-memory-map -host-only %t %S/Inputs/ir-memory-map-overlap1.test
+
+# RUN: lldb-test ir-memory-map %t %S/Inputs/ir-memory-map-mix-malloc-free
+# RUN: lldb-test ir-memory-map -host-only %t %S/Inputs/ir-memory-map-mix-malloc-free

Modified: lldb/trunk/tools/lldb-test/lldb-test.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-test/lldb-test.cpp?rev=333700&r1=333699&r2=333700&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-test/lldb-test.cpp (original)
+++ lldb/trunk/tools/lldb-test/lldb-test.cpp Thu May 31 15:09:01 2018
@@ -169,9 +169,11 @@ static cl::opt<bool> UseHostOnlyAllocati
 using AllocationT = std::pair<addr_t, addr_t>;
 bool areAllocationsOverlapping(const AllocationT &L, const AllocationT &R);
 using AddrIntervalMap =
-      IntervalMap<addr_t, bool, 8, IntervalMapHalfOpenInfo<addr_t>>;
+      IntervalMap<addr_t, unsigned, 8, IntervalMapHalfOpenInfo<addr_t>>;
 bool evalMalloc(IRMemoryMap &IRMemMap, StringRef Line,
                 AddrIntervalMap &AllocatedIntervals);
+bool evalFree(IRMemoryMap &IRMemMap, StringRef Line,
+              AddrIntervalMap &AllocatedIntervals);
 int evaluateMemoryMapCommands(Debugger &Dbg);
 } // namespace irmemorymap
 
@@ -569,9 +571,45 @@ bool opts::irmemorymap::evalMalloc(IRMem
     ++Probe;
   }
 
-  // Insert the new allocation into the interval map.
+  // Insert the new allocation into the interval map. Use unique allocation IDs
+  // to inhibit interval coalescing.
+  static unsigned AllocationID = 0;
   if (Size)
-    AllocatedIntervals.insert(Addr, EndOfRegion, true);
+    AllocatedIntervals.insert(Addr, EndOfRegion, AllocationID++);
+
+  return true;
+}
+
+bool opts::irmemorymap::evalFree(IRMemoryMap &IRMemMap, StringRef Line,
+                                 AddrIntervalMap &AllocatedIntervals) {
+  // ::= free <allocation-index>
+  size_t AllocIndex;
+  int Matches = sscanf(Line.data(), "free %zu", &AllocIndex);
+  if (Matches != 1)
+    return false;
+
+  outs() << formatv("Command: free(allocation-index={0})\n", AllocIndex);
+
+  // Find and free the AllocIndex-th allocation.
+  auto Probe = AllocatedIntervals.begin();
+  for (size_t I = 0; I < AllocIndex && Probe != AllocatedIntervals.end(); ++I)
+    ++Probe;
+
+  if (Probe == AllocatedIntervals.end()) {
+    outs() << "Free error: Invalid allocation index\n";
+    exit(1);
+  }
+
+  Status ST;
+  IRMemMap.Free(Probe.start(), ST);
+  if (ST.Fail()) {
+    outs() << formatv("Free error: {0}\n", ST);
+    exit(1);
+  }
+
+  // Erase the allocation from the live interval map.
+  outs() << formatv("Free: [{0:x}, {1:x})\n", Probe.start(), Probe.stop());
+  Probe.erase();
 
   return true;
 }
@@ -618,6 +656,9 @@ int opts::irmemorymap::evaluateMemoryMap
     if (evalMalloc(IRMemMap, Line, AllocatedIntervals))
       continue;
 
+    if (evalFree(IRMemMap, Line, AllocatedIntervals))
+      continue;
+
     errs() << "Could not parse line: " << Line << "\n";
     exit(1);
   }




More information about the lldb-commits mailing list