[llvm-ar] Support an options string that start with a dash

Some projects call $AR like "$AR -crs output input1 input2".

Differential Revision: https://reviews.llvm.org/D39538

llvm-svn: 317358
This commit is contained in:
Martin Storsjo 2017-11-03 20:09:10 +00:00
parent 9583dc1ef1
commit 2af6576330
2 changed files with 22 additions and 1 deletions

View File

@ -4,7 +4,8 @@ RUN: yaml2obj %S/Inputs/coff.yaml -o %t-coff.o
RUN: rm -f %t.ar
RUN: llvm-ar crs %t.ar %t-macho.o
RUN: grep -q __.SYMDEF %t.ar
RUN: llvm-ar crs %t.ar %t-coff.o
Test that an option string prefixed by a dash works.
RUN: llvm-ar -crs %t.ar %t-coff.o
RUN: grep -q __.SYMDEF %t.ar
RUN: rm -f %t.ar

View File

@ -127,6 +127,8 @@ static cl::extrahelp MoreHelp(
" [v] - be verbose about actions taken\n"
);
static const char OptionChars[] = "dmpqrtxabiosSTucv";
// This enumeration delineates the kinds of operations on an archive
// that are permitted.
enum ArchiveOperation {
@ -864,6 +866,24 @@ int main(int argc, char **argv) {
Stem.find("lib") != StringRef::npos)
return libDriverMain(makeArrayRef(argv, argc));
for (int i = 1; i < argc; i++) {
// If an argument starts with a dash and only contains chars
// that belong to the options chars set, remove the dash.
// We can't handle it after the command line options parsing
// is done, since it will error out on an unrecognized string
// starting with a dash.
// Make sure this doesn't match the actual llvm-ar specific options
// that start with a dash.
StringRef S = argv[i];
if (S.startswith("-") &&
S.find_first_not_of(OptionChars, 1) == StringRef::npos) {
argv[i]++;
break;
}
if (S == "--")
break;
}
// Have the command line options parsed and handle things
// like --help and --version.
cl::ParseCommandLineOptions(argc, argv,