Mimic gcc behaviour with regard to response files.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62688 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/docs/CommandGuide/llvmc.pod b/docs/CommandGuide/llvmc.pod
index 17d85d7..53eecaf 100644
--- a/docs/CommandGuide/llvmc.pod
+++ b/docs/CommandGuide/llvmc.pod
@@ -78,8 +78,24 @@
 
 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
diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp
index 87dfc5a..8cd483a 100644
--- a/lib/Support/CommandLine.cpp
+++ b/lib/Support/CommandLine.cpp
@@ -388,23 +388,22 @@
       // 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;
+      if (FileStat && FileStat->getSize() != 0) {
 
-      // Mmap the response file into memory.
-      OwningPtr<MemoryBuffer>
-        respFilePtr(MemoryBuffer::getFile(respFile.c_str()));
+        // Mmap the response file into memory.
+        OwningPtr<MemoryBuffer>
+          respFilePtr(MemoryBuffer::getFile(respFile.c_str()));
 
-      if (respFilePtr == 0)
-        continue;
-
-      ParseCStringVector(newArgv, respFilePtr->getBufferStart());
+        // 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;
+        }
+      }
     }
-    else {
-      newArgv.push_back(strdup(arg));
-    }
+    newArgv.push_back(strdup(arg));
   }
 }