r186603 - [Driver] Use LLVM's response file parser because it can read UTF-16
Reid Kleckner
reid at kleckner.net
Thu Jul 18 13:00:53 PDT 2013
Author: rnk
Date: Thu Jul 18 15:00:53 2013
New Revision: 186603
URL: http://llvm.org/viewvc/llvm-project?rev=186603&view=rev
Log:
[Driver] Use LLVM's response file parser because it can read UTF-16
MSBuild writes response files as UTF-16 little endian with a byte order
mark. With this change, clang will be able to read them, although we
still can't parse any of their flags.
Adds a UTF-16-LE response file with a BOM for testing.
Differential Revision: http://llvm-reviews.chandlerc.com/D1137
Added:
cfe/trunk/test/Driver/at_file.c.args.utf16le
Modified:
cfe/trunk/test/Driver/at_file.c
cfe/trunk/test/Driver/at_file.c.args
cfe/trunk/tools/driver/driver.cpp
Modified: cfe/trunk/test/Driver/at_file.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/at_file.c?rev=186603&r1=186602&r2=186603&view=diff
==============================================================================
--- cfe/trunk/test/Driver/at_file.c (original)
+++ cfe/trunk/test/Driver/at_file.c Thu Jul 18 15:00:53 2013
@@ -1,5 +1,7 @@
// RUN: %clang -E %s @%s.args -o %t.log
// RUN: FileCheck --input-file=%t.log %s
+// RUN: %clang -E %s @%s.args.utf16le -o %t.log
+// RUN: FileCheck --input-file=%t.log %s
// CHECK: bar1
// CHECK-NEXT: bar2 zed2
@@ -13,6 +15,7 @@
// CHECK-NEXT: foo10"bar10"zed10
// CHECK: bar
// CHECK: zed12
+// CHECK: one\two
foo1
foo2
@@ -28,3 +31,4 @@ foo10
bar
#endif
foo12
+foo13
Modified: cfe/trunk/test/Driver/at_file.c.args
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/at_file.c.args?rev=186603&r1=186602&r2=186603&view=diff
==============================================================================
--- cfe/trunk/test/Driver/at_file.c.args (original)
+++ cfe/trunk/test/Driver/at_file.c.args Thu Jul 18 15:00:53 2013
@@ -9,3 +9,4 @@
-Dfoo10=foo10\"bar10\"zed10
-D foo11
-Dfoo12=zed12\
+-Dfoo13='one\\two'
Added: cfe/trunk/test/Driver/at_file.c.args.utf16le
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/at_file.c.args.utf16le?rev=186603&view=auto
==============================================================================
Binary files cfe/trunk/test/Driver/at_file.c.args.utf16le (added) and cfe/trunk/test/Driver/at_file.c.args.utf16le Thu Jul 18 15:00:53 2013 differ
Modified: cfe/trunk/tools/driver/driver.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/driver.cpp?rev=186603&r1=186602&r2=186603&view=diff
==============================================================================
--- cfe/trunk/tools/driver/driver.cpp (original)
+++ cfe/trunk/tools/driver/driver.cpp Thu Jul 18 15:00:53 2013
@@ -29,6 +29,7 @@
#include "llvm/Option/ArgList.h"
#include "llvm/Option/OptTable.h"
#include "llvm/Option/Option.h"
+#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Host.h"
@@ -189,78 +190,6 @@ extern int cc1_main(const char **ArgBegi
extern int cc1as_main(const char **ArgBegin, const char **ArgEnd,
const char *Argv0, void *MainAddr);
-static void ExpandArgsFromBuf(const char *Arg,
- SmallVectorImpl<const char*> &ArgVector,
- std::set<std::string> &SavedStrings) {
- const char *FName = Arg + 1;
- OwningPtr<llvm::MemoryBuffer> MemBuf;
- if (llvm::MemoryBuffer::getFile(FName, MemBuf)) {
- ArgVector.push_back(SaveStringInSet(SavedStrings, Arg));
- return;
- }
-
- const char *Buf = MemBuf->getBufferStart();
- char InQuote = ' ';
- std::string CurArg;
-
- for (const char *P = Buf; ; ++P) {
- if (*P == '\0' || (isWhitespace(*P) && InQuote == ' ')) {
- if (!CurArg.empty()) {
-
- if (CurArg[0] != '@') {
- ArgVector.push_back(SaveStringInSet(SavedStrings, CurArg));
- } else {
- ExpandArgsFromBuf(CurArg.c_str(), ArgVector, SavedStrings);
- }
-
- CurArg = "";
- }
- if (*P == '\0')
- break;
- else
- continue;
- }
-
- if (isWhitespace(*P)) {
- if (InQuote != ' ')
- CurArg.push_back(*P);
- continue;
- }
-
- if (*P == '"' || *P == '\'') {
- if (InQuote == *P)
- InQuote = ' ';
- else if (InQuote == ' ')
- InQuote = *P;
- else
- CurArg.push_back(*P);
- continue;
- }
-
- if (*P == '\\') {
- ++P;
- if (*P != '\0')
- CurArg.push_back(*P);
- continue;
- }
- CurArg.push_back(*P);
- }
-}
-
-static void ExpandArgv(int argc, const char **argv,
- SmallVectorImpl<const char*> &ArgVector,
- std::set<std::string> &SavedStrings) {
- for (int i = 0; i < argc; ++i) {
- const char *Arg = argv[i];
- if (Arg[0] != '@') {
- ArgVector.push_back(SaveStringInSet(SavedStrings, std::string(Arg)));
- continue;
- }
-
- ExpandArgsFromBuf(Arg, ArgVector, SavedStrings);
- }
-}
-
static void ParseProgName(SmallVectorImpl<const char *> &ArgVector,
std::set<std::string> &SavedStrings,
Driver &TheDriver)
@@ -342,14 +271,26 @@ static void ParseProgName(SmallVectorImp
}
}
+namespace {
+ class StringSetSaver : public llvm::cl::StringSaver {
+ public:
+ StringSetSaver(std::set<std::string> &Storage) : Storage(Storage) {}
+ const char *SaveString(const char *Str) LLVM_OVERRIDE {
+ return SaveStringInSet(Storage, Str);
+ }
+ private:
+ std::set<std::string> &Storage;
+ };
+}
+
int main(int argc_, const char **argv_) {
llvm::sys::PrintStackTraceOnErrorSignal();
llvm::PrettyStackTraceProgram X(argc_, argv_);
std::set<std::string> SavedStrings;
- SmallVector<const char*, 256> argv;
-
- ExpandArgv(argc_, argv_, argv, SavedStrings);
+ SmallVector<const char*, 256> argv(argv_, argv_ + argc_);
+ StringSetSaver Saver(SavedStrings);
+ llvm::cl::ExpandResponseFiles(Saver, llvm::cl::TokenizeGNUCommandLine, argv);
// Handle -cc1 integrated tools.
if (argv.size() > 1 && StringRef(argv[1]).startswith("-cc1")) {
More information about the cfe-commits
mailing list