summaryrefslogtreecommitdiffstats
path: root/lldb/packages/Python/lldbsuite/test/tools/lldb-server
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/tools/lldb-server')
-rw-r--r--lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py29
-rw-r--r--lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/Makefile17
-rw-r--r--lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/TestGdbRemoteLibrariesSvr4Support.py127
-rw-r--r--lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/main.cpp15
-rw-r--r--lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_a.cpp9
-rw-r--r--lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_a.mk9
-rw-r--r--lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_b_quote.cpp9
-rw-r--r--lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_b_quote.mk9
8 files changed, 223 insertions, 1 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
index e7c63bf21e8..8311e162399 100644
--- a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
@@ -513,7 +513,8 @@ class GdbRemoteTestCaseBase(TestBase):
self,
inferior_args=None,
inferior_sleep_seconds=3,
- inferior_exe_path=None):
+ inferior_exe_path=None,
+ inferior_env=None):
"""Prep the debug monitor, the inferior, and the expected packet stream.
Handle the separate cases of using the debug monitor in attach-to-inferior mode
@@ -576,6 +577,9 @@ class GdbRemoteTestCaseBase(TestBase):
# Build the expected protocol stream
self.add_no_ack_remote_stream()
+ if inferior_env:
+ for name, value in inferior_env.items():
+ self.add_set_environment_packets(name, value)
if self._inferior_startup == self._STARTUP_LAUNCH:
self.add_verified_launch_packets(launch_args)
@@ -656,6 +660,12 @@ class GdbRemoteTestCaseBase(TestBase):
{"direction": "send", "regex": r"^\$(.+)#[0-9a-fA-F]{2}$", "capture": {1: "process_info_raw"}}],
True)
+ def add_set_environment_packets(self, name, value):
+ self.test_sequence.add_log_lines(
+ ["read packet: $QEnvironment:" + name + "=" + value + "#00",
+ "send packet: $OK#00",
+ ], True)
+
_KNOWN_PROCESS_INFO_KEYS = [
"pid",
"parent-pid",
@@ -816,6 +826,7 @@ class GdbRemoteTestCaseBase(TestBase):
"error"])
self.assertIsNotNone(val)
+ mem_region_dict["name"] = seven.unhexlify(mem_region_dict.get("name", ""))
# Return the dictionary of key-value pairs for the memory region.
return mem_region_dict
@@ -1000,6 +1011,22 @@ class GdbRemoteTestCaseBase(TestBase):
return context
+ def continue_process_and_wait_for_stop(self):
+ self.test_sequence.add_log_lines(
+ [
+ "read packet: $vCont;c#a8",
+ {
+ "direction": "send",
+ "regex": r"^\$T([0-9a-fA-F]{2})(.*)#[0-9a-fA-F]{2}$",
+ "capture": {1: "stop_signo", 2: "stop_key_val_text"},
+ },
+ ],
+ True,
+ )
+ context = self.expect_gdbremote_sequence()
+ self.assertIsNotNone(context)
+ return self.parse_interrupt_packets(context)
+
def select_modifiable_register(self, reg_infos):
"""Find a register that can be read/written freely."""
PREFERRED_REGISTER_NAMES = set(["rax", ])
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/Makefile b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/Makefile
new file mode 100644
index 00000000000..265c8ca3c41
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/Makefile
@@ -0,0 +1,17 @@
+LEVEL = ../../../make
+
+LIB_PREFIX := svr4lib
+LD_EXTRAS := -L. -l$(LIB_PREFIX)_a -l$(LIB_PREFIX)_b\"
+CXX_SOURCES := main.cpp
+USE_LIBDL := 1
+MAKE_DSYM := NO
+
+include $(LEVEL)/Makefile.rules
+
+a.out: $(LIB_PREFIX)_a $(LIB_PREFIX)_b_quote
+
+svr4lib_%:
+ $(MAKE) VPATH=$(SRCDIR) -I $(SRCDIR) -f "$(SRCDIR)/$(LIB_PREFIX)_$*.mk"
+
+clean::
+ $(MAKE) -f $(SRCDIR)/$(LIB_PREFIX)_a.mk clean
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/TestGdbRemoteLibrariesSvr4Support.py b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/TestGdbRemoteLibrariesSvr4Support.py
new file mode 100644
index 00000000000..2ea268a0569
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/TestGdbRemoteLibrariesSvr4Support.py
@@ -0,0 +1,127 @@
+import xml.etree.ElementTree as ET
+
+import gdbremote_testcase
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+
+
+class TestGdbRemoteLibrariesSvr4Support(gdbremote_testcase.GdbRemoteTestCaseBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ FEATURE_NAME = "qXfer:libraries-svr4:read"
+
+ def setup_test(self):
+ self.init_llgs_test()
+ self.build()
+ self.set_inferior_startup_launch()
+ env = {}
+ env[self.dylibPath] = self.getBuildDir()
+ self.prep_debug_monitor_and_inferior(inferior_env=env)
+ self.continue_process_and_wait_for_stop()
+
+ def has_libraries_svr4_support(self):
+ self.add_qSupported_packets()
+ context = self.expect_gdbremote_sequence()
+ self.assertIsNotNone(context)
+ features = self.parse_qSupported_response(context)
+ return self.FEATURE_NAME in features and features[self.FEATURE_NAME] == "+"
+
+ def get_libraries_svr4_data(self):
+ # Start up llgs and inferior, and check for libraries-svr4 support.
+ if not self.has_libraries_svr4_support():
+ self.skipTest("libraries-svr4 not supported")
+
+ # Grab the libraries-svr4 data.
+ self.reset_test_sequence()
+ self.test_sequence.add_log_lines(
+ [
+ "read packet: $qXfer:libraries-svr4:read::0,ffff:#00",
+ {
+ "direction": "send",
+ "regex": re.compile(
+ r"^\$([^E])(.*)#[0-9a-fA-F]{2}$", re.MULTILINE | re.DOTALL
+ ),
+ "capture": {1: "response_type", 2: "content_raw"},
+ },
+ ],
+ True,
+ )
+
+ context = self.expect_gdbremote_sequence()
+ self.assertIsNotNone(context)
+
+ # Ensure we end up with all libraries-svr4 data in one packet.
+ self.assertEqual(context.get("response_type"), "l")
+
+ # Decode binary data.
+ content_raw = context.get("content_raw")
+ self.assertIsNotNone(content_raw)
+ return content_raw
+
+ def get_libraries_svr4_xml(self):
+ libraries_svr4 = self.get_libraries_svr4_data()
+ xml_root = None
+ try:
+ xml_root = ET.fromstring(libraries_svr4)
+ except xml.etree.ElementTree.ParseError:
+ pass
+ self.assertIsNotNone(xml_root, "Malformed libraries-svr4 XML")
+ return xml_root
+
+ def libraries_svr4_well_formed(self):
+ xml_root = self.get_libraries_svr4_xml()
+ self.assertEqual(xml_root.tag, "library-list-svr4")
+ for child in xml_root:
+ self.assertEqual(child.tag, "library")
+ self.assertItemsEqual(child.attrib.keys(), ["name", "lm", "l_addr", "l_ld"])
+
+ def libraries_svr4_has_correct_load_addr(self):
+ xml_root = self.get_libraries_svr4_xml()
+ for child in xml_root:
+ name = child.attrib.get("name")
+ if not name:
+ continue
+ load_addr = int(child.attrib.get("l_addr"), 16)
+ self.reset_test_sequence()
+ self.add_query_memory_region_packets(load_addr)
+ context = self.expect_gdbremote_sequence()
+ mem_region = self.parse_memory_region_packet(context)
+ self.assertEqual(load_addr, int(mem_region.get("start", 0), 16))
+ self.assertEqual(
+ os.path.realpath(name), os.path.realpath(mem_region.get("name", ""))
+ )
+
+ def libraries_svr4_libs_present(self):
+ xml_root = self.get_libraries_svr4_xml()
+ libraries_svr4_names = []
+ for child in xml_root:
+ name = child.attrib.get("name")
+ libraries_svr4_names.append(os.path.realpath(name))
+ expected_libs = ["libsvr4lib_a.so", 'libsvr4lib_b".so']
+ for lib in expected_libs:
+ self.assertIn(self.getBuildDir() + "/" + lib, libraries_svr4_names)
+
+ @llgs_test
+ @skipUnlessPlatform(["linux", "android", "netbsd"])
+ def test_supports_libraries_svr4(self):
+ self.setup_test()
+ self.assertTrue(self.has_libraries_svr4_support())
+
+ @llgs_test
+ @skipUnlessPlatform(["linux", "android", "netbsd"])
+ def test_libraries_svr4_well_formed(self):
+ self.setup_test()
+ self.libraries_svr4_well_formed()
+
+ @llgs_test
+ @skipUnlessPlatform(["linux", "android", "netbsd"])
+ def test_libraries_svr4_load_addr(self):
+ self.setup_test()
+ self.libraries_svr4_has_correct_load_addr()
+
+ @llgs_test
+ @skipUnlessPlatform(["linux", "android", "netbsd"])
+ def test_libraries_svr4_libs_present(self):
+ self.setup_test()
+ self.libraries_svr4_libs_present()
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/main.cpp b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/main.cpp
new file mode 100644
index 00000000000..b62ca71b561
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/main.cpp
@@ -0,0 +1,15 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+int main(int argc, char **argv) {
+ // Perform a null pointer access.
+ int *const null_int_ptr = nullptr;
+ *null_int_ptr = 0xDEAD;
+
+ return 0;
+}
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_a.cpp b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_a.cpp
new file mode 100644
index 00000000000..47d4b979d92
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_a.cpp
@@ -0,0 +1,9 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+int svr4lib_a() { return 42; }
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_a.mk b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_a.mk
new file mode 100644
index 00000000000..626babbd6b2
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_a.mk
@@ -0,0 +1,9 @@
+LEVEL = ../../../make
+
+LIB_PREFIX := svr4lib
+
+DYLIB_NAME := $(LIB_PREFIX)_a
+DYLIB_CXX_SOURCES := $(LIB_PREFIX)_a.cpp
+DYLIB_ONLY := YES
+
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_b_quote.cpp b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_b_quote.cpp
new file mode 100644
index 00000000000..bd8eb0068e9
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_b_quote.cpp
@@ -0,0 +1,9 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+int svr4lib_b_quote() { return 42; }
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_b_quote.mk b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_b_quote.mk
new file mode 100644
index 00000000000..5ed7a053b42
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/libraries-svr4/svr4lib_b_quote.mk
@@ -0,0 +1,9 @@
+LEVEL = ../../../make
+
+LIB_PREFIX := svr4lib
+
+DYLIB_NAME := $(LIB_PREFIX)_b\"
+DYLIB_CXX_SOURCES := $(LIB_PREFIX)_b_quote.cpp
+DYLIB_ONLY := YES
+
+include $(LEVEL)/Makefile.rules
OpenPOWER on IntegriCloud