Hi aaron.ballman, Bigcheese, rnk, ruiu,

Use the arguments given to the OS at process creation-time instead of
the arguments passed into main() by the C runtime environment.  The ones
that main() received may not be suitable (e.g. not Unicode).

Depends on D1834

http://llvm-reviews.chandlerc.com/D1835

Files:
  tools/driver/driver.cpp

Index: tools/driver/driver.cpp
===================================================================
--- tools/driver/driver.cpp
+++ tools/driver/driver.cpp
@@ -37,6 +37,7 @@
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/PrettyStackTrace.h"
+#include "llvm/Support/Process.h"
 #include "llvm/Support/Program.h"
 #include "llvm/Support/Regex.h"
 #include "llvm/Support/Signals.h"
@@ -292,8 +293,19 @@
   llvm::sys::PrintStackTraceOnErrorSignal();
   llvm::PrettyStackTraceProgram X(argc_, argv_);
 
+  llvm::OwningArrayPtr<char *> NewArgVectorPointers;
+  std::vector<char> NewArgVectorStrings;
+  Optional<ArrayRef<const char *> > NewArgs =
+      llvm::sys::Process::GetArgumentVector(
+          llvm::ArrayRef<const char *>(argv_, argv_ + argc_),
+          NewArgVectorPointers, NewArgVectorStrings);
+  if (!NewArgs) {
+    llvm::errs() << "error: arguments are malformed'\n";
+    return 1;
+  }
+
+  SmallVector<const char *, 256> argv(NewArgs->begin(), NewArgs->end());
   std::set<std::string> SavedStrings;
-  SmallVector<const char*, 256> argv(argv_, argv_ + argc_);
   StringSetSaver Saver(SavedStrings);
   llvm::cl::ExpandResponseFiles(Saver, llvm::cl::TokenizeGNUCommandLine, argv);
Index: tools/driver/driver.cpp
===================================================================
--- tools/driver/driver.cpp
+++ tools/driver/driver.cpp
@@ -37,6 +37,7 @@
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/PrettyStackTrace.h"
+#include "llvm/Support/Process.h"
 #include "llvm/Support/Program.h"
 #include "llvm/Support/Regex.h"
 #include "llvm/Support/Signals.h"
@@ -292,8 +293,19 @@
   llvm::sys::PrintStackTraceOnErrorSignal();
   llvm::PrettyStackTraceProgram X(argc_, argv_);
 
+  llvm::OwningArrayPtr<char *> NewArgVectorPointers;
+  std::vector<char> NewArgVectorStrings;
+  Optional<ArrayRef<const char *> > NewArgs =
+      llvm::sys::Process::GetArgumentVector(
+          llvm::ArrayRef<const char *>(argv_, argv_ + argc_),
+          NewArgVectorPointers, NewArgVectorStrings);
+  if (!NewArgs) {
+    llvm::errs() << "error: arguments are malformed'\n";
+    return 1;
+  }
+
+  SmallVector<const char *, 256> argv(NewArgs->begin(), NewArgs->end());
   std::set<std::string> SavedStrings;
-  SmallVector<const char*, 256> argv(argv_, argv_ + argc_);
   StringSetSaver Saver(SavedStrings);
   llvm::cl::ExpandResponseFiles(Saver, llvm::cl::TokenizeGNUCommandLine, argv);
 
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to