|
22 | 22 | #include "llvm/Passes/StandardInstrumentations.h" |
23 | 23 | #include "llvm/Support/CBindingWrapping.h" |
24 | 24 | #include "llvm/Support/FileSystem.h" |
| 25 | +#include "llvm/Support/Program.h" |
25 | 26 | #include "llvm/Support/TimeProfiler.h" |
26 | 27 | #include "llvm/Support/VirtualFileSystem.h" |
27 | 28 | #include "llvm/Target/TargetMachine.h" |
@@ -472,16 +473,19 @@ extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine( |
472 | 473 | assert(ArgsCstrBuff[ArgsCstrBuffLen - 1] == '\0'); |
473 | 474 | auto Arg0 = std::string(ArgsCstrBuff); |
474 | 475 | buffer_offset = Arg0.size() + 1; |
475 | | - auto ArgsCppStr = std::string(ArgsCstrBuff + buffer_offset, |
476 | | - ArgsCstrBuffLen - buffer_offset); |
477 | | - auto i = 0; |
478 | | - while (i != std::string::npos) { |
479 | | - i = ArgsCppStr.find('\0', i + 1); |
480 | | - if (i != std::string::npos) |
481 | | - ArgsCppStr.replace(i, 1, " "); |
| 476 | + |
| 477 | + std::string CommandlineArgs; |
| 478 | + raw_string_ostream OS(CommandlineArgs); |
| 479 | + ListSeparator LS(" "); |
| 480 | + for (StringRef Arg : split(StringRef(ArgsCstrBuff + buffer_offset, |
| 481 | + ArgsCstrBuffLen - buffer_offset), |
| 482 | + '\0')) { |
| 483 | + OS << LS; |
| 484 | + sys::printArg(OS, Arg, /*Quote=*/true); |
482 | 485 | } |
| 486 | + OS.flush(); |
483 | 487 | Options.MCOptions.Argv0 = Arg0; |
484 | | - Options.MCOptions.CommandlineArgs = ArgsCppStr; |
| 488 | + Options.MCOptions.CommandlineArgs = CommandlineArgs; |
485 | 489 | #else |
486 | 490 | int buffer_offset = 0; |
487 | 491 | assert(ArgsCstrBuff[ArgsCstrBuffLen - 1] == '\0'); |
|
0 commit comments