[Lldb-commits] [lldb] f1242ec - [intel-pt] Implement a basic test case

Walter Erquinigo via lldb-commits lldb-commits at lists.llvm.org
Wed Apr 1 13:19:35 PDT 2020


Author: Walter Erquinigo
Date: 2020-04-01T13:19:15-07:00
New Revision: f1242ec54306c5fbdc9a907e936be899a0ad21ee

URL: https://github.com/llvm/llvm-project/commit/f1242ec54306c5fbdc9a907e936be899a0ad21ee
DIFF: https://github.com/llvm/llvm-project/commit/f1242ec54306c5fbdc9a907e936be899a0ad21ee.diff

LOG: [intel-pt] Implement a basic test case

Summary:
Depends on D76872.

There was no test for the Intel PT support on LLDB, so I'm creating one, which
will help making progress on solid grounds.

The test is skipped if the Intel PT plugin library is not built.

Reviewers: clayborg, labath, kusmour, aadsm

Subscribers: lldb-commits

Tags: #lldb

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

Added: 
    lldb/test/API/tools/intel-features/intel-pt/test/Makefile
    lldb/test/API/tools/intel-features/intel-pt/test/TestIntelPTSimpleBinary.py
    lldb/test/API/tools/intel-features/intel-pt/test/main.cpp

Modified: 
    lldb/tools/intel-features/intel-pt/cli-wrapper-pt.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/test/API/tools/intel-features/intel-pt/test/Makefile b/lldb/test/API/tools/intel-features/intel-pt/test/Makefile
new file mode 100644
index 000000000000..99998b20bcb0
--- /dev/null
+++ b/lldb/test/API/tools/intel-features/intel-pt/test/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules

diff  --git a/lldb/test/API/tools/intel-features/intel-pt/test/TestIntelPTSimpleBinary.py b/lldb/test/API/tools/intel-features/intel-pt/test/TestIntelPTSimpleBinary.py
new file mode 100644
index 000000000000..29bcf3de696a
--- /dev/null
+++ b/lldb/test/API/tools/intel-features/intel-pt/test/TestIntelPTSimpleBinary.py
@@ -0,0 +1,59 @@
+from __future__ import print_function
+
+import os
+import lldb
+import time
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestIntelPTSimpleBinary(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+    NO_DEBUG_INFO_TESTCASE = True
+
+    @skipIf(oslist=no_match(['linux']))
+    @skipIf(archs=no_match(['i386', 'x86_64']))
+    @skipIfRemote
+    def test_basic_flow(self):
+        """Test collection, decoding, and dumping instructions"""
+        lldb_exec_dir = os.environ["LLDB_IMPLIB_DIR"]
+        lldb_lib_dir = os.path.join(lldb_exec_dir, os.pardir, "lib")
+        plugin_file = os.path.join(lldb_lib_dir, "liblldbIntelFeatures.so")
+        if not os.path.isfile(plugin_file):
+            self.skipTest("features plugin missing.")
+
+        self.build()
+
+        self.runCmd("plugin load " + plugin_file)
+
+        exe = self.getBuildArtifact("a.out")
+        lldbutil.run_to_name_breakpoint(self, "main", exe_name=exe)
+        # We start tracing from main
+        self.runCmd("processor-trace start all")
+
+        # We check the trace after the for loop
+        self.runCmd("b " + str(line_number('main.cpp', '// Break 1')))
+        self.runCmd("c")
+
+        # We wait a little bit to ensure the processor has send the PT packets to
+        # the memory
+        time.sleep(.1)
+
+        # We find the start address of the 'fun' function for a later check
+        target = self.dbg.GetSelectedTarget()
+        fun_start_adddress = target.FindFunctions("fun")[0].GetSymbol() \
+            .GetStartAddress().GetLoadAddress(target)
+
+        # We print the last instructions
+        self.expect("processor-trace show-instr-log -c 100",
+            patterns=[
+                # We expect to have seen the first instruction of 'fun'
+                hex(fun_start_adddress),  
+                # We expect to see the exit condition of the for loop
+                "at main.cpp:" + str(line_number('main.cpp', '// Break for loop')) 
+            ])
+
+        self.runCmd("processor-trace stop")

diff  --git a/lldb/test/API/tools/intel-features/intel-pt/test/main.cpp b/lldb/test/API/tools/intel-features/intel-pt/test/main.cpp
new file mode 100644
index 000000000000..ea826a2ac0c6
--- /dev/null
+++ b/lldb/test/API/tools/intel-features/intel-pt/test/main.cpp
@@ -0,0 +1,14 @@
+#include <iostream>
+
+using namespace std;
+
+int fun(int a) { return a * a + 1; }
+
+int main() {
+  int z = 0;
+  for (int i = 0; i < 10000; i++) { // Break for loop
+    z += fun(z);
+  }
+
+  return 0; // Break 1
+}

diff  --git a/lldb/tools/intel-features/intel-pt/cli-wrapper-pt.cpp b/lldb/tools/intel-features/intel-pt/cli-wrapper-pt.cpp
index 8db1c0f82d66..5e409a269fa4 100644
--- a/lldb/tools/intel-features/intel-pt/cli-wrapper-pt.cpp
+++ b/lldb/tools/intel-features/intel-pt/cli-wrapper-pt.cpp
@@ -191,6 +191,7 @@ class ProcessorTraceStart : public lldb::SBCommandPluginInterface {
       result.SetStatus(lldb::eReturnStatusFailed);
       return false;
     }
+    result.SetStatus(lldb::eReturnStatusSuccessFinishResult);
     return true;
   }
 
@@ -290,6 +291,7 @@ class ProcessorTraceInfo : public lldb::SBCommandPluginInterface {
                  s.GetData());
       result.AppendMessage(res.GetOutput());
     }
+    result.SetStatus(lldb::eReturnStatusSuccessFinishResult);
     return true;
   }
 
@@ -428,6 +430,7 @@ class ProcessorTraceShowInstrLog : public lldb::SBCommandPluginInterface {
       }
       result.AppendMessage(res.GetOutput());
     }
+    result.SetStatus(lldb::eReturnStatusSuccessFinishResult);
     return true;
   }
 
@@ -480,6 +483,7 @@ class ProcessorTraceStop : public lldb::SBCommandPluginInterface {
       result.SetStatus(lldb::eReturnStatusFailed);
       return false;
     }
+    result.SetStatus(lldb::eReturnStatusSuccessFinishResult);
     return true;
   }
 


        


More information about the lldb-commits mailing list