aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm/lib/Support/GraphWriter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/lib/Support/GraphWriter.cpp')
-rw-r--r--contrib/llvm/lib/Support/GraphWriter.cpp74
1 files changed, 50 insertions, 24 deletions
diff --git a/contrib/llvm/lib/Support/GraphWriter.cpp b/contrib/llvm/lib/Support/GraphWriter.cpp
index a9b022041468..d0e1d50e8ccb 100644
--- a/contrib/llvm/lib/Support/GraphWriter.cpp
+++ b/contrib/llvm/lib/Support/GraphWriter.cpp
@@ -103,7 +103,7 @@ struct GraphSession {
bool TryFindProgram(StringRef Names, std::string &ProgramPath) {
raw_string_ostream Log(LogBuffer);
SmallVector<StringRef, 8> parts;
- Names.split(parts, "|");
+ Names.split(parts, '|');
for (auto Name : parts) {
if (ErrorOr<std::string> P = sys::findProgramByName(Name)) {
ProgramPath = *P;
@@ -189,61 +189,87 @@ bool llvm::DisplayGraph(StringRef FilenameRef, bool wait,
return ExecGraphViewer(ViewerPath, args, Filename, wait, ErrMsg);
}
- enum PSViewerKind { PSV_None, PSV_OSXOpen, PSV_XDGOpen, PSV_Ghostview };
- PSViewerKind PSViewer = PSV_None;
+ enum ViewerKind {
+ VK_None,
+ VK_OSXOpen,
+ VK_XDGOpen,
+ VK_Ghostview,
+ VK_CmdStart
+ };
+ ViewerKind Viewer = VK_None;
#ifdef __APPLE__
- if (!PSViewer && S.TryFindProgram("open", ViewerPath))
- PSViewer = PSV_OSXOpen;
+ if (!Viewer && S.TryFindProgram("open", ViewerPath))
+ Viewer = VK_OSXOpen;
+#endif
+ if (!Viewer && S.TryFindProgram("gv", ViewerPath))
+ Viewer = VK_Ghostview;
+ if (!Viewer && S.TryFindProgram("xdg-open", ViewerPath))
+ Viewer = VK_XDGOpen;
+#ifdef LLVM_ON_WIN32
+ if (!Viewer && S.TryFindProgram("cmd", ViewerPath)) {
+ Viewer = VK_CmdStart;
+ }
#endif
- if (!PSViewer && S.TryFindProgram("gv", ViewerPath))
- PSViewer = PSV_Ghostview;
- if (!PSViewer && S.TryFindProgram("xdg-open", ViewerPath))
- PSViewer = PSV_XDGOpen;
- // PostScript graph generator + PostScript viewer
+ // PostScript or PDF graph generator + PostScript/PDF viewer
std::string GeneratorPath;
- if (PSViewer &&
+ if (Viewer &&
(S.TryFindProgram(getProgramName(program), GeneratorPath) ||
S.TryFindProgram("dot|fdp|neato|twopi|circo", GeneratorPath))) {
- std::string PSFilename = Filename + ".ps";
+ std::string OutputFilename =
+ Filename + (Viewer == VK_CmdStart ? ".pdf" : ".ps");
std::vector<const char *> args;
args.push_back(GeneratorPath.c_str());
- args.push_back("-Tps");
+ if (Viewer == VK_CmdStart)
+ args.push_back("-Tpdf");
+ else
+ args.push_back("-Tps");
args.push_back("-Nfontname=Courier");
args.push_back("-Gsize=7.5,10");
args.push_back(Filename.c_str());
args.push_back("-o");
- args.push_back(PSFilename.c_str());
+ args.push_back(OutputFilename.c_str());
args.push_back(nullptr);
errs() << "Running '" << GeneratorPath << "' program... ";
- if (ExecGraphViewer(GeneratorPath, args, Filename, wait, ErrMsg))
+ if (ExecGraphViewer(GeneratorPath, args, Filename, true, ErrMsg))
return true;
+ // The lifetime of StartArg must include the call of ExecGraphViewer
+ // because the args are passed as vector of char*.
+ std::string StartArg;
+
args.clear();
args.push_back(ViewerPath.c_str());
- switch (PSViewer) {
- case PSV_OSXOpen:
+ switch (Viewer) {
+ case VK_OSXOpen:
args.push_back("-W");
- args.push_back(PSFilename.c_str());
+ args.push_back(OutputFilename.c_str());
break;
- case PSV_XDGOpen:
+ case VK_XDGOpen:
wait = false;
- args.push_back(PSFilename.c_str());
+ args.push_back(OutputFilename.c_str());
break;
- case PSV_Ghostview:
+ case VK_Ghostview:
args.push_back("--spartan");
- args.push_back(PSFilename.c_str());
+ args.push_back(OutputFilename.c_str());
+ break;
+ case VK_CmdStart:
+ args.push_back("/S");
+ args.push_back("/C");
+ StartArg =
+ (StringRef("start ") + (wait ? "/WAIT " : "") + OutputFilename).str();
+ args.push_back(StartArg.c_str());
break;
- case PSV_None:
+ case VK_None:
llvm_unreachable("Invalid viewer");
}
args.push_back(nullptr);
ErrMsg.clear();
- return ExecGraphViewer(ViewerPath, args, PSFilename, wait, ErrMsg);
+ return ExecGraphViewer(ViewerPath, args, OutputFilename, wait, ErrMsg);
}
// dotty