Index: llvm/include/llvm/Support/GraphWriter.h =================================================================== --- llvm/include/llvm/Support/GraphWriter.h +++ llvm/include/llvm/Support/GraphWriter.h @@ -330,11 +330,8 @@ const Twine &Title = "", std::string Filename = "") { int FD; - // Windows can't always handle long paths, so limit the length of the name. - std::string N = Name.str(); - N = N.substr(0, std::min(N.size(), 140)); if (Filename.empty()) { - Filename = createGraphFilename(N, FD); + Filename = createGraphFilename(Name.str(), FD); } else { std::error_code EC = sys::fs::openFileForWrite(Filename, FD); Index: llvm/lib/Support/GraphWriter.cpp =================================================================== --- llvm/lib/Support/GraphWriter.cpp +++ llvm/lib/Support/GraphWriter.cpp @@ -76,10 +76,35 @@ return Colors[ColorNumber % NumColors]; } +static std::string replaceIllegalFilenameChars(std::string Filename, + const char ReplacementChar) { +#ifdef _WIN32 + std::string IllegalChars = "\\/:?\"<>|"; +#else + std::string IllegalChars = "/"; +#endif + + for (std::string::iterator It = IllegalChars.begin(); It < IllegalChars.end(); + ++It) { + std::replace(Filename.begin(), Filename.end(), *It, ReplacementChar); + } + + return Filename; +} + std::string llvm::createGraphFilename(const Twine &Name, int &FD) { FD = -1; SmallString<128> Filename; - std::error_code EC = sys::fs::createTemporaryFile(Name, "dot", FD, Filename); + + // Windows can't always handle long paths, so limit the length of the name. + std::string N = Name.str(); + N = N.substr(0, std::min(N.size(), 140)); + + // Replace illegal characters in graph Filename with '_' if needed + std::string CleansedName = replaceIllegalFilenameChars(N, '_'); + + std::error_code EC = + sys::fs::createTemporaryFile(CleansedName, "dot", FD, Filename); if (EC) { errs() << "Error: " << EC.message() << "\n"; return "";