Index: COFF/PDB.cpp =================================================================== --- COFF/PDB.cpp +++ COFF/PDB.cpp @@ -1029,6 +1029,22 @@ } } +static std::string quote(ArrayRef Args) { + std::string ArgStr; + ArgStr.reserve(256); + for (StringRef Arg : Args) { + if (!ArgStr.empty()) + ArgStr.push_back(' '); + bool HasWS = Arg.find(' ') != StringRef::npos; + if (HasWS) + ArgStr.push_back('"'); + ArgStr.append(Arg); + if (HasWS) + ArgStr.push_back('"'); + } + return ArgStr; +} + static void addCommonLinkerModuleSymbols(StringRef Path, pdb::DbiModuleDescriptorBuilder &Mod, BumpPtrAllocator &Allocator) { @@ -1064,7 +1080,10 @@ CS.setLanguage(SourceLanguage::Link); ArrayRef Args = makeArrayRef(Config->Argv).drop_front(); - std::string ArgStr = llvm::join(Args, " "); + + // Mimic MSVC which surrounds arguments containing whitespace with quotes. + std::string ArgStr = quote(Args); + EBS.Fields.push_back("cwd"); SmallString<64> cwd; sys::fs::current_path(cwd); Index: test/COFF/pdb-linker-module.test =================================================================== --- test/COFF/pdb-linker-module.test +++ test/COFF/pdb-linker-module.test @@ -1,4 +1,4 @@ -RUN: lld-link /debug /pdb:%t.pdb /nodefaultlib /entry:main %S/Inputs/pdb-diff.obj +RUN: lld-link /debug /pdb:%t.pdb /nodefaultlib /entry:main /manifestuac:"level='asInvoker' uiAccess='false'" %S/Inputs/pdb-diff.obj RUN: llvm-pdbutil dump -modules %t.pdb | FileCheck --check-prefix=MODS %s RUN: llvm-pdbutil dump -symbols %t.pdb | FileCheck --check-prefix=SYMS %s @@ -21,4 +21,4 @@ SYMS-NEXT: - pdb SYMS-NEXT: - {{.*}}pdb-linker-module{{.*}}pdb SYMS-NEXT: - cmd -SYMS-NEXT: - /debug /pdb:{{.*}}pdb-linker-module{{.*}}pdb /nodefaultlib /entry:main {{.*}}pdb-diff.obj +SYMS-NEXT: - /debug /pdb:{{.*}}pdb-linker-module{{.*}}pdb /nodefaultlib /entry:main "/manifestuac:level='asInvoker' uiAccess='false'" {{.*}}pdb-diff.obj