[Lldb-commits] [lldb] r333930 - [IRMemoryMap] Use labels in the "malloc" and "free" lldb-test commands

Vedant Kumar via lldb-commits lldb-commits at lists.llvm.org
Mon Jun 4 10:11:15 PDT 2018


Author: vedantk
Date: Mon Jun  4 10:11:15 2018
New Revision: 333930

URL: http://llvm.org/viewvc/llvm-project?rev=333930&view=rev
Log:
[IRMemoryMap] Use labels in the "malloc" and "free" lldb-test commands

Change the syntax of the malloc and free commands in lldb-test's
ir-memory-map subcommand to:

  <malloc> ::= <label> = malloc <size> <alignment>

  <free> ::= free <label>

This should make it easier to read and extend tests in the future, e.g
to test IRMemoryMap::WriteMemory or double-free behavior.

Differential Revision: https://reviews.llvm.org/D47646

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

Modified: lldb/trunk/lit/Expr/Inputs/ir-memory-map-basic
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Expr/Inputs/ir-memory-map-basic?rev=333930&r1=333929&r2=333930&view=diff
==============================================================================
--- lldb/trunk/lit/Expr/Inputs/ir-memory-map-basic (original)
+++ lldb/trunk/lit/Expr/Inputs/ir-memory-map-basic Mon Jun  4 10:11:15 2018
@@ -1,25 +1,25 @@
-malloc 0 1
-malloc 1 1
+L1 = malloc 0 1
+L2 = malloc 1 1
 
-malloc 2 1
-malloc 2 2
-malloc 2 4
-
-malloc 3 1
-malloc 3 2
-malloc 3 4
-
-malloc 128 1
-malloc 128 2
-malloc 128 4
-malloc 128 128
-
-malloc 2048 1
-malloc 2048 2
-malloc 2048 4
-
-malloc 3968 1
-malloc 3968 2
-malloc 3968 4
+L3 = malloc 2 1
+L4 = malloc 2 2
+L5 = malloc 2 4
+
+L6 = malloc 3 1
+L7 = malloc 3 2
+L8 = malloc 3 4
+
+L9 = malloc 128 1
+L10 = malloc 128 2
+L11 = malloc 128 4
+L12 = malloc 128 128
+
+L13 = malloc 2048 1
+L14 = malloc 2048 2
+L15 = malloc 2048 4
+
+L16 = malloc 3968 1
+L17 = malloc 3968 2
+L18 = malloc 3968 4
 
-malloc 0 1
+L19 = malloc 0 1

Modified: 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=333930&r1=333929&r2=333930&view=diff
==============================================================================
--- lldb/trunk/lit/Expr/Inputs/ir-memory-map-mix-malloc-free (original)
+++ lldb/trunk/lit/Expr/Inputs/ir-memory-map-mix-malloc-free Mon Jun  4 10:11:15 2018
@@ -1,275 +1,272 @@
-# 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
+L1 = malloc 32 2
+free L1
+L2 = malloc 3 4
+L3 = malloc 3 128
+free L3
+free L2
+L4 = malloc 2 16
+free L4
+L5 = malloc 4097 4
+free L5
+L6 = malloc 2 2
+L7 = malloc 3 2
+L8 = malloc 32 16
+free L6
+free L8
+free L7
+L9 = malloc 8192 2
+L10 = malloc 33 4
+free L9
+L11 = malloc 2047 2
+L12 = malloc 5 16
+L13 = malloc 4 16
+L14 = malloc 2048 2
+free L10
+L15 = malloc 4 128
+free L13
+L16 = malloc 1 2
+L17 = malloc 4095 128
+free L12
+free L15
+L18 = malloc 0 128
+L19 = malloc 2 128
+L20 = malloc 4096 2
+L21 = malloc 2 2
+L22 = malloc 8192 128
+L23 = malloc 4 2
+L24 = malloc 4097 4
+free L19
+free L20
+L25 = malloc 3 128
+free L23
+free L21
+free L22
+free L25
+free L16
+L26 = malloc 1 128
+L27 = malloc 4096 4
+free L14
+L28 = malloc 31 2
+free L24
+L29 = malloc 2048 128
+free L28
+free L11
+L30 = malloc 4 2
+L31 = malloc 32 16
+L32 = malloc 1 4
+free L30
+L33 = malloc 3 2
+L34 = malloc 4096 4
+free L17
+free L18
+free L32
+L35 = malloc 4097 4
+L36 = malloc 8193 2
+L37 = malloc 3 2
+free L34
+L38 = malloc 8193 16
+L39 = malloc 4096 4
+L40 = malloc 8192 16
+L41 = malloc 32 4
+free L26
+free L38
+free L37
+L42 = malloc 0 2
+free L31
+free L40
+free L36
+free L35
+L43 = malloc 2047 2
+free L41
+L44 = malloc 4 4
+free L43
+free L33
+free L42
+L45 = malloc 4097 16
+free L27
+L46 = malloc 32 128
+L47 = malloc 8191 16
+L48 = malloc 1 16
+L49 = malloc 32 128
+L50 = malloc 3 2
+L51 = malloc 4096 128
+free L51
+L52 = malloc 2048 4
+free L29
+L53 = malloc 4097 128
+free L44
+L54 = malloc 1 16
+L55 = malloc 4095 16
+L56 = malloc 2047 2
+L57 = malloc 0 2
+L58 = malloc 2048 2
+free L48
+L59 = malloc 1 4
+L60 = malloc 32 16
+free L50
+L61 = malloc 1 4
+L62 = malloc 4096 2
+free L60
+L63 = malloc 1 16
+L64 = malloc 32 128
+free L55
+L65 = malloc 8192 16
+free L57
+L66 = malloc 1 128
+free L65
+free L61
+free L45
+free L64
+free L39
+L67 = malloc 2048 2
+free L47
+L68 = malloc 2049 4
+free L63
+free L68
+free L54
+free L59
+free L52
+L69 = malloc 2 2
+L70 = malloc 8192 16
+L71 = malloc 2049 16
+L72 = malloc 3 16
+L73 = malloc 4097 16
+L74 = malloc 4096 2
+L75 = malloc 4097 4
+free L67
+free L71
+free L72
+free L75
+free L74
+L76 = malloc 3 4
+free L70
+free L69
+L77 = malloc 4 4
+free L49
+L78 = malloc 4096 16
+L79 = malloc 33 2
+free L76
+L80 = malloc 2 16
+free L58
+free L80
+free L56
+L81 = malloc 1 128
+free L73
+L82 = malloc 1 16
+free L53
+free L81
+free L77
+L83 = malloc 2 2
+L84 = malloc 3 16
+free L62
+L85 = malloc 2049 2
+free L83
+L86 = malloc 3 4
+L87 = malloc 4096 128
+free L86
+L88 = malloc 3 2
+free L82
+free L66
+free L84
+L89 = malloc 8192 4
+free L88
+L90 = malloc 3 4
+L91 = malloc 1 4
+L92 = malloc 4097 4
+L93 = malloc 5 16
+L94 = malloc 2 128
+L95 = malloc 4096 2
+L96 = malloc 32 16
+L97 = malloc 8192 16
+L98 = malloc 32 128
+free L90
+free L79
+L99 = malloc 8193 4
+free L46
+L100 = malloc 31 4
+L101 = malloc 8192 128
+free L99
+L102 = malloc 2049 16
+L103 = malloc 4 2
+L104 = malloc 32 2
+free L101
+free L98
+L105 = malloc 1 16
+free L92
+L106 = malloc 2 2
+L107 = malloc 31 16
+L108 = malloc 2 4
+free L94
+L109 = malloc 4097 4
+L110 = malloc 31 4
+free L103
+L111 = malloc 31 4
+free L111
+L112 = malloc 2049 2
+L113 = malloc 32 128
+free L106
+L114 = malloc 8191 2
+free L105
+free L97
+free L109
+L115 = malloc 2 16
+free L78
+free L93
+free L114
+free L115
+free L96
+free L85
+L116 = malloc 2 16
+free L89
+free L87
+L117 = malloc 33 2
+L118 = malloc 1 4
+L119 = malloc 4096 128
+free L107
+L120 = malloc 8192 4
+L121 = malloc 1 128
+L122 = malloc 3 4
+L123 = malloc 2047 4
+L124 = malloc 2 2
+free L121
+free L102
+L125 = malloc 2 4
+L126 = malloc 1 16
+L127 = malloc 2048 2
+L128 = malloc 2048 16
+L129 = malloc 32 128
+free L124
+L130 = malloc 2048 16
+L131 = malloc 32 16
+L132 = malloc 32 128
+free L100
+free L117
+free L126
+L133 = malloc 8192 4
+L134 = malloc 8192 2
+L135 = malloc 2 16
+free L119
+L136 = malloc 31 16
+free L118
+free L125
+free L132
+free L122
+free L134
+free L136
+free L130
+free L110
+free L123
+free L104
+free L116
+free L133
+free L91
+free L113
+free L128
+free L129
+free L95
+free L131
+free L127
+free L112
+free L108
+free L135
+free L120
\ No newline at end of file

Modified: lldb/trunk/lit/Expr/Inputs/ir-memory-map-overlap1
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Expr/Inputs/ir-memory-map-overlap1?rev=333930&r1=333929&r2=333930&view=diff
==============================================================================
--- lldb/trunk/lit/Expr/Inputs/ir-memory-map-overlap1 (original)
+++ lldb/trunk/lit/Expr/Inputs/ir-memory-map-overlap1 Mon Jun  4 10:11:15 2018
@@ -1,10 +1,10 @@
-malloc 8 16
-malloc 16 8
-malloc 64 32
-malloc 1 8
-malloc 64 32
-malloc 64 8
-malloc 1024 32
-malloc 1 16
-malloc 8 16
-malloc 1024 16
\ No newline at end of file
+L1 = malloc 8 16
+L2 = malloc 16 8
+L3 = malloc 64 32
+L4 = malloc 1 8
+L5 = malloc 64 32
+L6 = malloc 64 8
+L7 = malloc 1024 32
+L8 = malloc 1 16
+L9 = malloc 8 16
+L10 = malloc 1024 16

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=333930&r1=333929&r2=333930&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-test/lldb-test.cpp (original)
+++ lldb/trunk/tools/lldb-test/lldb-test.cpp Mon Jun  4 10:11:15 2018
@@ -167,13 +167,25 @@ static cl::opt<bool> UseHostOnlyAllocati
     cl::init(false), cl::sub(IRMemoryMapSubcommand));
 
 using AllocationT = std::pair<addr_t, addr_t>;
-bool areAllocationsOverlapping(const AllocationT &L, const AllocationT &R);
 using AddrIntervalMap =
       IntervalMap<addr_t, unsigned, 8, IntervalMapHalfOpenInfo<addr_t>>;
-bool evalMalloc(IRMemoryMap &IRMemMap, StringRef Line,
-                AddrIntervalMap &AllocatedIntervals);
-bool evalFree(IRMemoryMap &IRMemMap, StringRef Line,
-              AddrIntervalMap &AllocatedIntervals);
+
+struct IRMemoryMapTestState {
+  TargetSP Target;
+  IRMemoryMap Map;
+
+  AddrIntervalMap::Allocator IntervalMapAllocator;
+  AddrIntervalMap Allocations;
+
+  StringMap<addr_t> Label2AddrMap;
+
+  IRMemoryMapTestState(TargetSP Target)
+      : Target(Target), Map(Target), Allocations(IntervalMapAllocator) {}
+};
+
+bool areAllocationsOverlapping(const AllocationT &L, const AllocationT &R);
+bool evalMalloc(StringRef Line, IRMemoryMapTestState &State);
+bool evalFree(StringRef Line, IRMemoryMapTestState &State);
 int evaluateMemoryMapCommands(Debugger &Dbg);
 } // namespace irmemorymap
 
@@ -514,17 +526,23 @@ bool opts::irmemorymap::areAllocationsOv
   return R.first < L.second && L.first < R.second;
 }
 
-bool opts::irmemorymap::evalMalloc(IRMemoryMap &IRMemMap, StringRef Line,
-                                   AddrIntervalMap &AllocatedIntervals) {
-  // ::= malloc <size> <alignment>
+bool opts::irmemorymap::evalMalloc(StringRef Line,
+                                   IRMemoryMapTestState &State) {
+  // ::= <label> = malloc <size> <alignment>
+  StringRef Label;
+  std::tie(Label, Line) = Line.split('=');
+  if (Line.empty())
+    return false;
+  Label = Label.trim();
+  Line = Line.trim();
   size_t Size;
   uint8_t Alignment;
   int Matches = sscanf(Line.data(), "malloc %zu %hhu", &Size, &Alignment);
   if (Matches != 2)
     return false;
 
-  outs() << formatv("Command: malloc(size={0}, alignment={1})\n", Size,
-                    Alignment);
+  outs() << formatv("Command: {0} = malloc(size={1}, alignment={2})\n", Label,
+                    Size, Alignment);
   if (!isPowerOf2_32(Alignment)) {
     outs() << "Malloc error: alignment is not a power of 2\n";
     exit(1);
@@ -539,7 +557,7 @@ bool opts::irmemorymap::evalMalloc(IRMem
   const bool ZeroMemory = false;
   Status ST;
   addr_t Addr =
-      IRMemMap.Malloc(Size, Alignment, Permissions, AP, ZeroMemory, ST);
+      State.Map.Malloc(Size, Alignment, Permissions, AP, ZeroMemory, ST);
   if (ST.Fail()) {
     outs() << formatv("Malloc error: {0}\n", ST);
     return true;
@@ -557,10 +575,10 @@ bool opts::irmemorymap::evalMalloc(IRMem
   // Check that the allocation does not overlap another allocation. Do so by
   // testing each allocation which may cover the interval [Addr, EndOfRegion).
   addr_t EndOfRegion = Addr + Size;
-  auto Probe = AllocatedIntervals.begin();
+  auto Probe = State.Allocations.begin();
   Probe.advanceTo(Addr); //< First interval s.t stop >= Addr.
   AllocationT NewAllocation = {Addr, EndOfRegion};
-  while (Probe != AllocatedIntervals.end() && Probe.start() < EndOfRegion) {
+  while (Probe != State.Allocations.end() && Probe.start() < EndOfRegion) {
     AllocationT ProbeAllocation = {Probe.start(), Probe.stop()};
     if (areAllocationsOverlapping(ProbeAllocation, NewAllocation)) {
       outs() << "Malloc error: overlapping allocation detected"
@@ -575,41 +593,42 @@ bool opts::irmemorymap::evalMalloc(IRMem
   // to inhibit interval coalescing.
   static unsigned AllocationID = 0;
   if (Size)
-    AllocatedIntervals.insert(Addr, EndOfRegion, AllocationID++);
+    State.Allocations.insert(Addr, EndOfRegion, AllocationID++);
+
+  // Store the label -> address mapping.
+  State.Label2AddrMap[Label] = Addr;
 
   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)
+bool opts::irmemorymap::evalFree(StringRef Line, IRMemoryMapTestState &State) {
+  // ::= free <label>
+  if (!Line.consume_front("free"))
     return false;
+  StringRef Label = Line.trim();
 
-  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";
+  outs() << formatv("Command: free({0})\n", Label);
+  auto LabelIt = State.Label2AddrMap.find(Label);
+  if (LabelIt == State.Label2AddrMap.end()) {
+    outs() << "Free error: Invalid allocation label\n";
     exit(1);
   }
 
   Status ST;
-  IRMemMap.Free(Probe.start(), ST);
+  addr_t Addr = LabelIt->getValue();
+  State.Map.Free(Addr, 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();
+  auto Interval = State.Allocations.find(Addr);
+  if (Interval != State.Allocations.end()) {
+    outs() << formatv("Free: [{0:x}, {1:x})\n", Interval.start(),
+                      Interval.stop());
+    Interval.erase();
+  }
 
   return true;
 }
@@ -638,9 +657,7 @@ int opts::irmemorymap::evaluateMemoryMap
   }
 
   // Set up an IRMemoryMap and associated testing state.
-  IRMemoryMap IRMemMap(Target);
-  AddrIntervalMap::Allocator AIMapAllocator;
-  AddrIntervalMap AllocatedIntervals(AIMapAllocator);
+  IRMemoryMapTestState State(Target);
 
   // Parse and apply commands from the command file.
   std::unique_ptr<MemoryBuffer> MB = opts::openFile(irmemorymap::CommandFile);
@@ -653,10 +670,10 @@ int opts::irmemorymap::evaluateMemoryMap
     if (Line.empty() || Line[0] == '#')
       continue;
 
-    if (evalMalloc(IRMemMap, Line, AllocatedIntervals))
+    if (evalMalloc(Line, State))
       continue;
 
-    if (evalFree(IRMemMap, Line, AllocatedIntervals))
+    if (evalFree(Line, State))
       continue;
 
     errs() << "Could not parse line: " << Line << "\n";




More information about the lldb-commits mailing list