summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Hines <srhines@google.com>2016-04-20 00:33:06 +0000
committerStephen Hines <srhines@google.com>2016-04-20 00:33:06 +0000
commita978a076a90be7f659b68959d567653845cf165e (patch)
tree2dcbd6210fbb4fd4e5c2d03f53b16cd4bc58418a
parentc2dd7da5ca2452f53e8f2880b4a17c8b93a5a62c (diff)
downloadbcm5719-llvm-a978a076a90be7f659b68959d567653845cf165e.tar.gz
bcm5719-llvm-a978a076a90be7f659b68959d567653845cf165e.zip
MarkEOLs should only be true for clang-cl.exe.
Summary: https://llvm.org/bugs/show_bug.cgi?id=27396 This fixes an issue in response files where "\r\n" was being interpreted as two EOL markers (i.e. we consumed the '\r' as terminating the previous token, and then parsed the '\n' as a significant EOL). This breaks response files where joined arguments get split across multiple lines (like "-x\r\nc"). I also fixed an accidental issue in the response-file.c test, where the response file is appended to, instead of being overwritten. Reviewers: rnk Subscribers: danalbert, llvm-commits Differential Revision: http://reviews.llvm.org/D19289 llvm-svn: 266840
-rw-r--r--clang/test/Driver/response-file-extra-whitespace.c12
-rw-r--r--clang/test/Driver/response-file.c2
-rw-r--r--clang/tools/driver/driver.cpp18
3 files changed, 26 insertions, 6 deletions
diff --git a/clang/test/Driver/response-file-extra-whitespace.c b/clang/test/Driver/response-file-extra-whitespace.c
new file mode 100644
index 00000000000..93b32bb5054
--- /dev/null
+++ b/clang/test/Driver/response-file-extra-whitespace.c
@@ -0,0 +1,12 @@
+// Check that clang is able to process response files with extra whitespace.
+// We generate a dos-style file with \r\n for line endings, and then split
+// some joined arguments (like "-x c") across lines to ensure that regular
+// clang (not clang-cl) can process it correctly.
+//
+// RUN: echo -en "-x\r\nc\r\n-DTEST\r\n" > %t.0.txt
+// RUN: %clang -E @%t.0.txt %s -v 2>&1 | FileCheck %s -check-prefix=SHORT
+// SHORT: extern int it_works;
+
+#ifdef TEST
+extern int it_works;
+#endif
diff --git a/clang/test/Driver/response-file.c b/clang/test/Driver/response-file.c
index 208a941e872..bd336309adf 100644
--- a/clang/test/Driver/response-file.c
+++ b/clang/test/Driver/response-file.c
@@ -4,7 +4,7 @@
// Since this is a short response file, clang must not use a response file
// to pass its parameters to other tools. This is only necessary for a large
// number of parameters.
-// RUN: echo "-DTEST" >> %t.0.txt
+// RUN: echo "-DTEST" > %t.0.txt
// RUN: %clang -E @%t.0.txt %s -v 2>&1 | FileCheck %s -check-prefix=SHORT
// SHORT-NOT: Arguments passed via response file
// SHORT: extern int it_works;
diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp
index bd3c533904a..b7097e3faf1 100644
--- a/clang/tools/driver/driver.cpp
+++ b/clang/tools/driver/driver.cpp
@@ -338,18 +338,26 @@ int main(int argc_, const char **argv_) {
// have to manually search for a --driver-mode=cl argument the hard way.
// Finally, our -cc1 tools don't care which tokenization mode we use because
// response files written by clang will tokenize the same way in either mode.
- llvm::cl::TokenizerCallback Tokenizer = &llvm::cl::TokenizeGNUCommandLine;
+ bool ClangCLMode = false;
if (TargetAndMode.second == "--driver-mode=cl" ||
std::find_if(argv.begin(), argv.end(), [](const char *F) {
return F && strcmp(F, "--driver-mode=cl") == 0;
}) != argv.end()) {
- Tokenizer = &llvm::cl::TokenizeWindowsCommandLine;
+ ClangCLMode = true;
}
// Determines whether we want nullptr markers in argv to indicate response
- // files end-of-lines. We only use this for the /LINK driver argument.
- bool MarkEOLs = true;
- if (argv.size() > 1 && StringRef(argv[1]).startswith("-cc1"))
+ // files end-of-lines. We only use this for the /LINK driver argument with
+ // clang-cl.exe on Windows.
+ bool MarkEOLs = false;
+
+ llvm::cl::TokenizerCallback Tokenizer = &llvm::cl::TokenizeGNUCommandLine;
+ if (ClangCLMode) {
+ Tokenizer = &llvm::cl::TokenizeWindowsCommandLine;
+ MarkEOLs = true;
+ }
+
+ if (MarkEOLs && argv.size() > 1 && StringRef(argv[1]).startswith("-cc1"))
MarkEOLs = false;
llvm::cl::ExpandResponseFiles(Saver, Tokenizer, argv, MarkEOLs);
OpenPOWER on IntegriCloud