Mimic gcc behaviour with regard to response files.
authorMikhail Glushenkov <foldr@codedgers.com>
Wed, 21 Jan 2009 13:14:02 +0000 (13:14 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Wed, 21 Jan 2009 13:14:02 +0000 (13:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62688 91177308-0d34-0410-b5e6-96231b3b80d8

docs/CommandGuide/llvmc.pod
lib/Support/CommandLine.cpp

index 17d85d738901235e963ccef1dc520b6b06bfd905..53eecaf0525111d2187d354b977334d68e384a7d 100644 (file)
@@ -78,8 +78,24 @@ options intended for developers.
 
 Print version information and exit.
 
+=item B<@>I<file>
+
+Read command-line options from I<file>. The options read are inserted
+in place of the original @I<file> option. If I<file> does not exist, or
+cannot be read, then the option will be treated literally, and not
+removed.
+
+Options in I<file> are separated by whitespace. A whitespace character
+may be included in an option by surrounding the entire option in
+either single or double quotes. Any character (including a backslash)
+may be included by prefixing the character to be included with a
+backslash. The file may itself contain additional @I<file> options;
+any such options will be processed recursively.
+
+
 =back
 
+
 =head2 Control Options
 
 By default, LLVMC is built with some standard configuration libraries
index 87dfc5a703fa885d9a36ecd1effd3c4214c258ec..8cd483a25e5de7bfd49f8c5780f5837cdef20780 100644 (file)
@@ -388,23 +388,22 @@ static void ExpandResponseFiles(int argc, char** argv,
       // Check that the response file is not empty (mmap'ing empty
       // files can be problematic).
       const sys::FileStatus *FileStat = respFile.getFileStatus();
-      if (!FileStat)
-        continue;
-      if (FileStat->getSize() == 0)
-        continue;
-
-      // Mmap the response file into memory.
-      OwningPtr<MemoryBuffer>
-        respFilePtr(MemoryBuffer::getFile(respFile.c_str()));
-
-      if (respFilePtr == 0)
-        continue;
-
-      ParseCStringVector(newArgv, respFilePtr->getBufferStart());
-    }
-    else {
-      newArgv.push_back(strdup(arg));
+      if (FileStat && FileStat->getSize() != 0) {
+
+        // Mmap the response file into memory.
+        OwningPtr<MemoryBuffer>
+          respFilePtr(MemoryBuffer::getFile(respFile.c_str()));
+
+        // If we could open the file, parse its contents, otherwise
+        // pass the @file option verbatim.
+        // TODO: support recursion.
+        if (respFilePtr != 0) {
+          ParseCStringVector(newArgv, respFilePtr->getBufferStart());
+          continue;
+        }
+      }
     }
+    newArgv.push_back(strdup(arg));
   }
 }