Skip to content

Commit

Permalink
[lldb/Driver] Fix handling on positional arguments
Browse files Browse the repository at this point in the history
Before the transition to libOption it was possible to specify arguments
for the inferior without -- as long as they didn't start with a dash.

For example, the following invocations should all behave the same:

  $ lldb inferior inferior-arg
  $ lldb inferior -- inferior-arg
  $ lldb -- inferior inferior-arg

This patch fixes that behavior, documents it and adds a test to cover
the different combinations.

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

(cherry picked from commit 82093e8)
  • Loading branch information
JDevlieghere committed May 19, 2020
1 parent 771a1d8 commit a2a8bac
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 15 deletions.
13 changes: 9 additions & 4 deletions lldb/docs/man/lldb.rst
Expand Up @@ -244,11 +244,16 @@ EXAMPLES

The debugger can be started in several modes.

Passing an executable as a positional argument prepares :program:`lldb` to
debug the given executable. Arguments passed after -- are considered arguments
to the debugged executable.
Passing an executable as a positional argument prepares lldb to debug the given
executable. To disambiguate between arguments passed to lldb and arguments
passed to the debugged executable, arguments starting with a - must be passed
after --.

lldb --arch x86_64 /path/to/program -- --arch arvm7
lldb --arch x86_64 /path/to/program program argument -- --arch arvm7

For convenience, passing the executable after -- is also supported.

lldb --arch x86_64 -- /path/to/program program argument --arch arvm7

Passing one of the attach options causes :program:`lldb` to immediately attach
to the given process.
Expand Down
2 changes: 1 addition & 1 deletion lldb/test/Shell/Driver/TestNoUseColor.test
@@ -1,4 +1,4 @@
# RUN: %lldb --no-use-color -s %s | FileCheck %s
# RUN: %lldb --no-use-colors -s %s | FileCheck %s
settings show use-color
# CHECK: use-color (boolean) = false
q
30 changes: 30 additions & 0 deletions lldb/test/Shell/Driver/TestPositionalArgs.test
@@ -0,0 +1,30 @@
RUN: echo "int main() { return 0; }" | %clang_host -x c - -o %t.foo

RUN: %lldb -x -b %t.foo bar baz quux | FileCheck %s
RUN: %lldb -x -b -- %t.foo bar baz quux | FileCheck %s
RUN: %lldb -x -b %t.foo -- bar baz quux | FileCheck %s
RUN: %lldb -x -b %t.foo bar -- baz quux | FileCheck %s
RUN: %lldb -x -b %t.foo bar baz -- quux | FileCheck %s
RUN: %lldb %t.foo -x bar -b baz -- quux | FileCheck %s
RUN: %lldb -x -b -f %t.foo bar baz quux | FileCheck %s
RUN: %lldb -x -b -f %t.foo -- bar baz quux | FileCheck %s
RUN: %lldb -x -b -f %t.foo bar -- baz quux | FileCheck %s
RUN: %lldb -x -b -f %t.foo bar baz -- quux | FileCheck %s

CHECK: Current executable set to {{.*}}foo
CHECK: target.run-args "bar" "baz" "quux"

RUN: %lldb -x -b %t.foo -- bar -baz --quux | FileCheck %s --check-prefix DASH
RUN: %lldb -x -b -- %t.foo bar -baz --quux | FileCheck %s --check-prefix DASH
RUN: %lldb -x -b -f %t.foo -- bar -baz --quux | FileCheck %s --check-prefix DASH

DASH: Current executable set to {{.*}}foo
DASH: target.run-args "bar" "-baz" "--quux"

RUN: %lldb -x -b %t.foo bar -baz --quux 2>&1 | FileCheck %s --check-prefix UNKNOWN
RUN: %lldb -x -b -f %t.foo bar -baz --quux 2>&1 | FileCheck %s --check-prefix UNKNOWN

UNKNOWN: warning: ignoring unknown option: -baz
UNKNOWN: warning: ignoring unknown option: --quux
UNKNOWN: Current executable set to {{.*}}foo
UNKNOWN: target.run-args "bar"
20 changes: 10 additions & 10 deletions lldb/tools/driver/Driver.cpp
Expand Up @@ -360,13 +360,8 @@ SBError Driver::ProcessArgs(const opt::InputArgList &args, bool &exiting) {
if (m_option_data.m_process_name.empty() &&
m_option_data.m_process_pid == LLDB_INVALID_PROCESS_ID) {

// If the option data args array is empty that means the file was not
// specified with -f and we need to get it from the input args.
if (m_option_data.m_args.empty()) {
if (auto *arg = args.getLastArgNoClaim(OPT_INPUT)) {
m_option_data.m_args.push_back(arg->getAsString((args)));
}
}
for (auto *arg : args.filtered(OPT_INPUT))
m_option_data.m_args.push_back(arg->getAsString((args)));

// Any argument following -- is an argument for the inferior.
if (auto *arg = args.getLastArgNoClaim(OPT_REM)) {
Expand Down Expand Up @@ -763,10 +758,15 @@ static void printHelp(LLDBOptTable &table, llvm::StringRef tool_name) {
The debugger can be started in several modes.
Passing an executable as a positional argument prepares lldb to debug the
given executable. Arguments passed after -- are considered arguments to the
debugged executable.
given executable. To disambiguate between arguments passed to lldb and
arguments passed to the debugged executable, arguments starting with a - must
be passed after --.
lldb --arch x86_64 /path/to/program program argument -- --arch arvm7
For convenience, passing the executable after -- is also supported.
lldb --arch x86_64 /path/to/program -- --arch arvm7
lldb --arch x86_64 -- /path/to/program program argument --arch arvm7
Passing one of the attach options causes lldb to immediately attach to the
given process.
Expand Down

0 comments on commit a2a8bac

Please sign in to comment.