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")) { _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
