[Lldb-commits] [PATCH] D70847: [lldb] Set executable module when adding modules to the Target

Anton Kolesov via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Mon Jan 27 05:11:27 PST 2020


anton.kolesov updated this revision to Diff 240533.
anton.kolesov added a comment.

Added a testcase. Because target's architecture is not directly exposed through an API, test looks at the target triplet - it is empty for targets created without an exe file. Without the patch, triplet remains unchanged after adding an executable, but with the patch, it changes to the architecture of the executable file, whichever it is.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D70847/new/

https://reviews.llvm.org/D70847

Files:
  lldb/packages/Python/lldbsuite/test/commands/target/set-exec/Makefile
  lldb/packages/Python/lldbsuite/test/commands/target/set-exec/TestSetExecutable.py
  lldb/packages/Python/lldbsuite/test/commands/target/set-exec/main.c
  lldb/source/Target/Target.cpp


Index: lldb/source/Target/Target.cpp
===================================================================
--- lldb/source/Target/Target.cpp
+++ lldb/source/Target/Target.cpp
@@ -2016,12 +2016,15 @@
     // there wasn't an equivalent module in the list already, and if there was,
     // let's remove it.
     if (module_sp) {
+      bool isExecutable = false;
       ObjectFile *objfile = module_sp->GetObjectFile();
       if (objfile) {
         switch (objfile->GetType()) {
+        case ObjectFile::eTypeExecutable: /// A normal executable
+          isExecutable = true;
+          LLVM_FALLTHROUGH;
         case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of
                                         /// a program's execution state
-        case ObjectFile::eTypeExecutable:    /// A normal executable
         case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker
                                              /// executable
         case ObjectFile::eTypeObjectFile:    /// An intermediate object file
@@ -2084,6 +2087,16 @@
         } else {
           m_images.Append(module_sp, notify);
         }
+
+        // Ensure that architecture of the Target matches that of the
+        // executable file. Otherwise Target might use a "default" platform
+        // that can't actually debug the executable. For example, if the Target
+        // is created and by default assumes that it should use "gdb-remote"
+        // process, however executable has an architecture that requires a
+        // different Process class - without explicitly set executable module
+        // Target would attempt to use "gdb-remote" created initially.
+        if (isExecutable)
+          SetExecutableModule(module_sp, eLoadDependentsNo);
       } else
         module_sp.reset();
     }
Index: lldb/packages/Python/lldbsuite/test/commands/target/set-exec/main.c
===================================================================
--- /dev/null
+++ lldb/packages/Python/lldbsuite/test/commands/target/set-exec/main.c
@@ -0,0 +1,3 @@
+int main() {
+  return 0;
+}
Index: lldb/packages/Python/lldbsuite/test/commands/target/set-exec/TestSetExecutable.py
===================================================================
--- /dev/null
+++ lldb/packages/Python/lldbsuite/test/commands/target/set-exec/TestSetExecutable.py
@@ -0,0 +1,26 @@
+"""
+Test that the first module of the target is set as an executable.
+"""
+
+from __future__ import print_function
+
+from lldbsuite.test.lldbtest import *
+
+
+class SetExecutableTestCase(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    def test(self):
+        """Test adding images to the target."""
+        self.build()
+
+        # Create an empty target - it will have an empty triplet.
+        target = self.dbg.CreateTarget(None)
+        self.assertTrue(target, VALID_TARGET)
+        self.assertEqual(len(target.GetTriple()), 0)
+
+        # Add a first module, which is treated as an executuble, so it's
+        # architecture will change the architecture of the target.
+        target.AddModule(self.getBuildArtifact("a.out"), None, None)
+        self.assertNotEqual(len(target.GetTriple()), 0)
Index: lldb/packages/Python/lldbsuite/test/commands/target/set-exec/Makefile
===================================================================
--- /dev/null
+++ lldb/packages/Python/lldbsuite/test/commands/target/set-exec/Makefile
@@ -0,0 +1,3 @@
+C_SOURCES := main.c
+
+include Makefile.rules


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D70847.240533.patch
Type: text/x-patch
Size: 3499 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20200127/9ba05d6a/attachment.bin>


More information about the lldb-commits mailing list