[Lldb-commits] [lldb] r360077 - [Driver] Change the way we deal with local lldbinit files.

Jonas Devlieghere via lldb-commits lldb-commits at lists.llvm.org
Mon May 6 13:45:31 PDT 2019


Author: jdevlieghere
Date: Mon May  6 13:45:31 2019
New Revision: 360077

URL: http://llvm.org/viewvc/llvm-project?rev=360077&view=rev
Log:
[Driver] Change the way we deal with local lldbinit files.

Currently we have special handling for local lldbinit files in the
driver. At the same time, we have an SB API named
`SourceInitFileInCurrentWorkingDirectory` that does the same thing.

This patch removes the special handling from the driver and uses the API
instead. In addition to the obvious advantages of having one canonical
way of doing things and removing code duplication, this change also
means that the code path is the same for global and local lldb init
files.

Differential revision: https://reviews.llvm.org/D61577

Added:
    lldb/trunk/lit/Driver/Inputs/.lldbinit
    lldb/trunk/lit/Driver/LocalLLDBInit.test
Modified:
    lldb/trunk/lit/helper/toolchain.py
    lldb/trunk/source/Interpreter/CommandInterpreter.cpp
    lldb/trunk/tools/driver/Driver.cpp
    lldb/trunk/tools/driver/Driver.h

Added: lldb/trunk/lit/Driver/Inputs/.lldbinit
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Driver/Inputs/.lldbinit?rev=360077&view=auto
==============================================================================
--- lldb/trunk/lit/Driver/Inputs/.lldbinit (added)
+++ lldb/trunk/lit/Driver/Inputs/.lldbinit Mon May  6 13:45:31 2019
@@ -0,0 +1 @@
+settings set -f frame-format "bogus"

Added: lldb/trunk/lit/Driver/LocalLLDBInit.test
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Driver/LocalLLDBInit.test?rev=360077&view=auto
==============================================================================
--- lldb/trunk/lit/Driver/LocalLLDBInit.test (added)
+++ lldb/trunk/lit/Driver/LocalLLDBInit.test Mon May  6 13:45:31 2019
@@ -0,0 +1,9 @@
+# RUN: mkdir -p %t.root
+# RUN: cp %S/Inputs/.lldbinit %t.root
+# RUN: cd %t.root
+# RUN: %lldb-init -o 'settings show frame-format' 2>&1 | FileCheck %s --check-prefix=INIT --check-prefix=CHECK
+# RUN: %lldb -o 'settings show frame-format' 2>&1 | FileCheck %s --check-prefix=NOINIT --check-prefix=CHECK
+
+# INIT: There is a .lldbinit file in the current directory which is not being read.
+# NOINIT-NOT: There is a .lldbinit file in the current directory which is not being read.
+# CHECK-NOT: bogus

Modified: lldb/trunk/lit/helper/toolchain.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/helper/toolchain.py?rev=360077&r1=360076&r2=360077&view=diff
==============================================================================
--- lldb/trunk/lit/helper/toolchain.py (original)
+++ lldb/trunk/lit/helper/toolchain.py Mon May  6 13:45:31 2019
@@ -40,6 +40,11 @@ def use_lldb_substitutions(config):
                   extra_args=['--no-lldbinit', '-S',
                               os.path.join(config.test_source_root,
                                            'lit-lldb-init')]),
+        ToolSubst('%lldb-init',
+                  command=FindTool('lldb'),
+                  extra_args=['-S',
+                              os.path.join(config.test_source_root,
+                                           'lit-lldb-init')]),
         lldbmi,
         ToolSubst('%debugserver',
                   command=FindTool(dsname),

Modified: lldb/trunk/source/Interpreter/CommandInterpreter.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandInterpreter.cpp?rev=360077&r1=360076&r2=360077&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/CommandInterpreter.cpp (original)
+++ lldb/trunk/source/Interpreter/CommandInterpreter.cpp Mon May  6 13:45:31 2019
@@ -2095,16 +2095,14 @@ void CommandInterpreter::SourceInitFile(
                                         CommandReturnObject &result) {
   FileSpec init_file;
   if (in_cwd) {
-    ExecutionContext exe_ctx(GetExecutionContext());
-    Target *target = exe_ctx.GetTargetPtr();
-    if (target) {
+    lldb::TargetPropertiesSP properties = Target::GetGlobalProperties();
+    if (properties) {
       // In the current working directory we don't load any program specific
       // .lldbinit files, we only look for a ".lldbinit" file.
       if (m_skip_lldbinit_files)
         return;
 
-      LoadCWDlldbinitFile should_load =
-          target->TargetProperties::GetLoadCWDlldbinitFile();
+      LoadCWDlldbinitFile should_load = properties->GetLoadCWDlldbinitFile();
       if (should_load == eLoadCWDlldbinitWarn) {
         FileSpec dot_lldb(".lldbinit");
         FileSystem::Instance().Resolve(dot_lldb);

Modified: lldb/trunk/tools/driver/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/Driver.cpp?rev=360077&r1=360076&r2=360077&view=diff
==============================================================================
--- lldb/trunk/tools/driver/Driver.cpp (original)
+++ lldb/trunk/tools/driver/Driver.cpp Mon May  6 13:45:31 2019
@@ -113,24 +113,6 @@ Driver::Driver()
 
 Driver::~Driver() { g_driver = nullptr; }
 
-void Driver::OptionData::AddLocalLLDBInit() {
-  // If there is a local .lldbinit, add that to the list of things to be
-  // sourced, if the settings permit it.
-  SBFileSpec local_lldbinit(".lldbinit", true);
-  SBFileSpec homedir_dot_lldb = SBHostOS::GetUserHomeDirectory();
-  homedir_dot_lldb.AppendPathComponent(".lldbinit");
-
-  // Only read .lldbinit in the current working directory if it's not the same
-  // as the .lldbinit in the home directory (which is already being read in).
-  if (local_lldbinit.Exists() && strcmp(local_lldbinit.GetDirectory(),
-                                        homedir_dot_lldb.GetDirectory()) != 0) {
-    char path[PATH_MAX];
-    local_lldbinit.GetPath(path, sizeof(path));
-    InitialCmdEntry entry(path, true, true, true);
-    m_after_file_commands.push_back(entry);
-  }
-}
-
 void Driver::OptionData::AddInitialCommand(std::string command,
                                            CommandPlacement placement,
                                            bool is_file, SBError &error) {
@@ -150,17 +132,17 @@ void Driver::OptionData::AddInitialComma
   if (is_file) {
     SBFileSpec file(command.c_str());
     if (file.Exists())
-      command_set->push_back(InitialCmdEntry(command, is_file, false));
+      command_set->push_back(InitialCmdEntry(command, is_file));
     else if (file.ResolveExecutableLocation()) {
       char final_path[PATH_MAX];
       file.GetPath(final_path, sizeof(final_path));
-      command_set->push_back(InitialCmdEntry(final_path, is_file, false));
+      command_set->push_back(InitialCmdEntry(final_path, is_file));
     } else
       error.SetErrorStringWithFormat(
           "file specified in --source (-s) option doesn't exist: '%s'",
           command.c_str());
   } else
-    command_set->push_back(InitialCmdEntry(command, is_file, false));
+    command_set->push_back(InitialCmdEntry(command, is_file));
 }
 
 void Driver::WriteCommandsForSourcing(CommandPlacement placement,
@@ -181,36 +163,6 @@ void Driver::WriteCommandsForSourcing(Co
   for (const auto &command_entry : *command_set) {
     const char *command = command_entry.contents.c_str();
     if (command_entry.is_file) {
-      // If this command_entry is a file to be sourced, and it's the ./.lldbinit
-      // file (the .lldbinit
-      // file in the current working directory), only read it if
-      // target.load-cwd-lldbinit is 'true'.
-      if (command_entry.is_cwd_lldbinit_file_read) {
-        SBStringList strlist = lldb::SBDebugger::GetInternalVariableValue(
-            "target.load-cwd-lldbinit", m_debugger.GetInstanceName());
-        if (strlist.GetSize() == 1 &&
-            strcmp(strlist.GetStringAtIndex(0), "warn") == 0) {
-          FILE *output = m_debugger.GetOutputFileHandle();
-          ::fprintf(
-              output,
-              "There is a .lldbinit file in the current directory which is not "
-              "being read.\n"
-              "To silence this warning without sourcing in the local "
-              ".lldbinit,\n"
-              "add the following to the lldbinit file in your home directory:\n"
-              "    settings set target.load-cwd-lldbinit false\n"
-              "To allow lldb to source .lldbinit files in the current working "
-              "directory,\n"
-              "set the value of this variable to true.  Only do so if you "
-              "understand and\n"
-              "accept the security risk.\n");
-          return;
-        }
-        if (strlist.GetSize() == 1 &&
-            strcmp(strlist.GetStringAtIndex(0), "false") == 0) {
-          return;
-        }
-      }
       bool source_quietly =
           m_option_data.m_source_quietly || command_entry.source_quietly;
       strm.Printf("command source -s %i '%s'\n",
@@ -227,7 +179,6 @@ void Driver::WriteCommandsForSourcing(Co
 // user only wanted help or version information.
 SBError Driver::ProcessArgs(const opt::InputArgList &args, bool &exiting) {
   SBError error;
-  m_option_data.AddLocalLLDBInit();
 
   // This is kind of a pain, but since we make the debugger in the Driver's
   // constructor, we can't know at that point whether we should read in init
@@ -554,6 +505,13 @@ int Driver::MainLoop() {
     result.PutOutput(m_debugger.GetOutputFileHandle());
   }
 
+  // Source the local .lldbinit file if it exists and we're allowed to source.
+  // Here we want to always print the return object because it contains the
+  // warning and instructions to load local lldbinit files.
+  sb_interpreter.SourceInitFileInCurrentWorkingDirectory(result);
+  result.PutError(m_debugger.GetErrorFileHandle());
+  result.PutOutput(m_debugger.GetOutputFileHandle());
+
   // We allow the user to specify an exit code when calling quit which we will
   // return when exiting.
   m_debugger.GetCommandInterpreter().AllowExitCodeOnQuit(true);

Modified: lldb/trunk/tools/driver/Driver.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/Driver.h?rev=360077&r1=360076&r2=360077&view=diff
==============================================================================
--- lldb/trunk/tools/driver/Driver.h (original)
+++ lldb/trunk/tools/driver/Driver.h Mon May  6 13:45:31 2019
@@ -47,24 +47,18 @@ public:
                                 lldb::SBStream &strm);
 
   struct OptionData {
-    void AddLocalLLDBInit();
     void AddInitialCommand(std::string command, CommandPlacement placement,
                            bool is_file, lldb::SBError &error);
 
     struct InitialCmdEntry {
       InitialCmdEntry(std::string contents, bool in_is_file,
-                      bool is_cwd_lldbinit_file_read, bool in_quiet = false)
+                      bool in_quiet = false)
           : contents(std::move(contents)), is_file(in_is_file),
-            source_quietly(in_quiet),
-            is_cwd_lldbinit_file_read(is_cwd_lldbinit_file_read) {}
+            source_quietly(in_quiet) {}
 
       std::string contents;
       bool is_file;
       bool source_quietly;
-
-      /// Remember if this is reading the local lldbinit file so we can skip it
-      /// if not permitted.
-      bool is_cwd_lldbinit_file_read;
     };
 
     std::vector<std::string> m_args;




More information about the lldb-commits mailing list