[Lldb-commits] [lldb] aac036a - Revert "[lldb] update lldb-server platform help parsing (#162730)"

Adrian Prantl via lldb-commits lldb-commits at lists.llvm.org
Thu Oct 23 13:56:24 PDT 2025


Author: Adrian Prantl
Date: 2025-10-23T13:56:14-07:00
New Revision: aac036a7f6730118f0d832150243d66b603c3af3

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

LOG: Revert "[lldb] update lldb-server platform help parsing (#162730)"

This reverts commit faf7af864f9258768133894764f1fae58d43bb09.

This is failing on the Darwin bots.

https://green.lab.llvm.org/job/llvm.org/view/LLDB/job/lldb-cmake/16164/changes#faf7af864f9258768133894764f1fae58d43bb09

Added: 
    lldb/test/Shell/lldb-server/TestErrorMessages.test

Modified: 
    lldb/tools/lldb-server/CMakeLists.txt
    lldb/tools/lldb-server/lldb-platform.cpp

Removed: 
    lldb/test/Shell/lldb-server/TestGdbserverErrorMessages.test
    lldb/test/Shell/lldb-server/TestPlatformErrorMessages.test
    lldb/test/Shell/lldb-server/TestPlatformHelp.test
    lldb/test/Shell/lldb-server/TestPlatformSuccessfulStartup.test
    lldb/tools/lldb-server/PlatformOptions.td


################################################################################
diff  --git a/lldb/test/Shell/lldb-server/TestGdbserverErrorMessages.test b/lldb/test/Shell/lldb-server/TestErrorMessages.test
similarity index 100%
rename from lldb/test/Shell/lldb-server/TestGdbserverErrorMessages.test
rename to lldb/test/Shell/lldb-server/TestErrorMessages.test

diff  --git a/lldb/test/Shell/lldb-server/TestPlatformErrorMessages.test b/lldb/test/Shell/lldb-server/TestPlatformErrorMessages.test
deleted file mode 100644
index d8af31ebaca52..0000000000000
--- a/lldb/test/Shell/lldb-server/TestPlatformErrorMessages.test
+++ /dev/null
@@ -1,25 +0,0 @@
-RUN: %platformserver 2>&1 | FileCheck --check-prefixes=NO_LISTEN,ALL %s
-NO_LISTEN: error: either --listen or --child-platform-fd is required
-
-RUN: %lldb-server platform --listen 2>&1 | FileCheck --check-prefixes=LISTEN_MISSING,ALL %s
-LISTEN_MISSING: error: --listen: missing argument
-
-RUN: %lldb-server p --bogus 2>&1 | FileCheck --check-prefixes=BOGUS,ALL %s
-BOGUS: error: unknown argument '--bogus'
-
-RUN: %platformserver --gdbserver-port 2>&1 | FileCheck --check-prefixes=GDBPORT_MISSING,ALL %s
-GDBPORT_MISSING: error: --gdbserver-port: missing argument
-
-RUN: %platformserver --gdbserver-port notanumber --listen :1234 2>&1 | FileCheck --check-prefixes=GDBPORT_INVALID %s
-GDBPORT_INVALID: error: invalid --gdbserver-port value
-
-RUN: %platformserver --socket-file 2>&1 | FileCheck --check-prefixes=SOCKETFILE_MISSING,ALL %s
-SOCKETFILE_MISSING: error: --socket-file: missing argument
-
-RUN: %platformserver --log-file 2>&1 | FileCheck --check-prefixes=LOGFILE_MISSING,ALL %s
-LOGFILE_MISSING: error: --log-file: missing argument
-
-RUN: %platformserver --log-channels 2>&1 | FileCheck --check-prefixes=LOGCHANNELS_MISSING,ALL %s
-LOGCHANNELS_MISSING: error: --log-channels: missing argument
-
-ALL: Use 'lldb-server {{p|platform}} --help' for a complete list of options.

diff  --git a/lldb/test/Shell/lldb-server/TestPlatformHelp.test b/lldb/test/Shell/lldb-server/TestPlatformHelp.test
deleted file mode 100644
index 119bbcaaabf14..0000000000000
--- a/lldb/test/Shell/lldb-server/TestPlatformHelp.test
+++ /dev/null
@@ -1,40 +0,0 @@
-RUN: %platformserver --help 2>&1 | FileCheck %s
-RUN: %platformserver -h 2>&1 | FileCheck %s
-RUN: %lldb-server p --help 2>&1 | FileCheck %s
-RUN: %lldb-server p -h 2>&1 | FileCheck %s
-RUN: %lldb-server platform --help 2>&1 | FileCheck %s
-RUN: %lldb-server platform -h 2>&1 | FileCheck %s
-
-CHECK: OVERVIEW: lldb-server platform
-
-CHECK: USAGE: lldb-server {{p|platform}} [options] --listen <[host]:port> {{\[}}[--] program args...]
-
-CHECK: CONNECTION OPTIONS:
-CHECK: --gdbserver-port <port>
-CHECK-SAME: Short form: -P
-CHECK: --listen <[host]:port>
-CHECK-SAME: Short form: -L
-CHECK: --socket-file <path>
-CHECK-SAME: Short form: -f
-
-CHECK: GENERAL OPTIONS:
-CHECK: --help
-CHECK: --log-channels <channel1 categories...:channel2 categories...>
-CHECK: Short form: -c
-CHECK: --log-file <file>
-CHECK-SAME: Short form: -l
-CHECK: --server
-
-CHECK: OPTIONS:
-CHECK: -- program args
-
-CHECK: DESCRIPTION
-CHECK: Acts as a platform server for remote debugging
-
-CHECK: EXAMPLES
-CHECK: # Listen on port 1234, exit after first connection
-CHECK: lldb-server platform --listen tcp://0.0.0.0:1234
-CHECK: # Listen on port 5555, accept multiple connections
-CHECK: lldb-server platform --server --listen tcp://localhost:5555
-CHECK: # Listen on Unix domain socket
-CHECK: lldb-server platform --listen unix:///tmp/lldb-server.sock

diff  --git a/lldb/test/Shell/lldb-server/TestPlatformSuccessfulStartup.test b/lldb/test/Shell/lldb-server/TestPlatformSuccessfulStartup.test
deleted file mode 100644
index 88a2384c31c34..0000000000000
--- a/lldb/test/Shell/lldb-server/TestPlatformSuccessfulStartup.test
+++ /dev/null
@@ -1,35 +0,0 @@
-# Test successful startup with valid TCP listen address
-# The socket file is created immediately when the server is ready to accept connections,
-# so we can verify successful startup without arbitrary sleep delays.
-RUN: rm -f %t.socket1
-RUN: timeout 0.2s %platformserver --listen tcp://127.0.0.1:0 --socket-file %t.socket1 > %t.out1 2>&1 || true
-RUN: test -f %t.socket1
-RUN: FileCheck --allow-empty --check-prefix=NO-ERROR %s < %t.out1
-
-# Test successful startup with valid gdbserver-port
-RUN: rm -f %t.socket3
-RUN: timeout 0.2s %platformserver --listen tcp://127.0.0.1:0 --gdbserver-port 0 --socket-file %t.socket3 > %t.out3 2>&1 || true
-RUN: test -f %t.socket3
-RUN: FileCheck --allow-empty --check-prefix=NO-ERROR %s < %t.out3
-
-# Test successful startup with specific valid gdbserver-port number
-RUN: rm -f %t.socket4
-RUN: timeout 0.2s %platformserver --listen tcp://127.0.0.1:0 --gdbserver-port 12345 --socket-file %t.socket4 > %t.out4 2>&1 || true
-RUN: test -f %t.socket4
-RUN: FileCheck --allow-empty --check-prefix=NO-ERROR %s < %t.out4
-
-# Test successful startup with server mode (accepting multiple connections)
-RUN: rm -f %t.socket5
-RUN: timeout 0.2s %platformserver --server --listen tcp://127.0.0.1:0 --socket-file %t.socket5 > %t.out5 2>&1 || true
-RUN: test -f %t.socket5
-RUN: FileCheck --allow-empty --check-prefix=NO-ERROR %s < %t.out5
-
-# Test successful startup with abbreviated 'p' command
-RUN: rm -f %t.socket6
-RUN: timeout 0.2s %lldb-server p --listen tcp://127.0.0.1:0 --socket-file %t.socket6 > %t.out6 2>&1 || true
-RUN: test -f %t.socket6
-RUN: FileCheck --allow-empty --check-prefix=NO-ERROR %s < %t.out6
-
-# Verify no error or warning messages appear in successful startup
-NO-ERROR-NOT: error:
-NO-ERROR-NOT: warning:

diff  --git a/lldb/tools/lldb-server/CMakeLists.txt b/lldb/tools/lldb-server/CMakeLists.txt
index fb55c64936121..1d8dc72a3f872 100644
--- a/lldb/tools/lldb-server/CMakeLists.txt
+++ b/lldb/tools/lldb-server/CMakeLists.txt
@@ -2,10 +2,6 @@ set(LLVM_TARGET_DEFINITIONS LLGSOptions.td)
 tablegen(LLVM LLGSOptions.inc -gen-opt-parser-defs)
 add_public_tablegen_target(LLGSOptionsTableGen)
 
-set(LLVM_TARGET_DEFINITIONS PlatformOptions.td)
-tablegen(LLVM PlatformOptions.inc -gen-opt-parser-defs)
-add_public_tablegen_target(PlatformOptionsTableGen)
-
 set(LLDB_PLUGINS)
 
 if(CMAKE_SYSTEM_NAME MATCHES "Linux|Android")
@@ -71,7 +67,6 @@ add_lldb_tool(lldb-server
 
 add_dependencies(lldb-server
   LLGSOptionsTableGen
-  PlatformOptionsTableGen
   ${tablegen_deps}
 )
 target_include_directories(lldb-server PRIVATE "${LLDB_SOURCE_DIR}/source")

diff  --git a/lldb/tools/lldb-server/PlatformOptions.td b/lldb/tools/lldb-server/PlatformOptions.td
deleted file mode 100644
index eedd1d8c35343..0000000000000
--- a/lldb/tools/lldb-server/PlatformOptions.td
+++ /dev/null
@@ -1,75 +0,0 @@
-include "llvm/Option/OptParser.td"
-
-class F<string name>: Flag<["--", "-"], name>;
-class R<list<string> prefixes, string name>
-  : Option<prefixes, name, KIND_REMAINING_ARGS>;
-
-multiclass SJ<string name, string help> {
-  def NAME: Separate<["--", "-"], name>,
-    HelpText<help>;
-  def NAME # _eq: Joined<["--", "-"], name # "=">,
-    Alias<!cast<Separate>(NAME)>;
-}
-
-def grp_connect : OptionGroup<"connection">, HelpText<"CONNECTION OPTIONS">;
-
-defm listen: SJ<"listen", "Host and port to listen on. Format: [host]:port or protocol://[host]:port (e.g., tcp://localhost:1234, unix:///path/to/socket). Short form: -L">,
-  MetaVarName<"<[host]:port>">,
-  Group<grp_connect>;
-def: Separate<["-"], "L">, Alias<listen>,
-  Group<grp_connect>;
-
-defm socket_file: SJ<"socket-file", "Write listening socket information (port number for TCP or path for Unix domain sockets) to the specified file. Short form: -f">,
-  MetaVarName<"<path>">,
-  Group<grp_connect>;
-def: Separate<["-"], "f">, Alias<socket_file>,
-  Group<grp_connect>;
-
-defm gdbserver_port: SJ<"gdbserver-port", "Port to use for spawned gdbserver instances. If 0 or unspecified, a port will be chosen automatically. Short form: -P">,
-  MetaVarName<"<port>">,
-  Group<grp_connect>;
-def: Separate<["-"], "P">, Alias<gdbserver_port>,
-  Group<grp_connect>;
-
-defm child_platform_fd: SJ<"child-platform-fd", "File descriptor for communication with parent platform process (internal use only).">,
-  MetaVarName<"<fd>">,
-  Group<grp_connect>,
-  Flags<[HelpHidden]>;
-
-def grp_general : OptionGroup<"general options">, HelpText<"GENERAL OPTIONS">;
-
-def server: F<"server">,
-  HelpText<"Run in server mode, accepting multiple client connections sequentially. Without this flag, the server exits after handling the first connection.">,
-  Group<grp_general>;
-
-defm log_channels: SJ<"log-channels", "Channels to log. A colon-separated list of entries. Each entry starts with a channel followed by a space-separated list of categories. Common channels: lldb, gdb-remote, platform, process. Short form: -c">,
-  MetaVarName<"<channel1 categories...:channel2 categories...>">,
-  Group<grp_general>;
-def: Separate<["-"], "c">, Alias<log_channels>,
-  Group<grp_general>;
-
-defm log_file: SJ<"log-file", "Destination file to log to. If empty, log to stderr. Short form: -l">,
-  MetaVarName<"<file>">,
-  Group<grp_general>;
-def: Separate<["-"], "l">, Alias<log_file>,
-  Group<grp_general>;
-
-def debug: F<"debug">,
-  HelpText<"(Unused, kept for backward compatibility)">,
-  Group<grp_general>,
-  Flags<[HelpHidden]>;
-
-def verbose: F<"verbose">,
-  HelpText<"(Unused, kept for backward compatibility)">,
-  Group<grp_general>,
-  Flags<[HelpHidden]>;
-
-def help: F<"help">, 
-  HelpText<"Display this help message and exit.">,
-  Group<grp_general>;
-def: Flag<["-"], "h">, Alias<help>,
-  Group<grp_general>;
-
-def REM : R<["--"], "">, 
-  HelpText<"Arguments to pass to launched gdbserver instances.">,
-  MetaVarName<"program args">;

diff  --git a/lldb/tools/lldb-server/lldb-platform.cpp b/lldb/tools/lldb-server/lldb-platform.cpp
index 59b1eb419bc2b..0bd928507ba89 100644
--- a/lldb/tools/lldb-server/lldb-platform.cpp
+++ b/lldb/tools/lldb-server/lldb-platform.cpp
@@ -21,9 +21,6 @@
 #include <fstream>
 #include <optional>
 
-#include "llvm/Option/ArgList.h"
-#include "llvm/Option/OptTable.h"
-#include "llvm/Option/Option.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/ScopedPrinter.h"
 #include "llvm/Support/WithColor.h"
@@ -59,69 +56,22 @@ using namespace llvm;
 // of target CPUs. For now, let's just use 100.
 static const int backlog = 100;
 static const int socket_error = -1;
-
-namespace {
-using namespace llvm::opt;
-
-enum ID {
-  OPT_INVALID = 0, // This is not an option ID.
-#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__),
-#include "PlatformOptions.inc"
-#undef OPTION
-};
-
-#define OPTTABLE_STR_TABLE_CODE
-#include "PlatformOptions.inc"
-#undef OPTTABLE_STR_TABLE_CODE
-
-#define OPTTABLE_PREFIXES_TABLE_CODE
-#include "PlatformOptions.inc"
-#undef OPTTABLE_PREFIXES_TABLE_CODE
-
-static constexpr opt::OptTable::Info InfoTable[] = {
-#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__),
-#include "PlatformOptions.inc"
-#undef OPTION
-};
-
-class PlatformOptTable : public opt::GenericOptTable {
-public:
-  PlatformOptTable()
-      : opt::GenericOptTable(OptionStrTable, OptionPrefixesTable, InfoTable) {}
-
-  void PrintHelp(llvm::StringRef Name) {
-    std::string Usage =
-        (Name + " [options] --listen <[host]:port> [[--] program args...]")
-            .str();
-
-    std::string Title = "lldb-server platform";
-
-    OptTable::printHelp(llvm::outs(), Usage.c_str(), Title.c_str());
-
-    llvm::outs() << R"(
-DESCRIPTION
-  Acts as a platform server for remote debugging. When LLDB clients connect,
-  the platform server handles platform operations (file transfers, process
-  launching) and spawns debug server instances (lldb-server gdbserver) to
-  handle actual debugging sessions.
-
-  By default, the server exits after handling one connection. Use --server
-  to keep running and accept multiple connections sequentially.
-
-EXAMPLES
-  # Listen on port 1234, exit after first connection
-  lldb-server platform --listen tcp://0.0.0.0:1234
-
-  # Listen on port 5555, accept multiple connections
-  lldb-server platform --server --listen tcp://localhost:5555
-
-  # Listen on Unix domain socket
-  lldb-server platform --listen unix:///tmp/lldb-server.sock
-
-)";
-  }
-};
-} // namespace
+static int g_debug = 0;
+static int g_verbose = 0;
+static int g_server = 0;
+
+// option descriptors for getopt_long_only()
+static struct option g_long_options[] = {
+    {"debug", no_argument, &g_debug, 1},
+    {"verbose", no_argument, &g_verbose, 1},
+    {"log-file", required_argument, nullptr, 'l'},
+    {"log-channels", required_argument, nullptr, 'c'},
+    {"listen", required_argument, nullptr, 'L'},
+    {"gdbserver-port", required_argument, nullptr, 'P'},
+    {"socket-file", required_argument, nullptr, 'f'},
+    {"server", no_argument, &g_server, 1},
+    {"child-platform-fd", required_argument, nullptr, 2},
+    {nullptr, 0, nullptr, 0}};
 
 #if defined(__APPLE__)
 #define LOW_PORT (IPPORT_RESERVED)
@@ -147,11 +97,12 @@ static void signal_handler(int signo) {
 }
 #endif
 
-static void display_usage(PlatformOptTable &Opts, const char *progname,
-                          const char *subcommand) {
-  std::string Name =
-      (llvm::sys::path::filename(progname) + " " + subcommand).str();
-  Opts.PrintHelp(Name);
+static void display_usage(const char *progname, const char *subcommand) {
+  fprintf(stderr, "Usage:\n  %s %s [--log-file log-file-name] [--log-channels "
+                  "log-channel-list] [--port-file port-file-path] --server "
+                  "--listen port\n",
+          progname, subcommand);
+  exit(0);
 }
 
 static Status parse_listen_host_port(Socket::SocketProtocol &protocol,
@@ -310,8 +261,7 @@ static Status spawn_process(const char *progname, const FileSpec &prog,
                             const Socket *conn_socket, uint16_t gdb_port,
                             const lldb_private::Args &args,
                             const std::string &log_file,
-                            const StringRef log_channels, MainLoop &main_loop,
-                            bool multi_client) {
+                            const StringRef log_channels, MainLoop &main_loop) {
   Status error;
   SharedSocket shared_socket(conn_socket, error);
   if (error.Fail())
@@ -347,12 +297,9 @@ static Status spawn_process(const char *progname, const FileSpec &prog,
 
   launch_info.SetLaunchInSeparateProcessGroup(false);
 
-  // Set up process monitor callback based on whether we're in server mode.
-  if (multi_client)
-    // In server mode: empty callback (don't terminate when child exits).
+  if (g_server)
     launch_info.SetMonitorProcessCallback([](lldb::pid_t, int, int) {});
   else
-    // In single-client mode: terminate main loop when child exits.
     launch_info.SetMonitorProcessCallback([&main_loop](lldb::pid_t, int, int) {
       main_loop.AddPendingCallback(
           [](MainLoopBase &loop) { loop.RequestTermination(); });
@@ -424,101 +371,107 @@ int main_platform(int argc, char *argv[]) {
   signal(SIGPIPE, SIG_IGN);
   signal(SIGHUP, signal_handler);
 #endif
+  int long_option_index = 0;
+  Status error;
+  std::string listen_host_port;
+  int ch;
 
-  // Special handling for 'help' as first argument.
-  if (argc > 0 && strcmp(argv[0], "help") == 0) {
-    PlatformOptTable Opts;
-    display_usage(Opts, progname, subcommand);
-    return EXIT_SUCCESS;
-  }
+  std::string log_file;
+  StringRef
+      log_channels; // e.g. "lldb process threads:gdb-remote default:linux all"
 
-  Status error;
   shared_fd_t fd = SharedSocket::kInvalidFD;
+
   uint16_t gdbserver_port = 0;
+
   FileSpec socket_file;
+  bool show_usage = false;
+  int option_error = 0;
 
-  PlatformOptTable Opts;
-  BumpPtrAllocator Alloc;
-  StringSaver Saver(Alloc);
-  bool HasError = false;
+  std::string short_options(OptionParser::GetShortOptionString(g_long_options));
 
-  opt::InputArgList Args =
-      Opts.parseArgs(argc, argv, OPT_UNKNOWN, Saver, [&](llvm::StringRef Msg) {
-        WithColor::error() << Msg << "\n";
-        HasError = true;
-      });
+#if __GLIBC__
+  optind = 0;
+#else
+  optreset = 1;
+  optind = 1;
+#endif
 
-  std::string Name =
-      (llvm::sys::path::filename(progname) + " " + subcommand).str();
-  std::string HelpText =
-      "Use '" + Name + " --help' for a complete list of options.\n";
+  while ((ch = getopt_long_only(argc, argv, short_options.c_str(),
+                                g_long_options, &long_option_index)) != -1) {
+    switch (ch) {
+    case 0: // Any optional that auto set themselves will return 0
+      break;
 
-  if (HasError) {
-    llvm::errs() << HelpText;
-    return EXIT_FAILURE;
-  }
+    case 'L':
+      listen_host_port.append(optarg);
+      break;
 
-  if (Args.hasArg(OPT_help)) {
-    display_usage(Opts, progname, subcommand);
-    return EXIT_SUCCESS;
-  }
+    case 'l': // Set Log File
+      if (optarg && optarg[0])
+        log_file.assign(optarg);
+      break;
 
-  // Parse arguments.
-  std::string listen_host_port = Args.getLastArgValue(OPT_listen).str();
-  std::string log_file = Args.getLastArgValue(OPT_log_file).str();
-  StringRef log_channels = Args.getLastArgValue(OPT_log_channels);
-  bool multi_client = Args.hasArg(OPT_server);
-  [[maybe_unused]] bool debug = Args.hasArg(OPT_debug);
-  [[maybe_unused]] bool verbose = Args.hasArg(OPT_verbose);
-
-  if (Args.hasArg(OPT_socket_file)) {
-    socket_file.SetFile(Args.getLastArgValue(OPT_socket_file),
-                        FileSpec::Style::native);
-  }
+    case 'c': // Log Channels
+      if (optarg && optarg[0])
+        log_channels = StringRef(optarg);
+      break;
 
-  if (Args.hasArg(OPT_gdbserver_port)) {
-    if (!llvm::to_integer(Args.getLastArgValue(OPT_gdbserver_port),
-                          gdbserver_port)) {
-      WithColor::error() << "invalid --gdbserver-port value\n";
-      return EXIT_FAILURE;
-    }
-  }
+    case 'f': // Socket file
+      if (optarg && optarg[0])
+        socket_file.SetFile(optarg, FileSpec::Style::native);
+      break;
 
-  if (Args.hasArg(OPT_child_platform_fd)) {
-    uint64_t _fd;
-    if (!llvm::to_integer(Args.getLastArgValue(OPT_child_platform_fd), _fd)) {
-      WithColor::error() << "invalid --child-platform-fd value\n";
-      return EXIT_FAILURE;
+    case 'P':
+    case 'm':
+    case 'M': {
+      uint16_t portnum;
+      if (!llvm::to_integer(optarg, portnum)) {
+        WithColor::error() << "invalid port number string " << optarg << "\n";
+        option_error = 2;
+        break;
+      }
+      // Note the condition gdbserver_port > HIGH_PORT is valid in case of using
+      // --child-platform-fd. Check gdbserver_port later.
+      if (ch == 'P')
+        gdbserver_port = portnum;
+      else if (gdbserver_port == 0)
+        gdbserver_port = portnum;
+    } break;
+
+    case 2: {
+      uint64_t _fd;
+      if (!llvm::to_integer(optarg, _fd)) {
+        WithColor::error() << "invalid fd " << optarg << "\n";
+        option_error = 6;
+      } else
+        fd = (shared_fd_t)_fd;
+    } break;
+
+    case 'h': /* fall-through is intentional */
+    case '?':
+      show_usage = true;
+      break;
     }
-    fd = (shared_fd_t)_fd;
   }
 
   if (!LLDBServerUtilities::SetupLogging(log_file, log_channels, 0))
     return -1;
 
   // Print usage and exit if no listening port is specified.
-  if (listen_host_port.empty() && fd == SharedSocket::kInvalidFD) {
-    WithColor::error() << "either --listen or --child-platform-fd is required\n"
-                       << HelpText;
-    return EXIT_FAILURE;
-  }
+  if (listen_host_port.empty() && fd == SharedSocket::kInvalidFD)
+    show_usage = true;
 
-  // Get remaining arguments for inferior.
-  std::vector<llvm::StringRef> Inputs;
-  for (opt::Arg *Arg : Args.filtered(OPT_INPUT))
-    Inputs.push_back(Arg->getValue());
-  if (opt::Arg *Arg = Args.getLastArg(OPT_REM)) {
-    for (const char *Val : Arg->getValues())
-      Inputs.push_back(Val);
+  if (show_usage || option_error) {
+    display_usage(progname, subcommand);
+    exit(option_error);
   }
 
+  // Skip any options we consumed with getopt_long_only.
+  argc -= optind;
+  argv += optind;
   lldb_private::Args inferior_arguments;
-  if (!Inputs.empty()) {
-    std::vector<const char *> args_ptrs;
-    for (const auto &Input : Inputs)
-      args_ptrs.push_back(Input.data());
-    inferior_arguments.SetArguments(args_ptrs.size(), args_ptrs.data());
-  }
+  inferior_arguments.SetArguments(argc, const_cast<const char **>(argv));
 
   FileSpec debugserver_path = GetDebugserverPath();
   if (!debugserver_path) {
@@ -561,7 +514,7 @@ int main_platform(int argc, char *argv[]) {
     platform.SetConnection(
         std::make_unique<ConnectionFileDescriptor>(std::move(socket)));
     client_handle(platform, inferior_arguments);
-    return EXIT_SUCCESS;
+    return 0;
   }
 
   if (gdbserver_port != 0 &&
@@ -569,7 +522,7 @@ int main_platform(int argc, char *argv[]) {
     WithColor::error() << llvm::formatv("Port number {0} is not in the "
                                         "valid user port range of {1} - {2}\n",
                                         gdbserver_port, LOW_PORT, HIGH_PORT);
-    return EXIT_FAILURE;
+    return 1;
   }
 
   Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain;
@@ -606,7 +559,7 @@ int main_platform(int argc, char *argv[]) {
     if (error.Fail()) {
       fprintf(stderr, "failed to write socket id to %s: %s\n",
               socket_file.GetPath().c_str(), error.AsCString());
-      return EXIT_FAILURE;
+      return 1;
     }
   }
 
@@ -624,22 +577,22 @@ int main_platform(int argc, char *argv[]) {
     llvm::Expected<std::vector<MainLoopBase::ReadHandleUP>> platform_handles =
         platform_sock->Accept(
             main_loop, [progname, gdbserver_port, &inferior_arguments, log_file,
-                        log_channels, &main_loop, multi_client,
+                        log_channels, &main_loop,
                         &platform_handles](std::unique_ptr<Socket> sock_up) {
               printf("Connection established.\n");
               Status error = spawn_process(
                   progname, HostInfo::GetProgramFileSpec(), sock_up.get(),
                   gdbserver_port, inferior_arguments, log_file, log_channels,
-                  main_loop, multi_client);
+                  main_loop);
               if (error.Fail()) {
                 Log *log = GetLog(LLDBLog::Platform);
                 LLDB_LOGF(log, "spawn_process failed: %s", error.AsCString());
                 WithColor::error()
                     << "spawn_process failed: " << error.AsCString() << "\n";
-                if (!multi_client)
+                if (!g_server)
                   main_loop.RequestTermination();
               }
-              if (!multi_client)
+              if (!g_server)
                 platform_handles->clear();
             });
     if (!platform_handles) {
@@ -663,5 +616,5 @@ int main_platform(int argc, char *argv[]) {
 
   fprintf(stderr, "lldb-server exiting...\n");
 
-  return EXIT_SUCCESS;
+  return 0;
 }


        


More information about the lldb-commits mailing list