[Lldb-commits] [lldb] [lldb] Fix TestModuleLoadedNotifys API test to work correctly on most of Linux targets (PR #94672)

Dmitry Vasilyev via lldb-commits lldb-commits at lists.llvm.org
Sat Jun 8 02:19:17 PDT 2024


https://github.com/slydiman updated https://github.com/llvm/llvm-project/pull/94672

>From 3f91ecacdcf1eedc95b72e8a85591e60a863431e Mon Sep 17 00:00:00 2001
From: Dmitry Vasilyev <dvassiliev at accesssoftek.com>
Date: Thu, 6 Jun 2024 23:38:03 +0400
Subject: [PATCH 1/3] [lldb] Fix TestModuleLoadedNotifys API test to work
 correctly on most of Linux targets.

The different build configuration and target Linux system can load a different number of .so libraries (2 and more).
As example, Linux x86_64 host shows the following loaded modules:
```
Loaded files: ld-linux-x86-64.so.2
Loaded files: [vdso]
Loaded files: a.out
Loaded files: libstdc++.so.6, libm.so.6, libgcc_s.so.1, libc.so.6
```
avg_solibs_added_per_event = 1.75

But Linux Aarch64 (remote target) with statically linked C++ library (clang) shows:
```
Loaded files: ld-2.31.so
Loaded files: [vdso]
Loaded files: a.out
Loaded files: libm.so.6, libc.so.6
```
avg_solibs_added_per_event = 1.25

Increase precision by 1 digit to fix the test.
---
 .../target-new-solib-notifications/TestModuleLoadedNotifys.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lldb/test/API/functionalities/target-new-solib-notifications/TestModuleLoadedNotifys.py b/lldb/test/API/functionalities/target-new-solib-notifications/TestModuleLoadedNotifys.py
index abf761fb3420b..28a1026ae4fcc 100644
--- a/lldb/test/API/functionalities/target-new-solib-notifications/TestModuleLoadedNotifys.py
+++ b/lldb/test/API/functionalities/target-new-solib-notifications/TestModuleLoadedNotifys.py
@@ -118,6 +118,6 @@ def test_launch_notifications(self):
         # On Linux we get events for ld.so, [vdso], the binary and then all libraries.
 
         avg_solibs_added_per_event = round(
-            float(total_solibs_added) / float(total_modules_added_events)
+            10.0 * float(total_solibs_added) / float(total_modules_added_events)
         )
-        self.assertGreater(avg_solibs_added_per_event, 1)
+        self.assertGreater(avg_solibs_added_per_event, 10)

>From 0518bff0710a8f4404847e1cd28c6bcdbbb00093 Mon Sep 17 00:00:00 2001
From: Dmitry Vasilyev <dvassiliev at accesssoftek.com>
Date: Fri, 7 Jun 2024 12:36:44 +0400
Subject: [PATCH 2/3] Keep the `avg_solibs_added_per_event` name correct.

---
 .../TestModuleLoadedNotifys.py                              | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/lldb/test/API/functionalities/target-new-solib-notifications/TestModuleLoadedNotifys.py b/lldb/test/API/functionalities/target-new-solib-notifications/TestModuleLoadedNotifys.py
index 28a1026ae4fcc..ef407abce59fc 100644
--- a/lldb/test/API/functionalities/target-new-solib-notifications/TestModuleLoadedNotifys.py
+++ b/lldb/test/API/functionalities/target-new-solib-notifications/TestModuleLoadedNotifys.py
@@ -117,7 +117,7 @@ def test_launch_notifications(self):
         # program: a.out and dyld, and then all the rest of the system libraries.
         # On Linux we get events for ld.so, [vdso], the binary and then all libraries.
 
-        avg_solibs_added_per_event = round(
-            10.0 * float(total_solibs_added) / float(total_modules_added_events)
+        avg_solibs_added_per_event = float(total_solibs_added) / float(
+            total_modules_added_events
         )
-        self.assertGreater(avg_solibs_added_per_event, 10)
+        self.assertGreater(round(10.0 * avg_solibs_added_per_event), 10)

>From 60671ecc918692bba6d937bc7590eae55fd20514 Mon Sep 17 00:00:00 2001
From: Dmitry Vasilyev <dvassiliev at accesssoftek.com>
Date: Sat, 8 Jun 2024 12:53:06 +0400
Subject: [PATCH 3/3] Added own so modules.

---
 .../target-new-solib-notifications/Makefile   | 26 +++++++--
 .../TestModuleLoadedNotifys.py                | 53 ++++++++++++++++---
 .../target-new-solib-notifications/a.cpp      |  7 +++
 .../target-new-solib-notifications/b.cpp      |  5 ++
 .../target-new-solib-notifications/c.cpp      |  1 +
 .../target-new-solib-notifications/d.cpp      |  5 ++
 .../target-new-solib-notifications/main.cpp   | 22 +++++---
 7 files changed, 102 insertions(+), 17 deletions(-)
 create mode 100644 lldb/test/API/functionalities/target-new-solib-notifications/a.cpp
 create mode 100644 lldb/test/API/functionalities/target-new-solib-notifications/b.cpp
 create mode 100644 lldb/test/API/functionalities/target-new-solib-notifications/c.cpp
 create mode 100644 lldb/test/API/functionalities/target-new-solib-notifications/d.cpp

diff --git a/lldb/test/API/functionalities/target-new-solib-notifications/Makefile b/lldb/test/API/functionalities/target-new-solib-notifications/Makefile
index 99998b20bcb05..50169c0ae1b80 100644
--- a/lldb/test/API/functionalities/target-new-solib-notifications/Makefile
+++ b/lldb/test/API/functionalities/target-new-solib-notifications/Makefile
@@ -1,3 +1,23 @@
-CXX_SOURCES := main.cpp
-
-include Makefile.rules
+CXX_SOURCES := main.cpp
+LD_EXTRAS := -L. -lloadunload_d -lloadunload_c -lloadunload_a -lloadunload_b
+
+a.out: lib_b lib_a lib_c lib_d
+
+include Makefile.rules
+
+lib_a: lib_b
+	$(MAKE) -f $(MAKEFILE_RULES) \
+		DYLIB_ONLY=YES DYLIB_CXX_SOURCES=a.cpp DYLIB_NAME=loadunload_a \
+		LD_EXTRAS="-L. -lloadunload_b"
+
+lib_b:
+	$(MAKE) -f $(MAKEFILE_RULES) \
+		DYLIB_ONLY=YES DYLIB_CXX_SOURCES=b.cpp DYLIB_NAME=loadunload_b
+
+lib_c:
+	$(MAKE) -f $(MAKEFILE_RULES) \
+		DYLIB_ONLY=YES DYLIB_CXX_SOURCES=c.cpp DYLIB_NAME=loadunload_c
+
+lib_d:
+	$(MAKE) -f $(MAKEFILE_RULES) \
+		DYLIB_ONLY=YES DYLIB_CXX_SOURCES=d.cpp DYLIB_NAME=loadunload_d
diff --git a/lldb/test/API/functionalities/target-new-solib-notifications/TestModuleLoadedNotifys.py b/lldb/test/API/functionalities/target-new-solib-notifications/TestModuleLoadedNotifys.py
index ef407abce59fc..395c9e31f8dba 100644
--- a/lldb/test/API/functionalities/target-new-solib-notifications/TestModuleLoadedNotifys.py
+++ b/lldb/test/API/functionalities/target-new-solib-notifications/TestModuleLoadedNotifys.py
@@ -9,22 +9,51 @@
 from lldbsuite.test import lldbutil
 
 
+ at skipUnlessPlatform(["linux"] + lldbplatformutil.getDarwinOSTriples())
 class ModuleLoadedNotifysTestCase(TestBase):
     NO_DEBUG_INFO_TESTCASE = True
 
     # At least DynamicLoaderDarwin and DynamicLoaderPOSIXDYLD should batch up
     # notifications about newly added/removed libraries.  Other DynamicLoaders may
     # not be written this way.
-    @skipUnlessPlatform(["linux"] + lldbplatformutil.getDarwinOSTriples())
     def setUp(self):
         # Call super's setUp().
         TestBase.setUp(self)
         # Find the line number to break inside main().
         self.line = line_number("main.cpp", "// breakpoint")
 
+    def setup_test(self, solibs):
+        if lldb.remote_platform:
+            path = lldb.remote_platform.GetWorkingDirectory()
+            for f in solibs:
+                lldbutil.install_to_target(self, self.getBuildArtifact(f))
+        else:
+            path = self.getBuildDir()
+            if self.dylibPath in os.environ:
+                sep = self.platformContext.shlib_path_separator
+                path = os.environ[self.dylibPath] + sep + path
+        self.runCmd(
+            "settings append target.env-vars '{}={}'".format(self.dylibPath, path)
+        )
+        self.default_path = path
+
     def test_launch_notifications(self):
         """Test that lldb broadcasts newly loaded libraries in batches."""
+
+        ext = "so"
+        if self.platformIsDarwin():
+            ext = "dylib"
+
+        expected_solibs = [
+            "libloadunload_a." + ext,
+            "libloadunload_b." + ext,
+            "libloadunload_c." + ext,
+            "libloadunload_d." + ext,
+        ]
+
         self.build()
+        self.setup_test(expected_solibs)
+
         exe = self.getBuildArtifact("a.out")
         self.dbg.SetAsync(False)
 
@@ -70,6 +99,8 @@ def test_launch_notifications(self):
         total_modules_added_events = 0
         total_modules_removed_events = 0
         already_loaded_modules = []
+        max_solibs_per_event = 0
+        max_solib_chunk_per_event = []
         while listener.GetNextEvent(event):
             if lldb.SBTarget.EventIsTargetEvent(event):
                 if event.GetType() == lldb.SBTarget.eBroadcastBitModulesLoaded:
@@ -91,12 +122,17 @@ def test_launch_notifications(self):
                                 "{} is already loaded".format(module),
                             )
                         already_loaded_modules.append(module)
-                        if self.TraceOn():
-                            added_files.append(module.GetFileSpec().GetFilename())
+                        added_files.append(module.GetFileSpec().GetFilename())
                     if self.TraceOn():
                         # print all of the binaries that have been added
                         print("Loaded files: %s" % (", ".join(added_files)))
 
+                    # We will check the latest biggest chunk of loaded solibs.
+                    # We expect all of our solibs in the last chunk of loaded modules.
+                    if solib_count >= max_solibs_per_event:
+                        max_solib_chunk_per_event = added_files.copy()
+                        max_solibs_per_event = solib_count
+
                 if event.GetType() == lldb.SBTarget.eBroadcastBitModulesUnloaded:
                     solib_count = lldb.SBTarget.GetNumModulesFromEvent(event)
                     total_modules_removed_events += 1
@@ -115,9 +151,10 @@ def test_launch_notifications(self):
         # binaries in batches.  Check that we got back more than 1 solib per event.
         # In practice on Darwin today, we get back two events for a do-nothing c
         # program: a.out and dyld, and then all the rest of the system libraries.
-        # On Linux we get events for ld.so, [vdso], the binary and then all libraries.
-
-        avg_solibs_added_per_event = float(total_solibs_added) / float(
-            total_modules_added_events
+        # On Linux we get events for ld.so, [vdso], the binary and then all libraries,
+        # but the different configurations could load a different number of .so modules
+        # per event.
+        self.assertGreaterEqual(
+            len(set(max_solib_chunk_per_event).intersection(expected_solibs)),
+            len(expected_solibs),
         )
-        self.assertGreater(round(10.0 * avg_solibs_added_per_event), 10)
diff --git a/lldb/test/API/functionalities/target-new-solib-notifications/a.cpp b/lldb/test/API/functionalities/target-new-solib-notifications/a.cpp
new file mode 100644
index 0000000000000..88c59bd7bebe7
--- /dev/null
+++ b/lldb/test/API/functionalities/target-new-solib-notifications/a.cpp
@@ -0,0 +1,7 @@
+extern "C" int b_function();
+
+int a_init() { return 234; }
+
+int a_global = a_init();
+
+extern "C" int a_function() { return b_function(); }
diff --git a/lldb/test/API/functionalities/target-new-solib-notifications/b.cpp b/lldb/test/API/functionalities/target-new-solib-notifications/b.cpp
new file mode 100644
index 0000000000000..908282f06a19b
--- /dev/null
+++ b/lldb/test/API/functionalities/target-new-solib-notifications/b.cpp
@@ -0,0 +1,5 @@
+int b_init() { return 345; }
+
+int b_global = b_init();
+
+extern "C" int b_function() { return 500; }
diff --git a/lldb/test/API/functionalities/target-new-solib-notifications/c.cpp b/lldb/test/API/functionalities/target-new-solib-notifications/c.cpp
new file mode 100644
index 0000000000000..8abd1b155a759
--- /dev/null
+++ b/lldb/test/API/functionalities/target-new-solib-notifications/c.cpp
@@ -0,0 +1 @@
+extern "C" int c_function() { return 600; }
diff --git a/lldb/test/API/functionalities/target-new-solib-notifications/d.cpp b/lldb/test/API/functionalities/target-new-solib-notifications/d.cpp
new file mode 100644
index 0000000000000..8866615ce180f
--- /dev/null
+++ b/lldb/test/API/functionalities/target-new-solib-notifications/d.cpp
@@ -0,0 +1,5 @@
+int d_init() { return 123; }
+
+int d_global = d_init();
+
+extern "C" int d_function() { return 700; }
diff --git a/lldb/test/API/functionalities/target-new-solib-notifications/main.cpp b/lldb/test/API/functionalities/target-new-solib-notifications/main.cpp
index 00130c93b8863..77b38c5ccdc69 100644
--- a/lldb/test/API/functionalities/target-new-solib-notifications/main.cpp
+++ b/lldb/test/API/functionalities/target-new-solib-notifications/main.cpp
@@ -1,6 +1,16 @@
-#include <stdio.h>
-int main ()
-{
-  puts("running"); // breakpoint here
-  return 0;
-}
+#include <stdio.h>
+
+extern "C" int a_function();
+extern "C" int c_function();
+extern "C" int b_function();
+extern "C" int d_function();
+
+int main() {
+  a_function();
+  b_function();
+  c_function();
+  d_function();
+
+  puts("running"); // breakpoint here
+  return 0;
+}



More information about the lldb-commits mailing list