]> granicus.if.org Git - llvm/commitdiff
[llvm-ar] Support an options string that start with a dash
authorMartin Storsjo <martin@martin.st>
Fri, 3 Nov 2017 20:09:10 +0000 (20:09 +0000)
committerMartin Storsjo <martin@martin.st>
Fri, 3 Nov 2017 20:09:10 +0000 (20:09 +0000)
Some projects call $AR like "$AR -crs output input1 input2".

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@317358 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-ar/default-add.test
tools/llvm-ar/llvm-ar.cpp

index 88719e4efce3c9193dc2e51c9394460f44539db6..68e41c249100c6c97c685a762a898b1eea4de268 100644 (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
index 576265cfe598f743f503b9892096d0d1a06a4048..8c19f6b6af877627ecdda763a6c304f824566a72 100644 (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,