Index: llvm/test/tools/llvm-nm/option--.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-nm/option--.test @@ -0,0 +1,10 @@ +; RUN: not llvm-nm -- -weird-filename-that-doesnt-exist 2>&1 | FileCheck %s --check-prefix=CHECK-NOTOPT +; CHECK-NOTOPT: error: -weird-filename-that-doesnt-exist: No such file or directory + +; RUN: llvm-as < %s > %p/-.bc +; RUN: llvm-nm -- %p/-.bc | FileCheck %s + +; CHECK: foo +define void @foo() { + ret void +} Index: llvm/tools/llvm-nm/Opts.td =================================================================== --- llvm/tools/llvm-nm/Opts.td +++ llvm/tools/llvm-nm/Opts.td @@ -81,3 +81,5 @@ def : F<"v", "Alias for --numeric-sort">, Alias; def : F<"V", "Alias for --version">, Alias; def : F<"W", "Alias for --no-weak">, Alias; + +def DASH_DASH : Option<["--"], "", KIND_REMAINING_ARGS>; Index: llvm/tools/llvm-nm/llvm-nm.cpp =================================================================== --- llvm/tools/llvm-nm/llvm-nm.cpp +++ llvm/tools/llvm-nm/llvm-nm.cpp @@ -2470,6 +2470,11 @@ error("bad number of arguments (must be two arguments)", "for the -s option"); + // Everything after `--` on its own should be considered an input file. + if (opt::Arg *A = Args.getLastArgNoClaim(OPT_DASH_DASH)) + InputFilenames.insert(InputFilenames.end(), A->getValues().begin(), + A->getValues().end()); + if (InputFilenames.empty()) InputFilenames.push_back("a.out"); if (InputFilenames.size() > 1)